编程 Nginx 状态监控与日志分析

2024-11-19 09:36:18 +0800 CST views 439

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:上游服务器响应的时间

常用日志分析命令

  1. 根据访问 IP 统计 UV

    awk '{print $1}' /var/log/nginx/access.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. 统计每小时的请求数,显示 Top 10 的时间点

    awk '{print $4}' /var/log/nginx/access.log | cut -c 14-15 | sort | uniq -c | sort -nr | head -n 10
    
  12. 统计每分钟的请求数,显示 Top 10 的时间点

    awk '{print $4}' /var/log/nginx/access.log | cut -c 14-18 | sort | uniq -c | sort -nr | head -n 10
    
  13. 统计每秒的请求数,显示 Top 10 的时间点

    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 监控 日志 网络 服务器

推荐文章

Roop是一款免费开源的AI换脸工具
2024-11-19 08:31:01 +0800 CST
go发送邮件代码
2024-11-18 18:30:31 +0800 CST
微信小程序热更新
2024-11-18 15:08:49 +0800 CST
使用Vue 3实现无刷新数据加载
2024-11-18 17:48:20 +0800 CST
mysql时间对比
2024-11-18 14:35:19 +0800 CST
pycm:一个强大的混淆矩阵库
2024-11-18 16:17:54 +0800 CST
Graphene:一个无敌的 Python 库!
2024-11-19 04:32:49 +0800 CST
HTML和CSS创建的弹性菜单
2024-11-19 10:09:04 +0800 CST
一个数字时钟的HTML
2024-11-19 07:46:53 +0800 CST
JavaScript设计模式:桥接模式
2024-11-18 19:03:40 +0800 CST
Vue 3 是如何实现更好的性能的?
2024-11-19 09:06:25 +0800 CST
Vue中如何处理异步更新DOM?
2024-11-18 22:38:53 +0800 CST
PHP openssl 生成公私钥匙
2024-11-17 05:00:37 +0800 CST
Go 单元测试
2024-11-18 19:21:56 +0800 CST
使用 Git 制作升级包
2024-11-19 02:19:48 +0800 CST
Go 接口:从入门到精通
2024-11-18 07:10:00 +0800 CST
程序员茄子在线接单