如何监控Nginx(看完这篇就会了)

Posted 咸蛋黄派

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何监控Nginx(看完这篇就会了)相关的知识,希望对你有一定的参考价值。

一、简介

web 服务器 nginx 以其高性能与抗并发能力越来越多的被用户使用。Nginx 提供了 ngx_http_stub_status_modulengx_http_reqstat_module模块,这两个模块提供了基本的监控功能。

  • 进程监控
  • 端口监控

注意: 这两个是必须要加在zabbix监控,加触发器有问题及时告警。

二、监控的主要指标

即主要监控对象:

1、基本活跃指标

名称描述指标类型
Accepts (接受)NGINX 所接受的客户端连接数资源: 功能
Handled (已处理)成功的客户端连接数资源: 功能
Dropped (已丢弃,计算得出)丢弃的连接数(接受 - 已处理)工作:错误*
Requests (请求数)客户端请求数工作:吞吐量

2、每秒请求数–QPS

通过持续的 QPS 监控,可以立刻发现是否被恶意攻击或对服务的可用性进行评估。虽然当问题发生时,通过 QPS 不能定位到确切问题的位置,但是他却可以在第一时间提醒你环境可能出问题了。

3、服务器错误率

通过监控固定时间间隔内的错误代码(4XX代码表示客户端错误,5XX代码表示服务器端错误),可以了解到客户端收到的结果是否是正确的错误率突然的飙升很可能是你的网站漏洞发出的信号。
如果你希望通过 access log 分析错误率,那么你需要配置 nginx 的日志模块,让 nginx 将响应码写入访问日志。

三、指标收集

1、Nginx stub 模块监控

(1)模块安装

确保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;
                }
}

(2)Nginx 状态查看

配置完成后在浏览器中输入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 
  • Active connections:与后端建立的服务连接数
  • server accepts handled requests:Nginx总共处理了26个连接,成功创建了26次握手,总共处理了48个请求
  • Reading:nginx读取到客户端的Header信息数
  • Writing:nginx返回到客户端的Header信息数
  • Waiting:开启Keep-alive的情况下,这个值等于 Active -(Reading + Writing)。表示nginx已经处理完成,正在等候下次一次请求的连接数。

(3)Stub Status 参数说明

正常情况下waiting数量是比较多的,并不能说明性能差。如果reading+writing数量比较多说明服务并发有问题。

2、Nginx Reqstat 模块监控

可以监控Nginx的性能、主要监控、连接数、请求数、各种响应码范围的请求数、输入输出流量、rt、upstream访问等。现在通过ngx_req_status_module能够统计Nginx中请求的状态信息。需要安装第三方模块。

./configure  --add-module=/usr/local/ngx_req_status-master

(1)模块安装

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   
如果发现编译的配置文件有变化就成功了!

(1)Reqstat监控配置

[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
在当前位置启用请求状态处理程序

(2)Nginx 状态查看

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

请求状态信息包括以下字段:

  • zone_name - 利用req_status_zone定义的分组标准。例如,按照服务器名称对请求进行分组后;
  • key - 请求按分组标准分组后的分组标识(即组名)。例如按服务器名称分组时,组名可能是localhost;
  • max_active - 该组的最大并发连接数;
  • max_bw - 该组的最大带宽;
  • traffic - 该组的总流量;
  • requests - 该组的总请求数;
  • active - 该组当前的并发连接数;
  • bandwidth - 该组当前带宽。

四、补充(扩展):

1、日志分析

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

参数详情

  • $remote_addr: 客户端的ip地址
  • $remote_user: 用于记录远程客户端的用户名称
  • $time_local: 用于记录访问时间和时区
  • $request: 用于记录请求的url以及请求方法
  • $status: 响应状态码
  • $body_bytes_sent: 给客户端发送的文件主体内容字节数
  • $http_referer: 可以记录用户是从哪个链接访问过来的
  • $http_user_agent: 用户所使用的浏览器信息
  • $http_x_forwarded_for: 可以记录客户端IP,通过代理服务器来记录客户端的ip地址
  • $ request_time: 指的是从接受用户请求的第一个字节到发送完响应数据的时间,即$request_time包括接收客户端请求数据的时间、后端程序响应的时间、发送响应数据给客户端的时间
  • $upstream_response_time: 用于接收来自上游服务器的响应的时间

2、常用分析命令

(1)相关概念

  • PV:PV(访问量): 即Page View, 即页面浏览量或点击量,用户每次刷新即被计算一次。

  • UV:UV(独立访客):即Unique Visitor,访问您网站的一台电脑客户端为一个访客。00:00-24:00内相同的客户端只被计算一次。

(2)具体命令

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

3、公司监控nginx需要的指标

Nginx 处理请求的过程被详细地记录在 access.log 以及 error.log 文件中

监控项目所属性质指标
请求时长服务性质从发出请求到结束需要的时间$request_time 和 $upstream_response_time
服务存活性服务性质nginx是否存活
请求返回错误服务性质服务器日志方式错误码4xx和5xx
流量服务性质pv 和 流量
服务损耗服务性质连接数 打开文件数 cpu使用率和绑定cpu核心的使用率

(1)请求时长

自定义日志中添加上"$request_time" 和"$upstream_response_time"
这样在后面显示请求体和时间,根据自己请求的时长容忍度来实现程序层面的请求接口优化或者缓存

(2)nginx是否存活

检查nginx访问 是否返回值和自己的理想的数据返回是否一致 或者状态码是否一致

(3)请求返回错误

必须添加对诸如 500/502/504 等 5xx 服务类错误状态码的监控,它们告诉我们服务本身出现了问题。

  • 5xx 类错误每分钟出现的频率应该在个位数,太多的 5xx 应及时排查问题并解决;
  • 4xx 类错误,在协助解决一些非预期的权限错误、资源丢失或性能等问题上可以给予帮助。

例如:

connection refused 用户请求超时用户请求超时
connection timed outnginx与后端服务器连接超时
while connection upstreamnginx与后端服务器连接出现问题

(4)流量

可以适当的监控网络接口的流量

(5)服务损耗

location /nginx-status {
        stub_status on;
        access_log  off;
        allow      10.1.1.1/24;
        deny        all;
    }
  • 文件打开数:lsof |grep nginx|wc -l
  • cpu损耗: 监控cpu的使用率即可
active connection当前正在处理的活跃连接数
reading正在读取的客户连接数
writing处理响应数据到客户端的数量
waitingNginx等待下次请求的驻留的客户连接数

以上是关于如何监控Nginx(看完这篇就会了)的主要内容,如果未能解决你的问题,请参考以下文章

看完这篇Linux基本的操作就会了

Linux-看完这篇Linux基本的操作就会了(转)

什么是指数基金?看完这篇就懂了!

企业为什么要制定精益标准工时?看完这篇就懂了!

保洁阿姨看完都会了!看完这一篇就够了!深入剖析

关于 Docker 镜像的操作,看完这篇就够啦 !(下)