1. 为什么需要关注Nginx日志?

如果把服务器比作一家24小时营业的便利店,Nginx日志就是安装在每个角落的监控摄像头。它忠实记录着:

  • 谁来过(客户端IP)
  • 什么时候来的(访问时间)
  • 买了什么(请求路径)
  • 花了多少钱(响应状态码)
  • 结账快不快(响应时间)

但默认的监控画面可能不够清晰,比如:

  • 无法区分手机和电脑用户
  • 看不清顾客的完整购物清单(请求参数)
  • 不知道商品是从哪个仓库调货的(后端服务器IP)

这就需要我们调整监控参数——也就是自定义Nginx日志格式和存储路径。

2. 基础配置解剖室(Nginx 1.18.0)

打开你的nginx.conf文件(通常在/etc/nginx/),让我们从基础配置开始:

# 全局日志配置段
http {
    # 定义名为main的日志格式
    log_format main '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent"';

    # 设置访问日志路径并使用main格式
    access_log /var/log/nginx/access.log main;
}

这个基础配置就像标准监控套餐:

  • $remote_addr:顾客IP(知道谁来了)
  • $time_local:到店时间(知道什么时候来的)
  • $request:购买清单(请求方法和路径)
  • $status:交易结果(200=成交,404=缺货)
  • $body_bytes_sent:商品重量(响应大小)

3. 高级定制实验室

3.1 移动端专用日志

log_format mobile '$remote_addr - $http_x_forwarded_for '
                  '$time_iso8601 '
                  '"$request" $status $body_bytes_sent '
                  '"$http_user_agent" $http_device_id '
                  'rt=$request_time uct="$upstream_connect_time"';

access_log /var/log/nginx/mobile.log mobile;

这个配置新增了:

  • $http_x_forwarded_for:穿透代理获取真实IP
  • $time_iso8601:标准时间格式(方便ELK解析)
  • $http_device_id:移动设备唯一标识
  • 响应时间三件套:请求处理时间、连接上游时间

3.2 电商大促日志模板

log_format promotion '$remote_addr:$remote_port '
                    '[API:$http_x_api_version] '
                    '"$request" $status $body_bytes_sent '
                    'Referer:"$http_referer" '
                    'UA:"$http_user_agent" '
                    'Upstream:$upstream_addr '
                    'Cache:$upstream_cache_status '
                    'RTT:$request_time UCT:$upstream_connect_time';

access_log /var/log/nginx/promotion.log promotion;

专为秒杀场景设计:

  • 记录客户端端口号(分析异常请求)
  • 显式标注API版本(防止版本兼容问题)
  • 上游服务器信息(负载均衡分析)
  • 缓存命中状态(优化缓存策略)

4. 存储路径规划局

4.1 时间分割日志

access_log /var/log/nginx/access_$year-$month-$day.log;

实际效果:

/var/log/nginx/access_2023-08-01.log
/var/log/nginx/access_2023-08-02.log

4.2 多维度分类存储

# 按业务类型划分
map $http_x_biz_type $biz_type {
    default "unknown";
    "ec"    "ecommerce";
    "fin"   "finance";
}

# 按设备类型划分
map $http_user_agent $device_type {
    ~*mobile  "mobile";
    ~*pad     "tablet";
    default   "desktop";
}

access_log /var/log/nginx/$biz_type/$device_type.log;

生成路径示例:

/var/log/nginx/ecommerce/mobile.log
/var/log/nginx/finance/desktop.log

5. 性能调优车间

5.1 缓冲区配置

access_log /var/log/nginx/access.log main buffer=32k flush=5m;

参数解读:

  • buffer=32k:攒够32KB再写入磁盘
  • flush=5m:最多5分钟强制刷盘一次

5.2 条件日志

# 只记录4xx/5xx错误
map $status $loggable {
    ~^[23]  0;  # 2xx/3xx不记录
    default 1;  # 其他状态码记录
}

access_log /var/log/nginx/error.log main if=$loggable;

6. 配套工具流水线

6.1 日志分析示例(AWK)

# 统计每小时请求量
awk '{print $4}' access.log | 
cut -d: -f2 | 
sort | 
uniq -c

# 输出示例:
# 132 10
# 234 11
# 189 12

6.2 Logrotate配置

/var/log/nginx/*.log {
    daily
    missingok
    rotate 30
    compress
    delaycompress
    notifempty
    sharedscripts
    postrotate
        /usr/bin/killall -s USR1 nginx
    endscript
}

7. 避坑指南手册

7.1 变量使用禁区

# 错误示例:在log_format中使用未定义变量
log_format error_format "$undefined_variable";

# 正确做法:先确认变量是否可用
nginx -V 2>&1 | grep -o with-http_realip_module

7.2 权限问题调试

# 查看日志目录权限
ls -ld /var/log/nginx

# 临时测试写入权限
sudo -u nginx touch /var/log/nginx/test.log

8. 场景适配方案

8.1 微服务架构

log_format microservice '$service_name '
                       '$upstream_addr '
                       '$request_id '
                       '$http_x_b3_traceid';

access_log syslog:server=logstash:5140 microservice;

8.2 安全审计需求

log_format security '$remote_addr '
                   '$http_x_forwarded_for '
                   '$time_iso8601 '
                   '$request_method '
                   '$request_uri '
                   '$status '
                   '$http_reference '
                   '$http_user_agent '
                   '$ssl_cipher '
                   '$ssl_protocol';

9. 技术选型对比表

方案 优点 缺点 适用场景
默认日志 零配置开箱即用 信息量有限 简单测试环境
自定义格式 灵活定制字段 需要熟悉变量体系 生产环境
syslog远程存储 集中管理方便 增加网络依赖 分布式系统
条件日志 节省存储空间 可能丢失有效信息 错误排查场景

10. 终极实践建议

  1. 字段选择黄金法则:确保每个字段都有明确的分析用途
  2. 性能平衡点:单个日志行建议控制在256字节以内
  3. 版本兼容性:不同Nginx版本支持的变量可能不同
  4. 安全红线:永远不要记录敏感信息(如密码、token)
  5. 生命周期管理:从第一天就规划日志归档策略

通过合理配置,你的Nginx日志可以从杂乱无章的监控录像,变成自带标签分类的智能安防系统。记住,好的日志配置应该是:在需要的时候能快速找到线索,在平静的日子里安静地待在磁盘角落。