Monthly Archives: 二月 2017

二月 28th, 2017

首先,这里讲的服务器环境(lnmp)是指 linux + nginx + php(php-cgi + php-fpm)+ mysql。

 

502 Bad Gateway是lnmp下出现得最频繁的问题,其原因也有很多,以下是我收集的问题原因及其解决方法。

 

1. php进程死亡

此原因的问题表现为:每次动态(php)请求都出现502错误

解决方法:启动php即可 “service php-fpm start ”,或者 “php安装路径/php/sbin/php-fpm start”

 

2. php-cgi进程数不足

此原因的问题表现为:动态请求有时出现502错误,一般没问题,这是并发高时php-cgi进程数不够用的表现

解决方法:修改php-fpm配置php-fpm.conf,将 <value name=”max_children”>60</value> 中的数加大,max_children数的设置不仅取决于服务器硬件配置,而且和php程序的复杂度有关,一般4G内存可以设置到120-200。修改后把php-fpm reload下;必要时是再修改nginx配置nginx.conf,将 worker_processes 数调到与cpu数相等(worker_processes默认为1)

 

3. php-cgi进程超时

此原因的问题表现为:php进程运行一段时间后出现502错误,这种情况可能是php程序没有加set_time_limit(0),也可能是被php-fpm的设置限定了运行时间,下面讨论第二中情况

解决方法:修改php-fpm配置php-fpm.conf,将<value name=”request_terminate_timeout”>30s</value> 中数字调到更高,调为0s则允许无限时间运行;必要时再修改nginx配置nginx.conf,将fastcgi_connect_timeout、fastcgi_send_timeout、fastcgi_read_timeout参数加大

 

4. 磁盘空间不足

此原因较少,问题表现为:502错误或者无法连接到服务器,无法连接到服务器时nginx也死了

这种情况的判断:启动php-fpm或者nginx的时间较长,但最终启动失败,这大概就是磁盘空间不足了,然后可以用命令查看磁盘占用状况:df -lh ,如果根目录“/”对应的磁盘使用率为100%,那么需要清理磁盘空间

解决方法:删除过大的日志文件,关闭部分服务组件的日志。一般需要检查 /var/log 目录下的日志文件,检查 nginx、php的日志,检查mysql的日志。如果以上目录没有问题,则需一个一个的检查其他目录(优先检查 /usr目录),删除过大的文件。

 

Nginx 502 Bad Gateway的含义是请求的PHP-CGI已经执行,但是由于某种原因(一般是读取资源的问题)没有执行完毕而导致PHP-CGI进程终止。

Nginx 504 Gateway Time-out的含义是所请求的网关没有请求到,简单来说就是没有请求到可以执行的PHP-CGI。

 

解决这两个问题其实是需要综合思考的,一般来说Nginx 502 Bad Gateway和php-fpm.conf的设置有关,而Nginx 504 Gateway Time-out则是与nginx.conf的设置有关。

而正确的设置需要考虑服务器自身的性能和访客的数量等多重因素。

以我目前的服务器为例子CPU是奔四1.5G的,内存1GB,CENTOS的系统,访客大概是50人左右同时在线。

但是在线的人大都需要请求PHP-CGI进行大量的信息处理,因此我将nginx.conf设置为:

fastcgi_connect_timeout 300s;

fastcgi_send_timeout 300s;

fastcgi_read_timeout 300s;

fastcgi_buffer_size 128k;

fastcgi_buffers 8 128k;#8 128

fastcgi_busy_buffers_size 256k;

fastcgi_temp_file_write_size 256k;

fastcgi_intercept_errors on;

这里最主要的设置是前三条,即

fastcgi_connect_timeout 300s;

fastcgi_send_timeout 300s;

fastcgi_read_timeout 300s;

这里规定了PHP-CGI的连接、发送和读取的时间,300秒足够用了,因此我的服务器很少出现504 Gateway Time-out这个错误。最关键的是php-fpm.conf的设置,这个会直接导致502 Bad Gateway和504 Gateway Time-out。

下面我们来仔细分析一下php-fpm.conf几个重要的参数:

php-fpm.conf有两个至关重要的参数,一个是”max_children”,另一个是”request_terminate_timeout”

我的两个设置的值一个是”40″,一个是”900″,但是这个值不是通用的,而是需要自己计算的。

计算的方式如下:

如果你的服务器性能足够好,且宽带资源足够充足,PHP脚本没有系循环或BUG的话你可以直接将”request_terminate_timeout” 设置成0s。0s的含义是让PHP-CGI一直执行下去而没有时间限制。而如果你做不到这一点,也就是说你的PHP-CGI可能出现某个BUG,或者你的宽带不够充足或者其他的原因导致你的PHP-CGI能够假死那么就建议你给”request_terminate_timeout”赋一个值,这个值可以根据你服务器的性能进行设定。一般来说性能越好你可以设置越高,20分钟-30分钟都可以。由于我的服务器PHP脚本需要长时间运行,有的可能会超过10 分钟因此我设置了900秒,这样不会导致PHP-CGI死掉而出现502 Bad gateway这个错误。

 

而”max_children”这个值又是怎么计算出来的呢?这个值原则上是越大越好,php-cgi的进程多了就会处理的很快,排队的请求就会很少。设置”max_children”也需要根据服务器的性能进行设定,一般来说一台服务器正常情况下每一个php-cgi所耗费的内存在20M左右,因此我的”max_children”我设置成40个,20M*40=800M也就是说在峰值的时候所有PHP-CGI所耗内存在800M以内,低于我的有效内存1Gb。而如果我的”max_children”设置的较小,比如5-10个,那么php-cgi就会“很累”,处理速度也很慢,等待的时间也较长。如果长时间没有得到处理的请求就会出现504 Gateway Time-out这个错误,而正在处理的很累的那几个php-cgi如果遇到了问题就会出现502 Bad gateway这个错误。

 

一些运行在Nginx上的网站有时候会出现“502 Bad Gateway”错误,有些时候甚至频繁的出现。以下是从Google搜集整理的一些Nginx 502错误的排查方法,供参考:

Nginx 502错误的原因比较多,是因为在代理模式下后端服务器出现问题引起的。这些错误一般都不是nginx本身的问题,一定要从后端找原因!但nginx把这些出错都揽在自己身上了,着实让nginx的推广者备受置疑,毕竟从字眼上理解,bad gateway?不就是bad nginx吗?让不了解的人看到,会直接把责任推在nginx身上,希望nginx下一个版本会把出错提示写稍微友好一些,至少不会是现在简单的一句 502 Bad Gateway,另外还不忘附上自己的大名。

Nginx 502的触发条件
502错误最通常的出现情况就是后端主机当机。在upstream配置里有这么一项配置:proxy_next_upstream,这个配置指定了 nginx在从一个后端主机取数据遇到何种错误时会转到下一个后端主机,里头写上的就是会出现502的所有情况拉,默认是error timeout。error就是当机、断线之类的,timeout就是读取堵塞超时,比较容易理解。我一般是全写上的:

proxy_next_upstream error timeout invalid_header http_500 http_503;

不过现在可能我要去掉http_500这一项了,http_500指定后端返回500错误时会转一个主机,后端的jsp出错的话,本来会打印一堆 stacktrace的错误信息,现在被502取代了。但公司的程序员可不这么认为,他们认定是nginx出现了错误,我实在没空跟他们解释502的原理 了……

503错误就可以保留,因为后端通常是apache resin,如果apache死机就是error,但resin死机,仅仅是503,所以还是有必要保留的。

解决办法

遇到502问题,可以优先考虑按照以下两个步骤去解决。

1、查看当前的PHP FastCGI进程数是否够用:

netstat -anpo | grep “php-cgi” | wc -l

如果实际使用的“FastCGI进程数”接近预设的“FastCGI进程数”,那么,说明“FastCGI进程数”不够用,需要增大。

2、部分PHP程序的执行时间超过了Nginx的等待时间,可以适当增加nginx.conf配置文件中FastCGI的timeout时间,例如:

……http{……fastcgi_connect_timeout 300;fastcgi_send_timeout 300;fastcgi_read_timeout 300;……}……

php.ini中memory_limit设低了会出错,修改了php.ini的memory_limit为64M,重启nginx,发现好了,原来是PHP的内存不足了。

如果这样修改了还解决不了问题,可以参考下面这些方案:

一、max-children和max-requests

一台服务器上运行着nginx php(fpm) xcache,访问量日均 300W pv左右

最近经常会出现这样的情况: php页面打开很慢,cpu使用率突然降至很低,系统负载突然升至很高,查看网卡的流量,也会发现突然降到了很低。这种情况只持续数秒钟就恢复了

检查php-fpm的日志文件发现了一些线索

Sep 30 08:32:23.289973 [NOTICE] fpm_unix_init_main(), line 271: getrlimit(nofile): max:51200, cur:51200Sep 30 08:32:23.290212 [NOTICE] fpm_sockets_init_main(), line 371: using inherited socket fd=10, “127.0.0.1:9000″Sep 30 08:32:23.290342 [NOTICE] fpm_event_init_main(), line 109: libevent: using epollSep 30 08:32:23.296426 [NOTICE] fpm_init(), line 47: fpm is running, pid 30587

在这几句的前面,是1000多行的关闭children和开启children的日志

原来,php-fpm有一个参数 max_requests,该参数指明了,每个children最多处理多少个请求后便会被关闭,默认的设置是500。因为php是把请求轮询给每个 children,在大流量下,每个childre到达max_requests所用的时间都差不多,这样就造成所有的children基本上在同一时间 被关闭。

在这期间,nginx无法将php文件转交给php-fpm处理,所以cpu会降至很低(不用处理php,更不用执行sql),而负载会升至很高(关闭和开启children、nginx等待php-fpm),网卡流量也降至很低(nginx无法生成数据传输给客户端)

解决问题很简单,增加children的数量,并且将 max_requests 设置未 0 或者一个比较大的值:

打开 /usr/local/php/etc/php-fpm.conf

调大以下两个参数(根据服务器实际情况,过大也不行)

<value name=”max_children”>5120</value><value name=”max_requests”>600</value>

然后重启php-fpm。

二、增加缓冲区容量大小

将nginx的error log打开,发现“pstream sent too big header while reading response header from upstream”这样的错误提示。查阅了一下资料,大意是nginx缓冲区有一个bug造成的,我们网站的页面消耗占用缓冲区可能过大。参考老外写的修 改办法增加了缓冲区容量大小设置,502问题彻底解决。后来系统管理员又对参数做了调整只保留了2个设置参数:client head buffer,fastcgi buffer size。

三、request_terminate_timeout

如果主要是在一些post或者数据库操作的时候出现502这种情况,而不是在静态页面操作中常见,那么可以查看一下php-fpm.conf设置中的一项:

request_terminate_timeout

这个值是max_execution_time,就是fast-cgi的执行脚本时间。

0s

0s为关闭,就是无限执行下去。(当时装的时候没仔细看就改了一个数字)

发现,问题解决了,执行很长时间也不会出错了。

优化fastcgi中,还可以改改这个值5s 看看效果。

php-cgi进程数不够用、php执行时间长、或者是php-cgi进程死掉,都会出现502错误。

 

 

原文链接:http://www.centoscn.com/CentosBug/softbug/2017/0228/8555.html

二月 28th, 2017

系统是CentOS7-1604-mini最小化安装版
1.安装依赖以及删除mariadb的lib库默认是自带的

yum install -y wget libaio
yum remove  mariadb*

2.下载MySQL RPM包

cd /tmp/ && wget -c http://downloads.mysql.com/archives/get/file/MySQL-5.6.28-1.linux_glibc2.5.x86_64.rpm-bundle.tar

3.解压tar包

cd /tmp/ && tar -xvf MySQL-5.6.28-1.linux_glibc2.5.x86_64.rpm-bundle.tar 
rm -rf /tmp/MySQL-5.6.28-1.linux_glibc2.5.x86_64.rpm-bundle.tar

4.安装相关的软件

cd /tmp/ && rpm -ivh MySQL*

5.启动

systemctl enable mysql #开机自启动
systemctl start mysql  #启动mysql

6.修改密码mysql在安装的时候,为了安全默认会生成随机密码位置在 /root/.mysql_secret  如下面的文件

[root@izltf35j605nncz user]# cat /root/.mysql_secret
# The random password set for the root user at Sat Feb 25 14:50:11 2017 (local time): TjMBpQi0UeNWjUev

7.修改密码  修改密码有几种方式  首先查看原有的配置  mysql> select host,user,password from mysql.user;

host user password
localhost root *4F5D16242740A35AC75396074A16FCA85E733DDE
izltf35j605nncz root *4F5D16242740A35AC75396074A16FCA85E733DDE
127.0.0.1 root *4F5D16242740A35AC75396074A16FCA85E733DDE
% sakila *94099046963A7BE31E0443DC095E0657EB47EA94
% test *A1774F61D244D786BB7AF496A710B809508AE6B2
% root *A1774F61D244D786BB7AF496A710B809508AE6B2

6 rows in set (0.00 sec)

1.使用set password for ‘用户名’@’主机名’=password(‘密码’);

set password for 'root'@'localhost'=password('123456')

mysql> select host,user,password from mysql.user;

host user password
localhost root *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9
izltf35j605nncz root *4F5D16242740A35AC75396074A16FCA85E733DDE
127.0.0.1 root *4F5D16242740A35AC75396074A16FCA85E733DDE
% sakila *94099046963A7BE31E0443DC095E0657EB47EA94
% test *A1774F61D244D786BB7AF496A710B809508AE6B2
% root *A1774F61D244D786BB7AF496A710B809508AE6B2

6 rows in set (0.00 sec)

2.使用update修改 update mysql.user set password=password(‘123456’) where user=’root’;

update mysql.user set password=password('123456') where user='root';

mysql> select host,user,password from mysql.user;

host user password
localhost root *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9
izltf35j605nncz root *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9
127.0.0.1 root *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9
% sakila *94099046963A7BE31E0443DC095E0657EB47EA94
% test *A1774F61D244D786BB7AF496A710B809508AE6B2
% root *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9

6 rows in set (0.00 sec)

3.使用grant all privileges on sakila.* to ‘sakila’@’%’ identified by ‘123456’;修改.设置远程访问

grant all privileges on sakila.* to 'sakila'@'%' identified by '123456';

mysql> select host,user,password from mysql.user;

host user password
localhost root *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9
izltf35j605nncz root *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9
127.0.0.1 root *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9
% sakila *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9
% test *A1774F61D244D786BB7AF496A710B809508AE6B2
% root *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9

6 rows in set (0.00 sec)

注意:初次安装设置密码时候一定要使用update修改密码,更改root密码。这样使用localhost或者127.0.0.1时候密码都一样。否则很有可能不一样,导致不能使用,如果数据库服务器和web等在一个服务器的时候,尽量使用localhost。在linux下mysql使用localhost的时候使用的是unix套接字,而其他使用的是tcp/ip协议。

 

 

原文链接:http://www.centoscn.com/mysql/2017/0228/8553.html

二月 28th, 2017

使用MSSQL的站长朋友都会被MSSQL数据库吃内存的能力佩服得五体投地,一个小小的网站,运行若干天之后,MSSQL就会把服务器上所有的内存都吃光,此时你不得不重新启动一下服务器或MSSQL来释放内存,有人认为是MSSQL有内存泄露问题,其实不然,微软给我们了明确说明:

在您启动 SQL Server 之后,SQL Server 内存使用量将会持续稳定上升,即使当服务器上活动很少时也不会下降。另外,任务管理器和性能监视器将显示计算机上可用的物理内存稳定下降,直到可用内存降到 4 至 10 MB 为止。

仅仅出现这种状态不表示内存泄漏。此行为是正常的,并且是 SQL Server 缓冲池的预期行为。

默认情况下,SQL Server 根据操作系统报告的物理内存加载动态增大和收缩其缓冲池(缓存)的大小。只要有足够的内存可用于防止内存页面交换(在 4 至 10 MB 之间),SQL Server 缓冲池就会继续增大。像在与 SQL Server 分配内存位于相同计算机上的其他进程一样,SQL Server 缓冲区管理器将在需要的时候释放内存。SQL Server 每秒可以释放和获取几兆字节的内存,从而使它可以快速适应内存分配变化。
更多信息
您可以通过服务器内存最小值和服务器内存最大值配置选项设置 SQL Server 数据库引擎使用的内存(缓冲池)量的上下限。在设置服务器内存最小值和服务器内存最大值选项之前,请查阅以下 Microsoft 知识库文章中标题为”内存”一节中的参考信息:
319942 HOW TO:Determine Proper SQL Server Configuration Settings(确定正确的 SQL Server 配置设置)
请注意,服务器内存最大值选项只限制 SQL Server 缓冲池的大小。服务器内存最大值选项不限制剩余的未保留内存区域,SQL Server 准备将该区域分配给其他组件,例如扩展存储过程、COM 对象、以及非共享 DLL、EXE 和 MAPI 组件。由于前面的分配,SQL Server 专用字节超过服务器内存最大值配置是很正常的。有关此未保留内存区域中分配的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
316749 PRB:在使用大量数据库时可能没有足够的虚拟内存
参考
SQL Server 联机图书;主题:”服务器内存最小值和最大值的影响”;”内存体系结构”;”服务器内存选项”;”SQL Server 内存池”

下面我们就来实战如何限制MSSQL内存使用:

第一步:打开企业管理双击进入要修改的MSSQL.

第二步:在左侧MSSQL上点击右键,选择属性,弹出SQL Server属性(配置)对话框

11

第三步:点击内存选项卡.

22

在这里,你会看到MSSQL默认设置为使用最大内存,也就是你所有的内存,根据你的需要,设置它的最大值吧.

第五步:设置完毕,关闭MSSQL服务再重启,配置即可生效!

TAGS:
二月 28th, 2017

Yum是一个在CentOS上安装,删除和更新软件包的强大工具。众所周知的是,YUM 在您的专用服务器或桌面计算机上采用最快镜像下载并安装软件包。

有时你和缓存在YUM 之间的镜像的连接速度慢,软件包的下载速度非常慢。

为加快YUM,你可以在你的专用服务器重置YUM的最快镜像,并让它选择一个新快速镜像下载软件包。

要在YUM上执行此速度加快,你应该运行如下命令到你的SSH控制台。此命令将删除你目前最快镜像的缓存文件,当你运行YUM时,它将自动为自己选择一个新的镜像。

rm-f /var/cache/yum/timedhosts.txt

你现在可以很快地安装软件包…

yum -y update all(更新所有)
yum -y install PACKAGE_NAME(软件包-名称)

TAGS: ,
二月 28th, 2017

为了方便把安装Zabbix的过程整理成自动化一键部署脚本,有兴趣可以参考,都是些基本的命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#!/bin/bash
#Zabbix 一键部署脚本
#安装zabbix3.0.4,依赖php-5.6.25
src_home=`pwd`
echo -n "正在配置iptables防火墙……"
/etc/init.d/iptables save >> /dev/null
chkconfig iptables off
if [ $? -eq 0 ];then
echo -n "Iptables防火墙初始化完毕!"
fi
echo -n "正在关闭SELinux……"
setenforce 0 > /dev/null 2>&1
sed -i '/^SELINUX=/s/=.*/=disabled/' /etc/selinux/config
if [ $? -eq 0 ];then
echo -n "SELinux初始化完毕!"
fi
echo -n "正在安装nginx yum 源……"
yum -y install wget
wget http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
rpm -ivh nginx-release-centos-6-0.el6.ngx.noarch.rpm
if [ $? -eq 0 ];then
echo -n "Nginx yum 源 初始化完毕!"
fi
echo -n "正在安装epel-release yum 源……"
rpm -Uvh http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
if [ $? -eq 0 ];then
echo -n "epel-release yum 源 初始化完毕!"
fi
echo -n "正在安装php-5.6.25的编译所需相关软件……"
yum -y install make gcc nginx libmcrypt php-mcrypt mysql-server mysql-devel net-snmp-devel libcurl-devel php php-mysql php-bcmath php-mbstring php-gd php-xml bzip2-devel libmcrypt-devel libxml2-devel gd gd-devel libcurl*
if [ $? -eq 0 ];then
echo -n "php-5.6.25依赖初始化完毕!"
fi
echo -n "正在添加zabbix用户……"
useradd -M -s /sbin/nologin zabbix && echo "OK"
echo -n "正在启动mysqld服务……"
service mysqld start
if [ $? -eq 0 ];then
echo -n "Mysql启动完毕!"
fi
#echo -n "正在为mysql的root用户设置密码……"
#mysql_user_root_password="password"
#mysql_user_zabbix_password="zabbix"
#mysqladmin -uroot -p password $mysql_user_root_password
echo "正在执行mysql语句,创建zabbix数据库,授权zabbix访问数据库"
mysql -e "create database zabbix character set utf8;grant all privileges on zabbix.* to zabbix@'%' identified by 'zabbix';grant all privileges on zabbix.* to zabbix@'127.0.0.1' identified by 'zabbix';grant all privileges on zabbix.* to zabbix@localhost identified by 'zabbix';flush privileges;"
#echo "正在执行mysql语句,创建zabbix数据库,授权zabbix访问数据库"
#mysql -uroot -p"$mysql_user_root_password" -e "create database zabbix character set utf8" && echo "创建zabbix数据库完成"
#mysql -uroot -p"$mysql_user_root_password" -e "grant all privileges on zabbix.* to zabbix@localhost identified by '$mysql_user_zabbix_password'" && echo "授权zabbix本地登录数据库"
#mysql -uroot -p"$mysql_user_root_password" -e "grant all privileges on zabbix.* to zabbix@'%' identified by '$mysql_user_zabbix_password'" && echo "授权任何主机本地登录数据库"
#zabbix一键部署第三方软件包的解压目录
echo -n "编译安装php-5.6.25....可能需要几分钟"
tar zxf ${src_homie}/php-5.6.25.tar.gz
cd ${src_home}/php-5.6.25 && ./configure --prefix=/usr/local/php --with-config-file-path=/etc --enable-fpm --with-libxml-dir --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-iconv-dir --with-zlib-dir --with-mcrypt --enable-soap --enable-gd-native-ttf --enable-mbstring --enable-exif --with-pear --with-curl --enable-bcmath --with-gettext --with-mysqli --enable-sockets
cd ${src_home}/php-5.6.25 && make -j 4 && make install
cd
echo -n "正在配置启动php-fpm....请稍等"
/bin/cp ${src_home}/php-5.6.25/php.ini-production /etc/php.ini
cp ${src_home}/php-5.6.25/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
chmod 777 /etc/init.d/php-fpm
cd /usr/local/php/etc/ && cp php-fpm.conf.default php-fpm.conf
cd
service php-fpm start
if [ $? -eq 0 ];then
echo -n "php-fpm启动完毕!"
fi
#zabbix编译安装
echo -n "正在导入zabbix数据到mysql数据库中...."
tar zxf ${src_home}/zabbix-3.0.4.tar.gz
mysql -uzabbix -pzabbix zabbix < ${src_homie}/zabbix-3.0.4/database/mysql/schema.sql
mysql -uzabbix -pzabbix zabbix < ${src_homie}/zabbix-3.0.4/database/mysql/images.sql
mysql -uzabbix -pzabbix zabbix < ${src_homie}/zabbix-3.0.4/database/mysql/data.sql
if [ $? -eq 0 ];then
echo -n "zabbix数据导入启动完毕!"
fi
echo -n "正在安装zabbix编译依赖软件包....可能需要几分钟"
yum -y install net-snmp-devel curl-devel javacc java-1.8*
echo -n "编译安装Zabbix-server....可能需要几分钟"
cd ${src_home}/zabbix-3.0.4 && ./configure --prefix=/usr/local/zabbix --enable-server --enable-proxy --enable-agent --with-net-snmp --with-libcurl --enable-java --with-mysql
make -j 4 && make install
echo -n "正在制作Zabbix-server启动脚本...."
echo -e "zabbix-agent 10050/tcp #ZabbixAgent\nzabbix-agent 10050/udp #Zabbix Agent\nzabbix-trapper 10051/tcp #ZabbixTrapper\nzabbix-trapper 10051/udp #Zabbix Trapper" >> /etc/services
cp ${src_home}/zabbix-3.0.4/misc/init.d/fedora/core/zabbix_server /etc/init.d/
cp ${src_home}/zabbix-3.0.4/misc/init.d/fedora/core/zabbix_agentd /etc/init.d/
cd
chmod 777 /etc/init.d/zabbix_*
sed -i '/BASEDIR=/s/$/\/zabbix/' /etc/init.d/zabbix_server
sed -i '/BASEDIR=/s/$/\/zabbix/' /etc/init.d/zabbix_agentd
echo -n "正在配置zabbix配置文件...."
cd /usr/local/zabbix/etc
sed '/# DBHost=localhost/a\DBHost=localhost' zabbix_server.conf -i
sed '/# DBPassword=/a\DBPassword=zabbix' zabbix_server.conf -i
sed '/# EnableRemoteCommands=0/a\EnableRemoteCommands=1' zabbix_agentd.conf -i
sed '/# ListenPort=10050/a\ListenPort=10050' zabbix_agentd.conf -i
sed '/# User=zabbix/a\User=zabbix' zabbix_agentd.conf -i
sed '/# AllowRoot=0/a\AllowRoot=1' zabbix_agentd.conf -i
sed '/# UnsafeUserParameters=0/a\UnsafeUserParameters=1' zabbix_agentd.conf -i
if [ $? -eq 0 ];then
echo -n "zabbix配置完毕!"
fi
echo -n "正在启动zabbix_server and zabbix_agent...."
service zabbix_server start
service zabbix_agentd start
chkconfig zabbix_server on
chkconfig zabbix_agentd on
cd
echo -n "正在配置nginx反代zabbix...."
cp -r ${src_home}/zabbix-3.0.4/frontends/php /usr/share/nginx/html/zabbix
cd /etc/nginx/conf.d/ && mv default.conf default.conf.bak
cp ${src_home}/zabbix.conf /etc/nginx/conf.d/
echo -n "配置完成,正在启动nginx web server...."
service nginx start
if [ $? -eq 0 ];then
echo -n "Nginx启动完毕!"
fi
echo -n "正在进行最后的zabbix Install ,php参数修改....."
sed '/^post_max_size =/s/=.*/= 16M/' /etc/php.ini -i
sed '/^max_execution_time =/s/=.*/= 300/' /etc/php.ini -i
sed '/^max_input_time =/s/=.*/= 300/' /etc/php.ini -i
sed -i '/^;date.timezone/a\date.timezone = Asia/Shanghai' /etc/php.ini
sed -i '/^;always_populate_raw_post_data.*/a\always_populate_raw_post_data = -1' /etc/php.ini
sed -i '/^mysqli.default_socket =/s/=.*/= \/var\/lib\/mysql\/mysql.sock/' /etc/php.ini
echo -n "正在重新启动php服务....."
/etc/init.d/php-fpm restart
echo -n "正在初始化zabbix Server...."
cp ${src_home}/zabbix.conf.php /usr/share/nginx/html/zabbix/conf/
echo -n "正在做最后的Zabbix Server重启....."
/etc/init.d/zabbix_server restart
if [ $? -eq 0 ];then
echo -n "Zabbix Server 启动完毕!"
fi
echo -n "正在解决zabbix server 乱码问题,请你耐心等待....."
cd /usr/share/nginx/html/zabbix/fonts && mv DejaVuSans.ttf DejaVuSans.ttf.bak
cp ${src_home}/msyh.ttf .
cd ../include/ && sed -i 's/DejaVuSans/msyh/g' defines.inc.php
cd
echo -n "恭喜你,Zabbix 部署到此完成,如有问题,请参照脚本单独解决!!!"
echo -e -n "后续的操作:1、通过http://ip/zabbix 访问你的zabbix Web页面,下一步....一直到底。2、你可能需要配置Nginx域名,通过域名访问Zabbix Server.... 3、你需要自己自定义或者使用系统自带模板,添加主机等等...."

脚本跑完没报错,在你的浏览器里输入:http://172.16.2.21/zabbix/ 应该可以看到下面的页面:

51

TAGS: ,
二月 28th, 2017

数据库对于互联网公司来说是一个公司的心脏,没有了它这个公司绝对只是一堆ppt。由此对于一个运维来说数据库绝对是维护的重中之重,每天都要对数据库进行增量备份,每周要进行一次完全备份。常用的备份工具mysqldump这是一个逻辑被分工具那就意味着性能将会被计算消耗一些;extrabackup这是一个物理备份工具,具有较好的性能;还有一种借助lvm进行备份的方法,这种方法的显然不靠谱,因为lvm保存的数据不具有硬件级恢复数据的特性,一旦遇到极端情况,我们只能接受数据丢失。

数据库需要备份什么?1数据,日志;2程序,存储例程;3配置文件。既然要备份这些数据,我们需要了解他们的结构,配置文件好理解也好备份,程序和存储例程的备份也比较好备份只要提供统样的运行环境。

数据备份就很麻烦了,我们需要充分的了解mariadb的运行原理。其中在mariadb存储时使用的是黑盒存储,那就造成一个问题,我们要查看数据库中的数据只有使用mysql客户端。那么我们备份这些数据就有两个方法。一个是逻辑备份,我们把数据反向生成一个mysql客户端产生数据的方法,这个备份会有一个极大的问题,反向生成会很慢,恢复数据也会很慢;另一个是物理备份,我们直接把黑盒数据复制一份,但是这种备份就很麻烦了,备份数据库我们不能把数据库停下来吧,万一来了一个大单数据库停会造成很大的影响。每天都例行对数据库进行维护貌似只有某个交通公司在这么干,作为以用户为中心的公司这么做很有可能会流失客户,备份的特性依赖于存储引擎。

存储引擎

表类型:表级别概念,不建议在同一个库中的表上使用不同的ENGINE;

CREATE TABLE … ENGINE[=]STORAGE_ENGINE_NAME … #定义数据库表使用的存储引擎

SHOW TABLE STATUS #查看存储引擎

常见的存储引擎:

MyISAM, Aria, InnoDB, MRG_MYISAM, CSV, BLACKHOLE, MEMORY, PERFORMANCE_SCHEMA, ARCHIVE, FEDERATED

当前数据库支持的存储引擎

mysql> SHOW ENGINES;

InnoDB:InnoBase

Percona-XtraDB, Supports transactions, row-level locking, and foreign keys

数据存储于“表空间(table space)”中:

(1) 所有InnoDB表的数据和索引存储于同一个表空间中;

表空间文件:datadir定义的目录中

文件:ibdata1, ibdata2, …

(2) innodb_file_per_table=ON,意味着每表使用单独的表空间文件;

数据文件(数据和索引,存储于数据库目录): tbl_name.ibd

表结构的定义:在数据库目录,tbl_name.frm

事务型存储引擎,适合对事务要求较高的场景中;但较适用于处理大量短期事务;

基于MVCC(Mutli Version Concurrency Control)支持高并发;支持四个隔离级别,默认级别为REPEATABLE-READ;间隙锁以防止幻读;

使用聚集索引(主键索引);

支持”自适应Hash索引“;

锁粒度:行级锁;间隙锁;

总结:

数据存储:表空间;

并发:MVCC,间隙锁,行级锁;

事务:REPEATABLE-READ;适用于大量短期事务;

索引:聚集索引、辅助索引;

性能:预读操作、内存数据缓冲、内存索引缓存、自适应Hash索引、插入操作缓存区;

备份:支持热备;

MyISAM:

支持全文索引(FULLTEXT index)、压缩、空间函数(GIS);

不支持事务

锁粒度:表级锁

崩溃无法保证表安全恢复

适用场景:只读或读多写少的场景、较小的表(以保证崩溃后恢复的时间较短);

文件:每个表有三个文件,存储于数据库目录中

tbl_name.frm:表格式定义;

tbl_name.MYD:数据文件;

tbl_name.MYI:索引文件;

特性:

加锁和并发:表级锁;

修复:手动或自动修复、但可能会丢失数据;

索引:非聚集索引;

延迟索引更新;

表压缩;

日志备份

日志备份就很难理解了,mariadb设计时就考虑到数据的完全性,必须保证数据写入成功,那么设计一套记录日志:

访问日志

慢访问日志,访问时间较长的命令

二进制日志,记录导致数据库变化的命令。

中继日志,数据库主从

那么为什么要备份日志,因为我们备份数据后,数据库发生变化那么怎么保证数据的完全性,这里我们可以借助二进制日志,把备份的数据库后变更的操作再次执行一遍,我们就可以恢复数据库的数据了。

逻辑备份恢复数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#首先准备好备份
mysqldump --databases DATABASENAME --single-transaction -R --triggers -E --flush-logs --master-data=2 > /tmp/backup.sql
#然后备份二进制日志,去掉不想执行的语句
mysqlbinlog --stop-position=# /var/lib/mysql/master-log.00000# > /tmp/bin.log
mysql <<eof
#停止记录二进制日志
set @@session.sql_log_bin=OFF;
#恢复备份的数据
source /tmp/backup.sql;
#恢复二进制日志中产生的数据
source /tmp/bin.log;
#开启记录二进制日志
set @@session.sql_log_bin=ON;
eof

物理备份

物理备份我们可以进行全量备份,增量备份,变量备份。在这个地址下载xtrabackup:https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.5/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.5-1.el7.x86_64.rpm

全量备份

1
2
3
innobackupex --user=root --host=localhost --password=aaa /BACKUP/DIR 备份数据库
innobackupex --apply-log /BACKUP/DIR #备份日志
mysqlbinlog --start-position=# --stop-position=# /var/lib/mysql/master-log.00000# > /tmp/bin.log #然后备份二进制日志,去掉不想执行的语句
1
2
3
4
5
6
7
8
9
innobackupex --copy-back /BACKUP/DIR #恢复备份
chown -R mysql.mysql /var/lib/mysql
systemctl start mariadb.service
#恢复二进制日志中产生的数据
mysql <<eof
set @@session.sql_log_bin=OFF;
source /tmp/bin.log;
set @@session.sql_log_bin=ON;
eof

增量备份

1
2
3
innodbbackupex --incremental --user=root --host=localhost --password=aaa incremental-basedir=/BACKUP/DIR
备份合并,把增量备份的数据合并到全量备份里
innodbbackupex --apply-log --redo-only BASE-DIR incremental-basedir=/BACKUP/DIR

主从复制

只进行备份是远远不够的,当mariadb故障的这就需要我们提供高可用集群;数据库的读请求量特别大的时候,我们需要一个服务器分担读请求;写请求也变大,这里不讨论。先说读请求变大我们可以增加服务器,分担压力,一般使用主从,或者使用双主。

主从

使用主从的话,当写节点故障需要我们提供迁移工具常用的mha

主服务器

1
2
3
4
5
vim /etc/my.cnf
innodb_file_per_table=1
skip_name_resolve=1
server_id=#
log_bin=log-bin
1
2
3
启动服务,并授权
mysql> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'USERNAME'@'HOST' IDENTIFIED BY 'YOUR_PASSWORD';
mysql> FLUSH PRIVILEGES;

从服务器

1
2
3
4
5
6
7
8
9
vim /etc/my.cnf
innodb_file_per_table=1
skip_name_resolve=1
server_id=#
relay_log=relay-log
启动服务:
mysql> CHANGE MASTER TO MASTER_HOST='HOST',MASTER_USER='USERNAME',MASTER_PASSWORD='YOUR_PASSWORD',MASTER_LOG_FILE='BINLOG',MASTER_LOG_POS=#;
mysql> START SLAVE [IO_THREAD|SQL_THREAD];
mysql> SHOW SLAVE STATUS;

ssl

配置主服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
创建证书文件
cd /etc/pki/CA/
touch index.txt
echo 01 > serial
(umask 066;openssl genrsa -out private/cakey.pem 2048)
openssl req -new -x509 -key private/cakey.pem -out cacert.pem
(umask 066;openssl genrsa -out mysql.key 2048; )
openssl req -new -key mysql.key -out mysql.csr -days 365
openssl ca -in mysql.csr -out mysql.crt -days 700
(umask 066;openssl genrsa -out client.key 2048; )
openssl req -new -key client.key -out client.csr -days 365
openssl ca -in client.csr -out client.crt -days 700
#复制证书文件,并更改属组属主
cp cacert.pem mysql.crt mysql.key client.key client.crt /etc/mysql/
chown -R mysql.mysql /etc/mysql
#复制秘钥证书,前提需要在slave上创建/etc/mysql目录
scp -p client.key client.crt cacert.pem 172.16.29.10:/etc/mysql
1
2
3
4
5
6
7
8
9
10
11
vim /etc/my.cnf
#在[mysqld]段中添加如下配置
ssl #开启SSL功能
ssl-ca = /etc/mysql/cacert.pem #指定CA文件位置
ssl-cert = /etc/mysql/mysql.crt #指定证书文件位置
ssl-key = /etc/mysql/mysql.key #指定密钥所在位置
#开启服务器
systemctl restart mariadb.service
#授权
mysql
grant replication slave,replication client on *.* to 'tom'@'172.16.%.%' identified by 'tom' require ssl;

slave节点

1
2
3
4
5
6
#在slave上连接
cd /etc/mysql/
mysql --ssl-ca=cacert.pem --ssl-cert=client.crt --ssl-key=client.key -h172.16.29.2 -utom -ptom
#查看连接状态
\s
quit

显示如下一行使用ssl代表成功

spacer.gifwKioL1iy53TAtcisAAAVhobocTc960.png

配置从服务器

1
2
3
4
5
systemctl restart mariadb.service
mysql
change master to master_host='172.16.29.2',master_user='tom',master_password='tom',master_log_file='master-log.000008',master_log_pos=245,master_ssl=1,master_ssl_ca='/etc/mysql/cacert.pem',master_ssl_cert='/etc/mysql/client.crt',master_ssl_key='/etc/mysql/client.key';
start slave;
show slave status\G

如图代表配置成功

spacer.gifwKiom1iy54jhnkXXAABlk3SV_4Y191.png

mha

安装包下载地址https://code.google.com/p/mysql-master-ha/downloads/list

从服务器安装

1
yum install mha4mysql-node-0.54-0.el6.noarch.rpm -y

主服务器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
yum install mha4mysql-node-0.54-0.el6.noarch.rpm mha4mysql-manager-0.55-0.el6.noarch.rpm -y
[root@manager ~]# cat /usr/local/mha/mha.cnf
[server default]
user=mha_rep #MHA管理mysql的用户名
password=123456 #MHA管理mysql的密码
manager_workdir=/usr/local/mha #MHA的工作目录
manager_log=/usr/local/mha/manager.log #MHA的日志路径
ssh_user=root #免秘钥登陆的用户名
repl_user=backup #主从复制账号,用来在主从之间同步数据
repl_password=backup
ping_interval=1 #ping间隔时间,用来检查master是否正常
[server1]
hostname=192.168.253.241
master_binlog_dir=/data/mysql/
candidate_master=1 #master宕机后,优先启用这台作为master
[server2]
hostname=192.168.253.242
master_binlog_dir=/data/mysql/
candidate_master=1
[server3]
hostname=192.168.253.243
master_binlog_dir=/data/mysql/
no_master=1 #设置na_master=1,使服务器不能成为master
#检查ssh是否畅通
masterha_check_ssh --conf=/usr/local/mha/mha.cnf
#运行,这个脚本生效后就自动退出了
nohup masterha_manager --conf=/usr/local/mha/mha.cnf > /tmp/mha_manager.log 2>&1 &

双主

互为主从:两个节点各自都要开启binlog和relay log;

1、数据不一致;

2、自动增长id;

定义一个节点使用奇数id

auto_increment_offset=1

auto_increment_increment=2

另一个节点使用偶数id

auto_increment_offset=2

auto_increment_increment=2

配置:

1、server_id必须要使用不同值;

2、均启用binlog和relay log;

3、存在自动增长id的表,为了使得id不相冲突,需要定义其自动增长方式;

服务启动后执行如下两步:

4、都授权有复制权限的用户账号;

5、各把对方指定为主节点;

复制过滤器

仅复制有限一个或几个数据库相关的数据,而非所有;由复制过滤器进行;

有两种实现思路:

(1) 主服务器

主服务器仅向二进制日志中记录有关特定数据库相关的写操作;

问题:其它库的point-recovery将无从实现;

binlog_do_db=

binlog_ignore_db=

(2) 从服务器

从服务器的SQL THREAD仅重放关注的数据库或表相关的事件,并将其应用于本地;

问题:网络IO和磁盘IO;

Replicate_Do_DB=

Replicate_Ignore_DB=

Replicate_Do_Table=

Replicate_Ignore_Table=

Replicate_Wild_Do_Table=

Replicate_Wild_Ignore_Table=

总结

备份的数据有:数据,日志,配置文件,程序,

怎么备份:逻辑备份,借助lvm备份,物理备份(全量备份,增量备份,变量备份)

高可用:主从,双主,加密通信,复制过滤

TAGS:
二月 28th, 2017

如果你见过一些台式机,那么它们大多是下图这样的。键盘、显示器、机箱可以分开。哪怕机箱和使用者不在一个房间,只要线路连通,还是可以使用电脑的。在早期,机箱和键盘、显示器确实是分开的。

图 1 一种台式机

图 1 一种台式机

在 UNIX 诞生之初,计算机的价格非常昂贵。当时还没有个人计算机,大多数计算机都是大型、昂贵、不稳定的机器,必须存放在湿度和温度可控的环境中。贝尔实验室的 Thompson 开始寻找小并且便宜的计算机。那时大多数计算机需要 100,000 美元,1970 年他和同事们得到了一台 PDP-11,当时需要 10,800 美元。在数个月之内,他们将 UNIX 移植到了这台计算机内。但是 PDP-11 一次只能运行一个程序,于是他们修改了 UNIX 系统,使它能够一次运行多个程序,直到 1973 年这一目标才得以实现。

图 3 PDP-11

图 3 PDP-11

从上图中可以看出,PDP-11 机身上有很多按钮,这个操作面板被称为控制台console。控制台与主机紧密结合并且无法远程操作,很多操作需要通过控制台完成(比如启动过程中遇到的问题),因为只用当主机启动并且网络连接正常后才能连接终端。由于大型计算机的价格十分昂贵,Thompson 和他的同事们希望 UNIX 能够称为一个多任务(即同时运行多个程序)、多用户系统。在那个年代,计算机还没有独立的键盘,而且由于其昂贵的价格,无法每人都拥有一台计算机。

Thompson 决定使用一种便宜的电传打字机:Teletype直到如今,Linux 和 UNIX 系统中的文本输入输出环境仍然简写为 tty(TeleTYpe)。Teletype 相当原始,除了电源外,一切都是机械的。

图 4 Teletype 33-ASR

图 4 Teletype 33-ASR

下面这样设想一下,如果好多个用户都各自有一台自己的 Teletype,而“机房”(当时叫“玻璃屋”,因为当时很多公司通过玻璃墙来展示昂贵的大型计算机)中有一台昂贵的大型计算机 PDP-11,这台计算机上运行着可以多用户登录的 UNIX,这样,每个用户都可以通过使用便宜(相对于大型计算机)的 Teletype 来访问大型计算机,相当于每个用户都通过便宜的价格拥有了一台计算机。是的,当时 Thompson 也是这样想的,并且最终实现。这种想法至今都有大量的应用,比如服务器和终端的关系等。

大型计算机 PDP-11 被叫做主机host,而用户的 Teletype 也被叫做终端terminal(原指电线的末端)。因为主机和终端是分开的,所以不管是更换主机,还是用户更换终端都是互相独立的,主机和终端可以随着科技浪潮一直发展下去。粗略的说:计算机=主机+终端;终端=输入设备+输出设备。在这个例子中,计算机=PDP-11+电传打字机;而 Teletype=输入设备(键盘)+输出设备(纸)。

下来考虑这样一种情况,如果有多台主机放在机房里,同时有多台终端使用这些主机,那么怎么连接他们呢?这就要用到终端服务器了。终端服务器连接主机和终端,只用用户输入需要访问的主机,终端服务器就会建立他们之间的连接。如下图。

图 5 终端服务器

图 5 终端服务器

以上,就是 Linux 中主机、控制台和终端的由来。

TAGS: ,
二月 28th, 2017

最近发生很多事情,看似具有偶然性,加一起就开始出现了必然性。比如三十五岁的华为下岗男,就引发了一股80后的中年危机,而一毛钱股票也没拿到的技术男,则也让把分红花完的媳妇感到了深深的经济压力感。前者已经承认,自己也就能找个月薪2万左右的工作,后者大概也是如此。当几十万的收入和几百万的分红没有之后,似乎前途也跟着一起消失了,80后的中年危机比以往的人们来的更早一些。有一部非常经典的电影《肖申克的救赎》,基本都是推荐必看的,其实我对里面最感兴趣的人物却是一个配角,就是那个图书管理员,他是个好人,在监狱干了一辈子,后来出狱了,却没有办法适应社会,反而自杀了。这就叫做体制化。

所以,日本的公司大都是终身聘用的,社会比较稳定,就不要折腾来去。日本百年企业都有两万多个,甚至还有两个千年企业真是TM吓死人了。中国企业本来有这么一个好传统铁饭碗,后来为了发展被打破了,大家还以为是好事呢,也确实发展快了,不过到了今天,就发展成了差不多35岁你就人到中年了。

如果招一个小朋友,一个人吃饱了全家不饿,性价比高的不得了。一个薪水七万的人真比一个七千的多干十倍么?如果是这样的话,他下一份工作也能拿到七万。如果不是这样的话,前一份工资就是你的运气了。如果前面给你这么高工资的人还是一个体制化的企业,那么很悲剧的事情就来了,你离开体制之后,不但拿不到七万了,很有可能就只能拿两万。

其实中国人存钱是有道理的,变化这么巨大的社会,总要有点保障。所以我一直奉劝很多人,同时也告诫我自己,不要觉得你赚的钱都是你应该赚的,可能是你现在多赚的,以后没准就赚不到了。

所以有钱后也要节俭一点,2013年有两百万不去买学区房,去买奔驰和香奈儿,你可以说是个人选择,那么下场自然也是个人活该。时代机遇就是有两个人去年赚了一千万,个人选择就是有人买了套一千万的房子涨到了两千万,另一个则买了豪车和奢侈品。

既然到了中年危机,自然就需要心理疏导,之前下岗危机的时候,刘欢老师告诉大家,大不了重头再来。那时候的人起码也要四十多岁,而且也经历过大风大浪,还能够拼搏一把。可80后基本也就比90后坚强一点,30多岁基本还没断奶,你让他重头再来心里总是有点慌的,于是我们就看到了知识经济。

知识经济是个很有意思的事情,当年上学的时候花了那么多钱都不好好上课,现在突然开始想起付费听讲了。当年要是不上大学,把学费都买成海南黄花梨资产早就过亿了。现在开始听课,难道不晚了么?当然,对于讲课的人来说,还是很有机遇的,很多没啥钱的人通过给别人讲怎么财务自由实现了财务自由,毛都没长全的就跟人家讲时间管理,结构化思想,老年规划。最厉害的还是《拆掉思维的墙》的古典老师,在2010年劝大家别买房子投资自己之后,听说现在还在得到专栏里面分享《心理坚韧》,真是太TM适合当年看他书的读者了。所以我把知识经济称之为loser安慰经济,或者说的好听点,80后中年危机心理疏导。

其实大家想听的也没有啥知识,大多都是你第一个一百万是怎么赚的啊,现在该买哪个地区的房子啊,还有什么赚钱机会啊,最近可以买什么股票啊,能火的基本都是这样的。股评老师的付费订阅年入早就好几千万了,TMD有这个收入谁还炒股啊。

写这篇文章我还是感同身受的,今年就步入三十五了,基本也中年危机了。手里创的业,含着泪也要走到底,不然难道去打工么?好吧,就算去打工,有多少人会要你呢?上一次年薪百万加股票还不去上班,如果去和00后们拼也实在是不好意思。我觉得好在我没有在二十多岁的时候达到自己的人生巅峰,几个90后早就赚到千万的合伙人,现在心里也毛的很。

人生还是慢慢的到达顶峰比较好,起码一直有个奔头,一下子抓到时代机遇这批人,想保持个三年都成问题,更不用说五年十年了,就算把账号卖个一两亿,难道就自由了么?王建林还五点起床呢。

80后赶上了这个时代的巨变,在没有什么参考和体制保障的情况下,还是要蒙着头继续走的,“未来会怎样,有谁会知道,幸福就像一种传说,我怎么都找不到。”这首歌现在才听懂,原来是当年赵传唱给中年危机的人听的。

二月 27th, 2017

当我们在linux环境下对文本进行编辑的时候,我一般用vi这个命令,有时候我发现,还存在一个vim的命令,似乎在功能上与vi差不多,但是具体区别我也不太清楚。所以在网上看了资料。

vim的这些优势主要体现在以下几个方面:
1、多级撤消
我们知道在vi里,按 u只能撤消上次命令,而在vim里可以无限制的撤消。

2、易用性

vi只能运行于unix中,而vim不仅可以运行于unix,windows ,mac等多操作平台。

3、语法加亮
vim可以用不同的颜色来加亮你的代码。

4、可视化操作
就是说vim不仅可以在终端运行,也可以运行于x window、 mac os、 windows。

5、对vi的完全兼容
某些情况下,你可以把vim当成vi来使用。

vi和vim都是Linux中的编辑器,不同的是vim比较高级,可以视为vi的升级版本。vi使用于文本编辑,但是vim更适用于coding。

vi有3个模式:插入模式、命令模式、低行模式。

插入模式:在此模式下可以输入字符,按ESC将回到命令模式。
命令模式:可以移动光标、删除字符等。
低行模式:可以保存文件、退出vi、设置vi、查找等功能(低行模式也可以看作是命令模式里的)。

一、打开文件、保存、关闭文件(vi命令模式下使用)

vi filename       //打开filename文件
:w       //保存文件
:w vpser.net //保存至vpser.net文件
:q          //退出编辑器,如果文件已修改请使用下面的命令
:q!        //退出编辑器,且不保存
:wq         //退出编辑器,且保存文件

 

二、插入文本或行(vi命令模式下使用,执行下面命令后将进入插入模式,按ESC键可退出插入模式)

a      //在当前光标位置的右边添加文本
i       //在当前光标位置的左边添加文本
A     //在当前行的末尾位置添加文本
I      //在当前行的开始处添加文本(非空字符的行首)
O     //在当前行的上面新建一行
o     //在当前行的下面新建一行
R    //替换(覆盖)当前光标位置及后面的若干文本
J    //合并光标所在行及下一行为一行(依然在命令模式)

 

二月 27th, 2017
创建 PwdGuessDefense.sh 放到 /script/下面, define=10 这个 可以改 ,如果IP错误登录次数达到这个值 就会被永久拦截
—————————————————————————————————————————–
#!/bin/bash
# Guess Password defense SHELL SCRIPT
#2013-6-24
cat /var/log/secure|awk ‘/Failed/{print $(NF-3)}’|sort|uniq -c|awk ‘{print $2″=” $1;}’ >/script/Denyhosts.txt
DEFINE=”10″
for i in `cat /script/Denyhosts.txt`
do
        IP=`echo $i|awk -F= ‘{print $1}’`
        NUM=`echo $i|awk -F= ‘{print $2}’`
        if [ $NUM -gt $DEFINE ]
        then
                grep $IP /etc/hosts.deny >/dev/null
                if [ $? -gt 0 ];
                then
                echo “sshd:$IP” >> /etc/hosts.deny
                fi
        fi
done
———————————————————————————————————————————-
设置定期运行,每隔5分钟
crontab -e
*/5 * * * * /script/PwdGuessDefense.sh