前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除
一、Nginx的基础监控
- 进程监控
-
端口监控
注意: 这两个是必须要加在zabbix监控,加触发器有问题及时告警。
nginx 提供了ngx_http_stub_status_module,ngx_http_reqstat_module模块,这个模块提供了基本的监控功能
二、监控的主要指标
1、基本活跃指标
Accepts(接受)、Handled(已处理)、Requests(请求数)是一直在增加的计数器。Active(活跃)、Waiting(等待)、Reading(读)、Writing(写)随着请求量而增减
名称 | 描述 | 指标类型 |
---|---|---|
Accepts(接受) | NGINX 所接受的客户端连接数 | 资源: 功能 |
Handled(已处理) | 成功的客户端连接数 | 资源: 功能 |
Dropped(已丢弃,计算得出) | 丢弃的连接数(接受 - 已处理) | 工作:错误* |
Requests(请求数) | 客户端请求数 | 工作:吞吐量 |
2、每秒请求数 -- QPS
通过持续的 QPS 监控,可以立刻发现是否被恶意攻击或对服务的可用性进行评估。虽然当问题发生时,通过 QPS 不能定位到确切问题的位置,但是他却可以在第一时间提醒你环境可能出问题了
3、服务器错误率
通过监控固定时间间隔内的错误代码(4XX代码表示客户端错误,5XX代码表示服务器端错误),可以了解到客户端收到的结果是否是正确的错误率突然的飙升很可能是你的网站漏洞发出的信号;如果你希望通过 access log 分析错误率,那么你需要配置 nginx 的日志模块,让 nginx 将响应码写入访问日志
4、请求处理时间
请求处理时间也可以被记录在 access log 中,通过分析 access log,统计请求的平均响应时间,通过持续观察,可以发现上游服务器的问题
三、指标的收集
通过在编译时加入 nginx 的 ngx_http_stub_status_module 模块我们可以实时监控以下基本的指标:
1、nginx Stub Status监控模块安装
(1)先使用命令查看是否已经安装这个模块:
[root@localhost ~]# nginx -V
nginx version: nginx/1.26.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --group=nginx --user=nginx --sbin-path=/usr/local/nginx/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/tmp/nginx/client_body --http-proxy-temp-path=/tmp/nginx/proxy --http-fastcgi-temp-path=/tmp/nginx/fastcgi --pid-path=/var/run/nginx.pid --lock-path=/var/lock/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-pcre --with-http_realip_module --with-stream
如果没有此模块,需要重新安装,编译命令如下:
./configure –with-http_stub_status_module
具体的使用方法是在执行 ./configure 时,指定 --with-http_stub_status_module,然后通过配置:
server {
listen 80;
server_name localhost;
location /nginx-status {
stub_status on;
access_log on;
}
}
2、nginx状态查看
配置完成后在浏览器输入:主机ip/nginx-status查看(或用curl localhost/nginx-status);显示信息如下:
Active connections: 1
server accepts handled requests
7 7 8
Reading: 0 Writing: 1 Waiting: 0
3、Stub Status参数说明
正常情况下waiting数量是比较多的,并不能说明性能差。反而如果reading+writing数量比较多说明服务并发有问题
名称 | 描述 | 是否累加历史数据 |
---|---|---|
Accepts(接受) | Nginx接收的客户端连接数(包括Handled+Dropped+Waiting) | 是 |
Handled(已处理) | 成功处理的客户端连接数(包含Waiting状态连接) | 是 |
Active(活跃) | 当前活跃的客户端连接数 | 否 |
Dropped(已丢弃) | 已丢弃连接数(出错) | 是 |
Requests(请求数) | 客户端请求数 | 是 |
Waiting(等待) | 正在等待的连接数 | 否 |
Reading(读) | 正在执行读操作的连接数 | 否 |
writing(写) | 正在执行写操作的连接数 | 否 |
4、Request模块监控--已经不支持了
4.1、Request模块描述:
- ngx_http_reqstat_module 模块
- 这个模块计算定义的变量,根据变量值分别统计 nginx 的运行状况
- 可以监视的运行状况有:连接数、请求数、各种响应码范围的请求数、输入输出流量、rt、upstream访问
- 可以指定获取所有监控结果或者一部分监控结果。
- 利用变量添加自定义监控状态。总的监控状态最大个数为50个。
- 回收过期的监控数据。
- 设置输出格式
- 跟踪请求,不受内部跳转的影响
- 不要使用与响应相关的变量作为条件,比如"$status"
4.2、实验实现
(1)下载ngx_req_status_module 模块, 这是第三方模块需要添加
wget https://github.com/zls0424/ngx_req_status/archive/master.zip -O ngx_req_status.zip
unzip ngx_req_status.zip
(2) 复制模块到 Nginx 目录:
cp -r ngx_req_status-master/ /usr/local/
(3) 配置 Nginx 并添加模块:
cd /usr/local/nginx-1.16.0/
./configure --prefix=/usr/local/nginx 添加上原来的参数 --add-module=/usr/local/ngx_req_status-master
(4) 安装补丁工具并应用补丁:
yum -y install patch
patch -p1 < ../ngx_req_status-master/write_filter-1.7.11.patch
(5) 编译并安装 Nginx :
make
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx_bak
cp objs/nginx /usr/local/nginx/sbin/
(6)重启Nginx
systemctl restart nginx
# 编译安装的可以杀死进程,在重新启动
ps aux | grep nginx
kill -9 进程id
/usr/local/nginx/sbin/nginx
(7) 配置 Nginx 使用 ngx_req_status
[root@localhost nginx-1.16.0]# vim /etc/nginx/nginx.conf
...
req_status_zone server_name $server_name 256k;
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
在当前位置启用请求状态处理程序
(8) 重启 Nginx 并应用配置
[root@localhost nginx-1.16.0]# nginx -t | nginx -s reload
(9)浏览器访问测试:
4.3、请求状态分析
状态 | 说明 |
---|---|
zone_name | 利用req_status_zone定义的分组标准;例如,按照服务器名称对请求进行分组后 |
key | 请求按分组标准分组后的分组标识(即组名)。例如按服务器名称分组时,组名可能是localhost |
max_active | 该组的最大并发连接数 |
max_bw | 该组的最大带宽 |
traffic | 该组的总流量 |
requests | 该组的总请求数 |
active | 该组当前的并发连接数 |
bandwidth | 该组当前带宽 |
四、补充(扩展)
1、查看Web服务器TCP连接状态
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
其结果各字段说明如下:
字段 | 说明 |
---|---|
LISTEN | 侦听来自远方的TCPport的连接请求 |
SYN-SENT | 再发送连接请求后等待匹配的连接请求 |
SYN-RECEIVED | 再收到和发送一个连接请求后等待对方对连接请求的确认 |
ESTABLISHED | 代表一个打开的连接 |
FIN-WAIT-1 | 等待远程TCP连接中断请求,或先前的连接中断请求的确认 |
FIN-WAIT-2 | 从远程TCP等待连接中断请求 |
CLOSE-WAIT | 等待从本地用户发来的连接中断请求 |
CLOSING | 等待远程TCP对连接中断的确认 |
LAST-ACK | 等待原来的发向远程TCP的连接中断请求的确认 |
TIME-WAIT | 等待足够的时间以确保远程TCP接收到连接中断请求的确认 |
CLOSED | 没有不论什么连接状态 |
2、nginx access log分析
nginx 的 access log 中可以记录很多有价值的信息,通过分析 access log,可以收集到很多指标
1、制作nginx的日志切割,每天凌晨切割并压缩
- PV:PV(访问量): 即Page View, 即页面浏览量或点击量,用户每次刷新即被计算一次。
- UV:UV(独立访客):即Unique Visitor,访问您网站的一台电脑客户端为一个访客。00:00-24:00内相同的客户端只被计算一次。
3、面试题
1、根据访问统计UV:
awk '{print $1}' access.log|sort | uniq -c |wc -l
2、统计访问URL统计PV :
awk '{print $7}' access.log|wc -l
3、查询访问最频繁的URL:
awk '{print $7}' access.log|sort | uniq -c |sort -n -k 1 -r|more
4、查询访问最频繁的IP:
awk '{print $1}' access.log|sort | uniq -c |sort -n -k 1 -r|more
5、查询访问最频繁的前10的IP
awk '{print $1}' access.log|sort | uniq -c |sort -n -k 1 -r|head -n 10