1. 为什么需要日志审计?

想象你开了一家24小时营业的网红餐厅,每天都有大量客人进出。想要知道哪些时段最繁忙、哪些菜品最受欢迎、有没有可疑人物出入,你会怎么做?答案很简单——查看监控录像和点餐记录。在Web服务器领域,Nginx的日志就是你的"监控系统"和"点餐记录本"。

2. 基础配置三步走

2.1 配置日志格式

# /etc/nginx/nginx.conf 主配置文件
http {
    log_format  audit  '$remote_addr - $remote_user [$time_local] '
                       '"$request" $status $body_bytes_sent '
                       '"$http_referer" "$http_user_agent" '
                       'rt=$request_time uct="$upstream_connect_time" '
                       'urt="$upstream_response_time"';
    
    # 扩展字段示例(需要安装realip模块)
    set_real_ip_from  192.168.1.0/24;
    real_ip_header    X-Forwarded-For;
    log_format  enhanced  '$remote_addr ($http_x_real_ip) - $remote_user [...]';
}
  • $request_time:记录请求处理总耗时
  • upstream_*:记录反向代理各阶段时间
  • real_ip设置解决代理服务器场景下的真实IP获取

2.2 启用访问日志

server {
    access_log  /var/log/nginx/access.log  audit;
    error_log   /var/log/nginx/error.log  warn;
    
    # 按虚拟主机分离日志
    access_log  /var/log/nginx/shop.example.com.access.log  audit;
    
    # 条件日志示例:记录慢请求
    map $request_time $is_slow {
        default         0;
        ~^[5-9].        1;  # 5秒以上
        ~^[1-9][0-9]+   1;  # 10秒+
    }
    access_log  /var/log/nginx/slow.log  audit if=$is_slow;
}

2.3 错误日志分级

# 错误级别说明:
# debug | info | notice | warn | error | crit | alert | emerg
error_log  /var/log/nginx/error.log  notice;

# 调试特定IP的错误日志
events {
    debug_connection 192.168.1.100;
}

3. 高级审计技巧

3.1 日志切割策略

# /etc/logrotate.d/nginx
/var/log/nginx/*.log {
    daily
    missingok
    rotate 30
    compress
    delaycompress
    notifempty
    create 0640 www-data adm
    sharedscripts
    postrotate
        /usr/bin/systemctl reload nginx >/dev/null 2>&1 || true
    endscript
}
  • rotate 30:保留30天日志
  • compress:启用gzip压缩历史日志
  • delaycompress:延迟压缩当前日志

3.2 实时监控方案

# 实时监控错误日志
tail -f /var/log/nginx/error.log | grep --line-buffered 'error' 

# 使用GoAccess生成实时仪表盘
goaccess /var/log/nginx/access.log --log-format=COMBINED --real-time-html --port=7890

4. 关联技术整合

4.1 ELK日志分析系统

# filebeat.yml 配置示例
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/nginx/*.log
  fields:
    type: "nginx"
  
output.elasticsearch:
  hosts: ["http://es-server:9200"]

4.2 Prometheus监控集成

# 启用stub_status模块
server {
    listen 127.0.0.1:8080;
    location /nginx-status {
        stub_status on;
        access_log off;
    }
}

5. 典型应用场景

5.1 恶意请求检测

# 查找可疑User-Agent
grep -E 'nmap|sqlmap|hydra' access.log

# 检测路径遍历攻击
grep '\.\./' access.log | awk '{print $1,$7}'

5.2 API性能分析

# 统计最慢的API端点
cat access.log | awk '{print $7, $NF}' | sort -k2 -nr | head -20

# 计算各状态码占比
awk '{print $9}' access.log | sort | uniq -c | sort -nr

6. 技术优缺点分析

优势亮点:

  • 毫秒级响应时间统计
  • 支持自定义字段扩展
  • 原生支持日志缓冲写入
  • 多虚拟主机独立日志

潜在局限:

  • 日志文件可能快速膨胀
  • 缺少可视化分析界面
  • 原始日志可读性较差
  • 正则过滤性能消耗大

7. 关键注意事项

7.1 隐私合规要求

# 屏蔽敏感字段
map $arg_password $password {
    default "***";
    ~^(?<pw>.+)$ $pw;  # 演示逻辑,实际应做脱敏处理
}

7.2 存储安全建议

# 设置日志目录权限
chown -R www-data:adm /var/log/nginx
chmod 640 /var/log/nginx/*.log

# 加密存储历史日志
openssl aes-256-cbc -salt -in access.log -out access.log.enc

8. 实战经验总结

通过合理配置Nginx日志审计功能,我们成功实现了:

  • 精准追踪到某次API接口响应慢的问题根源
  • 发现并阻止了来自特定IP的CC攻击
  • 优化了高峰时段的服务器资源配置
  • 满足等保2.0三级的安全审计要求

建议每季度进行一次日志策略评审,结合业务发展调整日志格式和存储周期。