Nginx日志配置与优化
合理配置和优化 Nginx 日志可兼顾问题排查能力与写入性能。
自定义日志格式
JSON 格式日志
适合 ELK 等日志系统采集:
nginx
log_format json escape=json
'{"time":"$time_iso8601",'
'"remote_addr":"$remote_addr",'
'"request":"$request",'
'"status":$status,'
'"body_bytes_sent":$body_bytes_sent,'
'"request_time":$request_time,'
'"http_referer":"$http_referer",'
'"http_user_agent":"$http_user_agent"}';
access_log /var/log/nginx/access.json.log json;
精简格式
减少无用字段,降低磁盘写入:
nginx
log_format minimal '$remote_addr [$time_local] "$request" $status '
'$body_bytes_sent $request_time';
access_log /var/log/nginx/access.minimal.log minimal;
日志缓冲优化
缓冲可减少磁盘 I/O:
nginx
access_log /var/log/nginx/access.log main buffer=64k flush=15s;
| 参数 | 说明 |
|---|---|
buffer=64k | 日志缓冲区大小 |
flush=15s | 最长 15 秒强制刷盘 |
gzip=1 | 可选,压缩写入日志 |
注意事项
- 缓冲日志在服务器崩溃时会丢失未刷盘数据
- 高频接口可加大 buffer,低频场景无需缓冲
按站点分离日志
nginx
server {
listen 80;
server_name site1.com;
access_log /var/log/nginx/site1.access.log main;
error_log /var/log/nginx/site1.error.log warn;
}
server {
listen 80;
server_name site2.com;
access_log /var/log/nginx/site2.access.log main buffer=32k;
}
动态开关日志
运行时调整日志级别,无需重载:
nginx
# 使用变量控制
map $args $log_status {
~nolog 0;
default 1;
}
access_log /var/log/nginx/access.log main if=$log_status;
请求携带 ?nolog 参数时不记录日志。
错误日志分级
nginx
# 全局使用 error 级别
error_log /var/log/nginx/error.log error;
# 特定 server 使用 warn
server {
error_log /var/log/nginx/site.error.log warn;
}
生产环境建议:
- 日常:
error级别 - 排查问题:临时改为
warn或info
日志轮转配置
nginx
/var/log/nginx/*.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 0640 www-data adm
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 $(cat /var/run/nginx.pid)
endscript
}
| 参数 | 说明 |
|---|---|
daily | 每天轮转 |
rotate 30 | 保留 30 份 |
compress | 压缩旧日志 |
delaycompress | 延迟压缩(保留最近一份不压缩) |
USR1 | 通知 Nginx 重新打开日志文件 |
关闭无用日志
健康检查接口不记录:
nginx
location /health {
access_log off;
log_not_found off;
return 200 "ok";
}
关闭 404 错误日志:
text
location ~ \.(ico|png|gif)$ {
log_not_found off;
access_log off;
}
要点总结
- 自定义 log_format 可输出 JSON 格式,便于日志采集分析
- buffer 和 flush 参数优化日志写入性能
- 按站点分离日志便于排查和归档
- 生产环境 error_log 使用 error 级别,排查时临时调低
- 日志轮转通过 logrotate + USR1 信号实现,避免丢失日志
- 健康检查、静态资源等接口建议关闭访问日志
📝 发现内容有误?点击此处直接编辑