nginx log文件最佳配置
1. 日志格式优化
推荐使用组合格式记录关键信息,并启用压缩节省空间:
# 主日志格式(包含请求时间、IP、URL、响应时间等)
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'$request_time $upstream_response_time';
# 静态资源访问日志(减少不必要字段)
log_format static '$remote_addr - [$time_local] "$request" '
'$status $body_bytes_sent $request_time';
2. 按业务拆分日志
将不同类型的请求分开记录,便于后续分析:
http {
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log warn;
# 静态资源日志
location ~* \.(js|css|png|jpg|gif|ico|svg|woff|woff2|ttf|eot)$ {
access_log /var/log/nginx/static.log static;
}
# API 接口日志
location /api/ {
access_log /var/log/nginx/api.log main;
}
# 管理后台日志
location /admin/ {
access_log /var/log/nginx/admin.log main;
}
}
3. 动态控制日志开关
通过变量动态控制是否记录日志,减少非必要日志:
http {
# 定义变量:跳过健康检查请求的日志
map $request_uri $loggable {
default 1;
~*/healthcheck 0;
}
access_log /var/log/nginx/access.log main if=$loggable;
}
4. 错误日志配置
设置适当的错误日志级别,并监控关键错误:
error_log /var/log/nginx/error.log warn; # 推荐使用 warn 级别
# 监控特定错误(示例:记录所有 500 错误)
server {
error_page 500 502 503 504 /50x.html;
location = /50x.html {
access_log off; # 关闭错误页面的访问日志
}
}
5. 日志轮转配置
使用 logrotate 定期切割日志,避免单个文件过大:
# /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily # 每天切割一次
missingok # 日志文件不存在时不报错
rotate 30 # 保留 30 天的日志
compress # 压缩旧日志
delaycompress # 延迟压缩,避免当前日志被压缩
notifempty # 空日志不切割
create 0640 nginx adm # 创建新日志文件,设置权限和所有者
sharedscripts # 所有日志处理完成后只执行一次脚本
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
6. 性能优化建议
- 异步写入:使用
access_log /path/to/log buffer=32k flush=5m;减少磁盘 IO - 关闭不必要日志:静态资源、健康检查等可关闭或简化日志
- 定期清理:结合 logrotate 和自动化脚本删除过期日志
- 监控分析:集成 ELK Stack 或 Prometheus 进行实时监控和分析
通过以上配置,可在保证日志完整性的同时,提升性能并简化后续分析工作。根据实际业务需求,你还可以进一步定制日志格式和存储策略。
nginx 最佳配置防止log文件将硬盘空间占满
要防止 Nginx 的 log 文件占满硬盘空间,除了前面提到的日志轮转配置外,还可以从以下几个方面进行优化:
- 优化日志格式:精简日志格式,只记录关键信息。例如:
log_format concise '$remote_addr - $time_local "$request" $status';
access_log /var/log/nginx/access.log concise;
这样的配置只记录了客户端 IP、请求时间、请求内容和响应状态码,减少了不必要的字段,从而减小日志文件的大小。
- 按条件记录日志:可以根据某些条件来决定是否记录日志,比如对健康检查请求不记录日志。示例如下:
map $request_uri $loggable {
default 1;
~*/healthcheck 0;
}
access_log /var/log/nginx/access.log main if=$loggable;
- 限制日志文件大小:使用
max_size指令限制日志文件的大小,当文件达到指定大小时,Nginx 会自动切换到新的日志文件。例如:
access_log /var/log/nginx/access.log main max_size=100m;
error_log /var/log/nginx/error.log warn max_size=50m;
- 合理设置日志目录:将日志文件存储到独立的分区或磁盘上,避免与系统文件或其他重要数据存放在一起,防止日志占满根分区空间4。同时,确保日志目录所在的文件系统有足够的空间来容纳日志文件的增长。
- 定期清理或归档日志:可以使用脚本结合
cron定时任务来删除过期的日志文件,或者将旧日志归档到其他存储介质上,如磁带、网络存储等。例如,每天凌晨 2 点删除 7 天前的日志文件,可以在crontab中添加如下任务:
0 2 * * * find /var/log/nginx -type f -mtime +7 -exec rm -f {} \;
- 监控磁盘空间和日志增长4:使用监控工具如 Prometheus+Grafana、Zabbix 等监控磁盘空间使用情况,并设置告警阈值,当磁盘使用超过一定比例(如 80%)时发出警报,以便及时采取措施。同时,关注日志文件的增长趋势,根据业务量的变化适时调整日志管理策略。

浙公网安备 33010602011771号