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. 终极实践建议
- 字段选择黄金法则:确保每个字段都有明确的分析用途
- 性能平衡点:单个日志行建议控制在256字节以内
- 版本兼容性:不同Nginx版本支持的变量可能不同
- 安全红线:永远不要记录敏感信息(如密码、token)
- 生命周期管理:从第一天就规划日志归档策略
通过合理配置,你的Nginx日志可以从杂乱无章的监控录像,变成自带标签分类的智能安防系统。记住,好的日志配置应该是:在需要的时候能快速找到线索,在平静的日子里安静地待在磁盘角落。