web 服务器 nginx 以其高性能与抗并发能力越来越多的被用户使用。Nginx 提供了 ngx_http_stub_status_module
、ngx_http_reqstat_module
模块,这两个模块提供了基本的监控功能。
- 进程监控
- 端口监控
注意: 这两个是必须要加在zabbix监控,加触发器有问题及时告警。
即主要监控对象:
名称 | 描述 | 指标类型 |
---|---|---|
Accepts (接受) | NGINX 所接受的客户端连接数 | 资源: 功能 |
Handled (已处理) | 成功的客户端连接数 | 资源: 功能 |
Dropped (已丢弃,计算得出) | 丢弃的连接数(接受 - 已处理) | 工作:错误* |
Requests (请求数) | 客户端请求数 | 工作:吞吐量 |
通过持续的 QPS 监控,可以立刻发现是否被恶意攻击或对服务的可用性进行评估。虽然当问题发生时,通过 QPS 不能定位到确切问题的位置,但是他却可以在第一时间提醒你环境可能出问题了。
通过监控固定时间间隔内的错误代码(4XX代码表示客户端错误,5XX代码表示服务器端错误),可以了解到客户端收到的结果是否是正确的错误率突然的飙升很可能是你的网站漏洞发出的信号。
如果你希望通过 access log 分析错误率,那么你需要配置 nginx 的日志模块,让 nginx 将响应码写入访问日志。
确保Linux上已安装配置好Nginx,一定要有--with-http_stub_status_module
这个模块,可以在Nginx的sbin目录下输入./nginx -V
进行查看,如果没有可以在编译时加上此模块。
./configure –with-http_stub_status_module
默认情况下,status是关闭的,我们需要开启,并指定uri来访问数据。通过配置,在nginx配置文件中的server块中增加
server {
listen 80;
server_name localhost;
location /nginx-status {
stub_status on;
access_log on;
}
}
配置完成后在浏览器中输入http://10.0.105.207/nginx-status 查看
(或者用 curl localhost/nginx-status
),显示信息如下:
Active connections: 2
server accepts handled requests
26 26 48
Reading: 0 Writing: 1 Waiting: 1
正常情况下waiting数量是比较多的,并不能说明性能差。如果reading+writing数量比较多说明服务并发有问题。
可以监控Nginx的性能、主要监控、连接数、请求数、各种响应码范围的请求数、输入输出流量、rt、upstream访问等。现在通过ngx_req_status_module
能够统计Nginx中请求的状态信息。需要安装第三方模块。
./configure --add-module=/usr/local/ngx_req_status-master
1.下载ngx_req_status_module 模块, 这是第三方模块需要添加
[root@nginx-server ~]# wget https://github.com/zls0424/ngx_req_status/archive/master.zip -O ngx_req_status.zip
[root@nginx-server ~]# unzip ngx_req_status.zip
[root@nginx-server ~]# cp -r ngx_req_status-master/ /usr/local/ #与解压的nginx在同一级目录下
[root@nginx-server ~]# cd /usr/local/nginx-1.16.0/
[root@nginx-server nginx-1.16.0]# yum -y install pcre pcre-devel openssl openssl-devel gcc gcc-c++ zlib zlib-devel
[root@nginx-server nginx-1.16.0]# yum -y install patch.x86_64
[root@nginx-server nginx-1.16.0]# patch -p1 < ../ngx_req_status-master/write_filter-1.7.11.patch
[root@localhost nginx-1.16.0]# ./configure 添加上原来的参数 --add-module=/usr/local/ngx_req_status-master
2.由于原先已有nginx,所以不能执行make install
否则会覆盖掉以前的配置文件及内容
[root@localhost nginx-1.16.0]# make
3.更换二进制文件
[root@localhost nginx-1.16.0]# mv /usr/sbin/nginx /usr/sbin/nginx_bak
[root@localhost nginx-1.16.0]# cp objs/nginx /usr/sbin/
[root@localhost nginx-1.16.0]# systemctl restart nginx
[root@localhost nginx-1.16.0]# nginx -V
如果发现编译的配置文件有变化就成功了!
[root@localhost ~]# vim /etc/nginx/nginx.conf
req_status_zone server_name $server_name 256k;(开启的req监控)
req_status_zone server_addr $server_addr 256k;
req_status_zone server_url $server_name$uri 256k;
req_status server_name server_addr server_url;
server {
server_name localhost;
location /req-status {
req_status_show on;
}
}
指令介绍
req_status_zone
语法: req_status_zone name string size
默认值: None
配置块: http
定义请求状态ZONE,请求按照string分组来排列,例如:
req_status_zone server_url $server_name$uri 256k;
域名+uri将会形成一条数据,可以看到所有url的带宽,流量,访问数
req_status
语法: req_status zone1[ zone2]
默认值: None
配置块: http, server, location
在location中启用请求状态,你可以指定更多zones。
req_status_show
语法: req_status_show on
默认值: None
配置块: location
在当前位置启用请求状态处理程序
192.168.187.164/req-status
zone_name key max_active max_bw traffic requests active bandwidth
server_addr 192.168.187.164 2 432 17K 18 1 0
server_name 192.168.187.164 2 432 17K 18 1 0
server_url 192.168.187.164/ 1 0 0 8 0 0
请求状态信息包括以下字段:
nginx 的 access log 中可以记录很多有价值的信息,通过分析 access log,可以收集到很多指标。制作nginx的日志切割,每天凌晨切割并压缩。
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" $request_time $upstream_response_time';
打印的日志实例
39.105.66.117 - mp [11/Sep/2019:19:03:01 +0800] "POST /salesplatform-gateway/users HTTP/1.1" 200 575 "-" "Apache-HttpClient/4.5.5 (Java/1.8.0_161)" "-" 0.040 0.040
39.105.66.117 - mp [11/Sep/2019:19:03:08 +0800] "POST /salesplatform-gateway/users HTTP/1.1" 200 575 "-" "Apache-HttpClient/4.5.5 (Java/1.8.0_161)" "-" 0.008 0.008
参数详情
PV:PV(访问量): 即Page View, 即页面浏览量或点击量,用户每次刷新即被计算一次。
UV:UV(独立访客):即Unique Visitor,访问您网站的一台电脑客户端为一个访客。00:00-24:00内相同的客户端只被计算一次。
1、根据访问IP统计UV
awk '{print $1}' paycenteraccess.log | sort -n | uniq | wc -l
2、查询访问最频繁的IP(前10)
awk '{print $1}' /var/log/nginx/access.log | sort -n |uniq -c | sort -rn | head -n 10
3、查看某一时间段的IP访问量(1-8点)
awk '$4 >="[25/Mar/2020:01:00:00" && $4 <="[25/Mar/2020:08:00:00"' /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c| sort -nr |wc -l
4、查看访问100次以上的IP
awk '{print $1}' /var/log/nginx/access.log | sort -n |uniq -c |awk '{if($1 >100) print $0}'|sort -rn
5、查看指定ip访问过的url和访问次数
grep "39.105.67.140" /var/log/nginx/access.log|awk '{print $7}' |sort |uniq -c |sort -n -k 1 -r
6、根据访问URL统计PV
cat /var/log/nginx/access.log |awk '{print $7}' |wc -l
7、查询访问最频繁的URL(前10)
awk '{print $7}' /var/log/nginx/access.log | sort |uniq -c | sort -rn | head -n 10
8、查看访问最频的URL([排除/api/appid])(前10)
grep -v '/api/appid' /var/log/nginx/access.log|awk '{print $7}' | sort |uniq -c | sort -rn | head -n 10
9、查看页面访问次数超过100次的页面
cat /var/log/nginx/access.log | cut -d ' ' -f 7 | sort |uniq -c | awk '{if ($1 > 100) print $0}' | less
10、查看最近1000条记录,访问量最高的页面
tail -1000 /var/log/nginx/access.log |awk '{print $7}'|sort|uniq -c|sort -nr|less
11、统计每小时的请求数,top10的时间点(精确到小时)
awk '{print $4}' /var/log/nginx/access.log |cut -c 14-15|sort|uniq -c|sort -nr|head -n 10
12、统计每分钟的请求数,top10的时间点(精确到分钟)
awk '{print $4}' /var/log/nginx/access.log |cut -c 14-18|sort|uniq -c|sort -nr|head -n 10
13、统计每秒的请求数,top10的时间点(精确到秒)
awk '{print $4}' /var/log/nginx/access.log |cut -c 14-21|sort|uniq -c|sort -nr|head -n 10
14、查找指定时间段的日志
awk '$4 >="[25/Mar/2020:01:00:00" && $4 <="[25/Mar/2020:08:00:00"' /var/log/nginx/access.log
15、列出传输时间超过 0.6 秒的url,显示前10条
cat /var/log/nginx/access.log |awk '(substr($NF,2,5) > 0.6){print $4,$7,substr($NF,2,5)}' | awk -F '"' '{print $1,$2,$3}' |sort -k3 -rn | head -10
16、列出/api/appid请求时间超过0.6秒的时间点
cat /var/log/nginx/access.log |awk '(substr($NF,2,5) > 0.6 && $7~/\/api\/appid/){print $4,$7,substr($NF,2,5)}' | awk -F '"' '{print $1,$2,$3}' |sort -k3 -rn | head -10
17、获取前10条最耗时的请求时间、url、耗时
cat /var/log/nginx/access.log |awk '{print $4,$7,substr($NF,2,5)}' | awk -F '"' '{print $1,$2,$3}' | sort -k3 -rn | head -10
Nginx 处理请求的过程被详细地记录在 access.log 以及 error.log 文件中
监控项目 | 所属性质 | 指标 |
---|---|---|
请求时长 | 服务性质 | 从发出请求到结束需要的时间$request_time 和 $upstream_response_time |
服务存活性 | 服务性质 | nginx是否存活 |
请求返回错误 | 服务性质 | 服务器日志方式错误码4xx和5xx |
流量 | 服务性质 | pv 和 流量 |
服务损耗 | 服务性质 | 连接数 打开文件数 cpu使用率和绑定cpu核心的使用率 |
自定义日志中添加上"$request_time" 和"$upstream_response_time"
这样在后面显示请求体和时间,根据自己请求的时长容忍度来实现程序层面的请求接口优化或者缓存
检查nginx访问 是否返回值和自己的理想的数据返回是否一致 或者状态码是否一致
必须添加对诸如 500/502/504 等 5xx 服务类错误状态码的监控,它们告诉我们服务本身出现了问题。
例如:
connection refused 用户请求超时 | 用户请求超时 |
---|---|
connection timed out | nginx与后端服务器连接超时 |
while connection upstream | nginx与后端服务器连接出现问题 |
可以适当的监控网络接口的流量
location /nginx-status {
stub_status on;
access_log off;
allow 10.1.1.1/24;
deny all;
}
active connection | 当前正在处理的活跃连接数 |
---|---|
reading | 正在读取的客户连接数 |
writing | 处理响应数据到客户端的数量 |
waiting | Nginx等待下次请求的驻留的客户连接数 |