0x01 前言
nginx作为网站服务器的重要组成部分,对它的状态进行监控是十分必要的。监控的数据还可以为后期分析提供基础,能根据数据统计nginx的性能、瓶颈等等。
0x02 nginx
既然是用zabbix监控nginx,那么需要准备zabbix服务。在这里我通过zabbix agent获取相关的数据,而nginx则需要开启stub_status。
首先配置nginx,新建一个虚拟空间并写入以下内容:
[root@web-t1 ~]# cat /usr/local/nginx/conf.d/web-t1.t.com.ngx.conf server { #监听80端口 listen 80; #指定域名 server_name web-t1.t.com; location /nginx_status { #开启stub_status stub_status on; #关闭访问日志 access_log off; #允许访问的IP allow 127.0.0.1; #禁止其他IP访问 deny all; } }
然后使用curl在服务器内访问以下地址:
[root@web-t1 ~]# curl http://web-t1.t.com/nginx_status #返还的内容如下 Active connections: 2 server accepts handled requests 737715 737715 1007022 Reading: 0 Writing: 1 Waiting: 1
如果你的服务器返还了403,请将你服务器的IP也添加到白名单中:
allow 10.1.1.111;
返还的内容的解释如下:
- Active connections:当前活动的连接数
- server accepts handled requests:服务器处理的连接数
- 这里有三个数字,分别是:连接数、握手数和请求数
- Reading:成功读取到客户端Header的数量
- Writing:返还给客户端Header的数量
- Waiting:如果服务器开启了keep-alive
- 那么这个数值应该为:active – (reading + writing)
0x03 脚本
zabbix没有数据处理的能力,所以我们需要使用python脚本进行预处理。在这里我使用一个GitHub上面的项目:
把整个项目clone到本地,然后将python脚本放置到适当的位置:
#创建存放目录 [root@web-t1 ~]# mkdir /root/codex/ #进入该目录 [root@web-t1 ~]# cd /root/codex/ #clone项目 [root@web-t1 codex]# git clone https://github.com/vicendominguez/nginx-zabbix-template/archive/master.zip #解压 [root@web-t1 codex]# unzip master.zip #复制到适当位置 [root@web-t1 codex]# cp nginx-zabbix-template-master/getNginxInfo.py /usr/local/shell/
然后通过以下命令测试上面的配置是否有效:
#获取accepted的数值 [root@web-t1 codex]# /usr/local/shell/getNginxInfo.py -h web-t1.t.com -p 80 -a accepted 738079 #获取active的数值 [root@web-t1 codex]# /usr/local/shell/getNginxInfo.py -h web-t1.t.com -p 80 -a active 3 #获取handled的数值 [root@web-t1 codex]# /usr/local/shell/getNginxInfo.py -h web-t1.t.com -p 80 -a handled 738083
0x04 zabbix agent
现在有脚本处理nginx的数据,还得告诉zabbix该如何使用这个脚本。在以下路径中创建文件,并将脚本路径按你的实际情况进行修改:
#新建文件 [root@web-t1 codex]# vim /etc/zabbix/zabbix_agentd.d/zabbix-nginx.conf #填入内容 UserParameter=Nginx.Accepted-Connections,/usr/local/shell/getNginxInfo.py -h web-t1.t.com -p 80 -a accepted UserParameter=Nginx.Active-Connections,/usr/local/shell/getNginxInfo.py -h web-t1.t.com -p 80 -a active UserParameter=Nginx.Handled-Connections,/usr/local/shell/getNginxInfo.py -h web-t1.t.com -p 80 -a handled UserParameter=Nginx.Reading-Connections,/usr/local/shell/getNginxInfo.py -h web-t1.t.com -p 80 -a reading UserParameter=Nginx.Total-Requests,/usr/local/shell/getNginxInfo.py -h web-t1.t.com -p 80 -a requests UserParameter=Nginx.Waiting-Connections,/usr/local/shell/getNginxInfo.py -h web-t1.t.com -p 80 -a waiting UserParameter=Nginx.Writting-Connections,/usr/local/shell/getNginxInfo.py -h web-t1.t.com -p 80 -a writing
完成后需要重新启动zabbix agent:
[root@web-t1 codex]# systemctl restart zabbix-agent.service
0x05 zabbix server
在zabbix服务器端需要导入一个模版,这也能在git项目中找到。进入模版倒入页面:
导入模版:
完成后到HOST配置界面将该模版加到配置里即可:
0x06 查看
一切正常的话,稍等片刻后在Monitoring > Graphs中查看相关图表:
0x07 结语
有了数据和图表,接下来就可以设置警告阀值和邮件提醒了。当拥有大量的数据后,还可以对服务进行相应的调整,可以根据其中的规律增减服务器和带宽等操作。
还有一个很重要的功能就是可以判断是否有DDOS攻击,结合警告提醒,能最大程度低缩短危机处理的响应时间。