插件窝 干货文章 Nginx中的HTTP请求日志分析

Nginx中的HTTP请求日志分析

分析 日志 log Nginx 550    来源:    2025-04-19

Nginx HTTP请求日志分析指南

Nginx的访问日志是分析网站流量、排查问题和优化性能的重要工具。下面我将详细介绍如何配置和分析Nginx的HTTP请求日志。

1. 日志配置

基本日志格式

在nginx.conf中通常可以找到如下配置:

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

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

常用变量说明

  • $remote_addr:客户端IP地址
  • $remote_user:HTTP基本认证的用户名
  • $time_local:本地时间
  • $request:完整的请求行(方法、URI、协议)
  • $status:HTTP状态码
  • $body_bytes_sent:发送给客户端的字节数
  • $http_referer:引用来源
  • $http_user_agent:客户端浏览器信息

自定义日志格式

可以根据需要添加更多字段:

log_format extended '$remote_addr - $remote_user [$time_local] '
                   '"$request" $status $body_bytes_sent '
                   '"$http_referer" "$http_user_agent" '
                   '$request_time $upstream_response_time $upstream_addr';

2. 日志分析工具

2.1 使用命令行工具

基本统计

# 查看访问量最高的IP
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -n 10

# 查看最频繁的请求URL
awk '{print $7}' access.log | sort | uniq -c | sort -nr | head -n 10

# 统计HTTP状态码
awk '{print $9}' access.log | sort | uniq -c | sort -nr

高级分析

# 统计慢请求(假设自定义了$request_time)
awk '{if ($NF > 1) print $0}' access.log | sort -k10 -nr | head -n 20

# 统计特定时间段的请求
awk '/\[02\/May\/2023:09:00/,/\[02\/May\/2023:10:00/' access.log | wc -l

2.2 使用专用工具

GoAccess

实时日志分析工具:

goaccess /var/log/nginx/access.log -a

AWStats

功能全面的日志分析工具,提供Web界面。

ELK Stack (Elasticsearch, Logstash, Kibana)

适用于大规模日志分析。

3. 常见分析场景

3.1 性能分析

  • 查找慢请求:$request_time > 1s
  • 分析上游响应时间:$upstream_response_time
  • 识别大文件传输:$body_bytes_sent

3.2 安全分析

  • 识别扫描行为:大量404请求
  • 检测暴力破解:大量401状态码
  • 异常User-Agent:爬虫或攻击工具

3.3 流量分析

  • 热门页面排行
  • 流量来源分析
  • 客户端设备分布

4. 日志轮转

为防止日志文件过大,应配置日志轮转:

# /etc/logrotate.d/nginx
/var/log/nginx/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    create 0640 www-data adm
    sharedscripts
    postrotate
        /etc/init.d/nginx reload > /dev/null
    endscript
}

5. 实时监控

使用tail -f实时查看日志:

tail -f /var/log/nginx/access.log

或使用多工具组合:

tail -f /var/log/nginx/access.log | grep --line-buffered 'some_pattern' | awk '{print $1}'

通过合理配置和分析Nginx日志,您可以深入了解网站的运行状况,及时发现并解决问题,优化用户体验。