目录
监控性能:进程、线程
监控访问:访问量,并发量
1.Nginx 基础监控
- 进程监控:确保Nginx进程正常运行,没有异常退出或阻塞。
- 端口监控:监控Nginx监听的端口状态,确保端口没有被意外占用或关闭。
注意: 这两个是必须要加在zabbix监控,加触发器有问题及时告警。
Nginx 提供了 ngx_http_stub_status_module,ngx_http_reqstat_module模块,这个模块提供了基本的监控功能
2.Nginx 监控主要指标
基本活跃指标
名称 |
描述 |
指标类型 |
Accepts(接受) |
NGINX 所接受的客户端连接数 |
资源: 功能 |
Handled(已处理) |
成功的客户端连接数 |
资源: 功能 |
Dropped(已丢弃,计算得出) |
丢弃的连接数(接受 - 已处理) |
工作:错误* |
Requests(请求数) |
客户端请求数 |
工作:吞吐量 |
每秒请求数 -- QPS
监控每秒的请求数量,有助于评估服务器的负载情况,以及及时发现潜在的恶意攻击或服务可用性问题。通过持续的 QPS 监控,可以立刻发现是否被恶意攻击或对服务的可用性进行评估。虽然当问题发生时,通过 QPS 不能定位到确切问题的位置,但是他却可以在第一时间提醒你环境可能出问题了
服务器错误率
通过监控固定时间间隔内的错误代码(4XX
代码表示客户端错误,5XX
代码表示服务器端错误),可以了解到客户端收到的结果是否是正确的错误率突然的飙升很可能是你的网站漏洞发出的信号;如果你希望通过 access log 分析错误率,那么你需要配置 nginx 的日志模块,让 nginx 将响应码写入访问日志。
3.Nginx Stub Status 监控模块
# -V大写会显示版本号和模块等信息、v小写仅显示版本信息
nginx -V
# 如果没有此模块,需要重新安装
./configure –with-http_stub_status_module
# 在配置文件添加: stub_status
server {
listen 80;
server_name localhost;
location /test {
stub_status on;
access_log on;
}
}
Stub Status 参数说明
- Active connections:2 #当前nginx处理请求的数目(活跃的连接数)
- nginx 总共处理了 24 个连接,成功创建 24 次握手,也就是成功的连接数connection. 总共处理了 54 个请求
- 失败连接=(总连接数-成功连接数)(相等表示中间没有失败的),
4.nginx access log 分析
nginx 的 access log 中可以记录很多有价值的信息,通过分析 access log,可以收集到很多指标
1.制作nginx的日志切割,每天凌晨切割并压缩。
PV:PV(访问量): 即Page View, 即页面浏览量或点击量,用户每次刷新即被计算一次。
UV:UV(独立访客):即Unique Visitor,访问您网站的一台电脑客户端为一个访客。00:00-24:00内相同的客户端只被计算一次。
5. 常用监控代码:
根据 访问IP 统计UV:
独立访客数,指在一定时间内访问网站的不同用户数。
#!/bin/bash
LOG_FILE="/var/log/nginx/access.log"
TMP_FILE="/tmp/ip_uv.txt"
# 提取所有不同的IP地址并计算数量
awk '{print $1}' $LOG_FILE | sort | uniq -c | sort -nr > $TMP_FILE
# 输出统计结果
echo "访问次数 / IP地址"
echo "----------------"
cat $TMP_FILE
# 清理临时文件
rm $TMP_FILE
sort | uniq -c # 排序后,进行去重,-c 统计行出现的次数
sort -nr # -n 数字排序 ; -r 降序
统计 访问URL 统计PV:
PV 统计通常是对特定页面(URL)的访问次数计数;
#!/bin/bash
LOG_FILE="/var/log/nginx/access.log"
TMP_FILE="/tmp/url_pv.txt"
# 提取所有URL并计算访问次数
awk '{print $7}' $LOG_FILE | sort | uniq -c | sort -nr > $TMP_FILE
# 输出统计结果
echo "访问次数 :URL"
echo "----------------"
cat $TMP_FILE
# 清理临时文件
rm $TMP_FILE
查询 访问最频繁 的URL:
提取日志中的 URL 并统计它们的访问次数,然后找出访问次数最多的那些 URL;
#!/bin/bash
LOG_FILE="/var/log/nginx/access.log"
TMP_FILE="/tmp/url_frequency.txt"
# 提取所有URL并计算访问次数
awk '{print $7}' $LOG_FILE | sort | uniq -c | sort -nr > $TMP_FILE
# 输出统计结果
echo "访问次数 URL"
echo "----------------"
head -n 10 $TMP_FILE # 显示访问次数最多的前10个URL
# 清理临时文件
rm $TMP_FILE
查询访问最频繁的IP:
快速找到在 Nginx 访问日志中访问次数最多的 10 个 IP 地址,并显示它们的访问次数
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -n 10
统计2017年9月5日 PV量:
grep '05/Sep/2017' cd.mobiletrain.org.log |wc -l
# 统计2017年9月5日 8点-9点间 PV量
awk '$4>="[05/Sep/2017:08:00:00" && $4<="[05/Sep/2017:09:00:00" {print $0}' sz.mobiletrain.org.log | wc -l
统计2017年9月5日 一天内访问最多的10个IP(ip top10):
grep '05/Sep/2017' cd.mobiletrain.org.log | awk '{ ips[$1]++ } END{for(i in ips){print i,ips[i]} } '| sort -k2 -rn | head -n10
统计2017年9月5日 访问大于100次的IP:
grep '05/Sep/2017' cd.mobiletrain.org.log | awk '{ ips[$1]++ } END{for(i in ips){ if(ips[i]>100) {print i,ips[i]}} } '| sort -k2 -rn | head -n10
统计2017年9月5日 访问最多的10个页面($request top 10):
grep '05/Sep/2017' cd.mobiletrain.org.log |awk '{urls[$7]++} END{for(i in urls){print urls[i],i}}' |sort -k1 -rn |head -n10
统计2017年9月5日,每个URL访问内容总大小($body_bytes_sent):
grep '05/Sep/2017' sz.mobiletrain.org.log |
awk '{ urls[$7]++; size[$7]+=$10}
END{for(i in urls){print urls[i],size[i],i}}'|
sort -k1 -rn | head -n10
统计2017年9月5日 每个IP访问状态码数量($status):
grep '05/Sep/2017' cd.mobiletrain.org.log |
awk '{ ip_code[$1" "$9]++}
END{ for(i in ip_code){print i,ip_code[i]} }' |
sort -k1 -rn | head -n10
统计2017年9月5日 每个IP访问状态码为404及出现次数($status):
grep '05/Sep/2017' cd.mobiletrain.org.log |
awk '$9=="404"{ccc[$1" "$9]++}
END{for(i in ccc){print i,ccc[i]}}' |
sort -k3 -rn
统计前一分钟的PV量:
date=$(date -d '-1 minute' +%Y:%H:%M);
awk -v date=$date '$0 ~ date{i++}END{print i}' /var/log/nginx/xuleilinux.access.log
统计2017年9月5日 8:30-9:00,每个IP,出现404状态码的数量:
awk '$4>="[05/Sep/2017:08:30:00" &&
$4<="[05/Sep/2017:09:00:00"
{if($9=="404"){ip_code[$1" "$9]++}}
END{for(i in ip_code){print i,ip_code[i]}}'
sz.mobiletrain.org.log
统计2017年9月5日 各种状态码数量:
grep '05/Sep/2017' sz.mobiletrain.org.log |
awk '{code[$9]++} END{for(i in code){print i,code[i]}}'