1. Nginx 状态监控
Nginx 提供了一个内置的状态信息监控页面,用于监控 Nginx 的整体访问情况。此功能由 ngx_http_stub_status_module
模块实现。
检测模块是否启用
使用以下命令检测当前 Nginx 是否启用了 ngx_http_stub_status_module
模块:
nginx -V 2>&1 | grep -o with-http_stub_status_module
如果输出 ngx_http_stub_status_module
,说明已启用;如果没有输出,需要在编译时加上此模块。
配置状态监控
默认情况下,状态监控是关闭的。我们需要在 Nginx 配置中开启它,并指定一个 URI 来访问监控数据。示例配置如下:
server {
listen 80;
server_name default_server;
location /status {
stub_status on;
allow 114.247.125.227; # 只允许指定 IP 访问
# 去掉 allow 语句可取消 IP 访问限制
}
}
配置完成后,重启 Nginx 并通过浏览器访问 http://{IP}/status
查看状态监控信息。
状态监控参数说明
- Active connections:当前活动的客户端连接数,包括正在等待的客户端连接。
- accepts:已接受的客户端连接总数。
- handled:已处理的连接总数。
- requests:客户端 HTTP 请求总数。
- Reading:当前正在读取的 HTTP 请求数(读取请求头)。
- Writing:当前准备响应的连接数(写入响应头)。
- Waiting:当前处于等待状态的空闲客户端请求数。
监控数据可以进一步结合监控工具进行分析和展示。
2. 日志分析
Nginx 默认的日志格式配置可以在 /etc/nginx/nginx.conf
文件中找到,如下:
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';
日志字段说明
- $remote_addr:客户端 IP 地址
- $remote_user:远程客户端的用户名称
- $time_local:访问时间和时区
- $request:请求的 URL 及请求方法
- $status:响应状态码
- $body_bytes_sent:发送给客户端的文件主体内容字节数
- $http_referer:用户从哪个链接访问的
- $http_user_agent:用户的浏览器信息
- $http_x_forwarded_for:记录通过代理服务器访问的客户端 IP
- $request_time:从接收请求到发送响应的时间
- $upstream_response_time:上游服务器响应的时间
常用日志分析命令
根据访问 IP 统计 UV:
awk '{print $1}' /var/log/nginx/access.log | sort -n | uniq | wc -l
查询访问最频繁的 IP(前 10):
awk '{print $1}' /var/log/nginx/access.log | sort -n | uniq -c | sort -rn | head -n 10
查看某一时间段的 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
查看访问 100 次以上的 IP:
awk '{print $1}' /var/log/nginx/access.log | sort -n | uniq -c | awk '{if($1 >100) print $0}' | sort -rn
查看指定 IP 访问过的 URL 和访问次数:
grep "39.105.67.140" /var/log/nginx/access.log | awk '{print $7}' | sort | uniq -c | sort -n -k 1 -r
根据访问 URL 统计 PV:
cat /var/log/nginx/access.log | awk '{print $7}' | wc -l
查询访问最频繁的 URL(前 10):
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -n 10
查看访问最频繁的 URL(排除 /api/appid)(前 10):
grep -v '/api/appid' /var/log/nginx/access.log | awk '{print $7}' | sort | uniq -c | sort -rn | head -n 10
查看访问次数超过 100 次的页面:
cat /var/log/nginx/access.log | cut -d ' ' -f 7 | sort | uniq -c | awk '{if ($1 > 100) print $0}' | less
查看最近 1000 条记录中访问量最高的页面:
tail -1000 /var/log/nginx/access.log | awk '{print $7}' | sort | uniq -c | sort -nr | less
统计每小时的请求数,显示 Top 10 的时间点:
awk '{print $4}' /var/log/nginx/access.log | cut -c 14-15 | sort | uniq -c | sort -nr | head -n 10
统计每分钟的请求数,显示 Top 10 的时间点:
awk '{print $4}' /var/log/nginx/access.log | cut -c 14-18 | sort | uniq -c | sort -nr | head -n 10
统计每秒的请求数,显示 Top 10 的时间点:
awk '{print $4}' /var/log/nginx/access.log | cut -c 14-21 | sort | uniq -c | sort -nr | head -n 10
查找指定时间段的日志:
awk '$4 >="[25/Mar/2020:01:00:00" && $4 <="[25/Mar/2020:08:00:00"' /var/log/nginx/access.log
列出传输时间超过 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
列出
/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
获取前 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