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攻击,结合警告提醒,能最大程度低缩短危机处理的响应时间。