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

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

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

推荐文章

使用xshell上传和下载文件
2024-11-18 12:55:11 +0800 CST
基于Webman + Vue3中后台框架SaiAdmin
2024-11-19 09:47:53 +0800 CST
php指定版本安装php扩展
2024-11-19 04:10:55 +0800 CST
Go 单元测试
2024-11-18 19:21:56 +0800 CST
php 连接mssql数据库
2024-11-17 05:01:41 +0800 CST
Vue3 实现页面上下滑动方案
2025-06-28 17:07:57 +0800 CST
一些实用的前端开发工具网站
2024-11-18 14:30:55 +0800 CST
CentOS 镜像源配置
2024-11-18 11:28:06 +0800 CST
imap_open绕过exec禁用的脚本
2024-11-17 05:01:58 +0800 CST
git使用笔记
2024-11-18 18:17:44 +0800 CST
jQuery中向DOM添加元素的多种方法
2024-11-18 23:19:46 +0800 CST
Vue3中的Scoped Slots有什么改变?
2024-11-17 13:50:01 +0800 CST
html一个全屏背景视频
2024-11-18 00:48:20 +0800 CST
Flet 构建跨平台应用的 Python 框架
2025-03-21 08:40:53 +0800 CST
JavaScript 上传文件的几种方式
2024-11-18 21:11:59 +0800 CST
一键配置本地yum源
2024-11-18 14:45:15 +0800 CST
程序员茄子在线接单