Nginx 访问日志:每个字段的含义及分析方法

Web2026-09-22TryQuickToolBox

Nginx 访问日志记录 Web 服务器处理的每个请求。在调试 404 错误、追踪慢速端点或调查可疑流量时,它们是首先要查看的地方。然而,许多开发者只是粗略浏览原始日志行,并未完全理解每个字段的含义。本指南将详细解析 Nginx 默认日志格式,展示如何自定义格式,并介绍使用标准命令行工具进行实际分析的技巧。

Nginx 默认访问日志格式

Nginx 开箱即用,采用 combined 日志格式,如下所示:

log_format combined '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent"';

典型的日志行:

192.0.2.1 - - [10/Oct/2023:13:55:36 +0000] "GET /api/users HTTP/1.1" 200 1234 "https://example.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"

逐字段解释

字段变量描述
远程地址$remote_addr发出请求的客户端 IP 地址。
远程用户$remote_user如果使用 HTTP 认证,则为用户名;否则为 -。
本地时间$time_local服务器本地时间,格式为 [日/月/年:时:分:秒 时区]。
请求$request完整的请求行:方法、路径和 HTTP 协议。
状态$statusHTTP 响应状态码(例如 200、404、500)。
发送的正文字节数$body_bytes_sent响应正文的大小(以字节为单位),不包括头部。
来源页面$http_referer链接到该请求的页面(如果客户端提供)。
用户代理$http_user_agent客户端软件字符串(浏览器、机器人、工具)。

自定义日志格式

您可以定义自己的格式来捕获更多细节,如请求时间、上游响应时间或 gzip 压缩比。在 http 块中添加 log_format 指令,并在 access_log 中引用它。

http {
    log_format detailed '$remote_addr - $remote_user [$time_local] '
                        '"$request" $status $body_bytes_sent '
                        '"$http_referer" "$http_user_agent" '
                        'rt=$request_time uct="$upstream_connect_time" '
                        'uht="$upstream_header_time" urt="$upstream_response_time"';

    access_log /var/log/nginx/access.log detailed;
}

常见的额外变量:

使用命令行工具分析 Nginx 日志

您不需要昂贵的软件来提取洞察。像 grep、awk、sort 和 uniq 这样的标准 Unix 工具对于大多数任务来说已经足够强大。

1. 查找最频繁的 IP 地址

awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10

这有助于识别高流量来源或潜在的 DDoS 攻击源。

2. 识别请求最多的 URL

awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10

用于了解热门内容或发现异常模式。

3. 统计 HTTP 状态码

awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -nr

快速查看出现了多少 404 或 500 错误。

4. 查找响应时间较慢的请求

如果您在日志格式中添加了 $request_time,可以过滤出慢请求:

awk '{ if ($NF > 1) print }' /var/log/nginx/access.log

根据需要调整阈值(此处为 1 秒)。

5. 检测可疑的用户代理

awk -F'"' '{print $6}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10

查找已知的恶意机器人或异常客户端。

实际应用场景

使用日志解析器自动化分析

虽然命令行单行命令适用于临时查询,但定期报告更适合使用专用工具。您可以使用开源日志分析器,如 GoAccess 或 AWStats,或构建自定义脚本。如需快速、基于浏览器的解析而无需安装任何软件,Nginx 日志分析器 允许您粘贴日志行,并即时获取状态码、热门 IP 和请求路径的摘要。

日志管理最佳实践

常见问题

Nginx 中访问日志和错误日志有什么区别?

访问日志记录 Nginx 处理的每个请求,包括客户端 IP、请求方法、状态码和用户代理。错误日志捕获有关服务器问题的诊断消息,例如连接失败、配置错误或上游超时。两者对于不同的故障排查场景都至关重要。

当 Nginx 位于负载均衡器之后时,如何查看真实的客户端 IP?

当 Nginx 位于代理或负载均衡器之后时,$remote_addr 显示的是负载均衡器的 IP。要记录原始客户端 IP,请配置 real_ip 模块以信任负载均衡器的 IP,并在日志格式中使用 $http_x_forwarded_for 或 $realip_remote_addr。

我可以在不安装软件的情况下分析 Nginx 日志吗?

可以。您可以直接在终端中使用 grep、awk 和 sort 等标准 Unix 命令。对于图形化、基于浏览器的方法,像 Nginx 日志分析器 这样的在线工具无需任何安装即可提供快速洞察。

准备好深入分析您的日志了吗?试试 Nginx 日志分析器,在几秒钟内解析并可视化您的访问日志——无需任何设置。