nginx日志分访问日志和错误日志:访问日志记录客户端请求详情(ip、时间、url、状态码、响应时间等),默认路径/var/log/nginx/access.log,支持自定义格式与缓冲压缩;错误日志记录运行异常(配置错误、服务不可达等),默认路径/var/log/nginx/error.log,仅支持级别设置(如warn)。

要真正用好 Nginx 日志,关键不是“有没有日志”,而是“能不能快速定位问题、看懂行为模式、守住系统底线”。下面从三类核心日志出发,讲清楚它们在哪、记什么、怎么查、怎么管。
访问日志:谁在什么时候干了什么
访问日志(access log)是用户行为的原始快照,记录每次 HTTP 请求的完整上下文。默认格式只含基础字段,但生产环境强烈建议自定义,加入真实 IP、响应时间、协议、主机名等关键信息:
推荐配置示例(放在 http 块中):
log_format main_detail '$http_x_forwarded_for - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" "$http_user_agent" '
'$request_time $upstream_response_time $scheme $host $request_method $request_uri';
access_log /var/log/nginx/access.log main_detail buffer=32k flush=1m gzip;
说明:
– $http_x_forwarded_for 用于穿透 CDN 或代理获取真实客户端 IP;
– $request_time 和 $upstream_response_time 是性能排查核心指标;
– buffer + flush + gzip 组合可显著降低 I/O 压力并节省磁盘空间。
错误日志:系统出问题时的第一线索
错误日志(error log)不记录请求过程,只聚焦异常事件,比如配置加载失败、worker 崩溃、SSL 握手错误、上游服务不可达等。它不支持自定义格式,但支持分级输出:
常用配置:
error_log /var/log/nginx/error.log warn;
# 级别从低到高:debug、info、notice、warn、error、crit、alert、emerg
# 生产环境一般设为 warn 或 error,避免日志爆炸
注意:
– 错误日志路径若未显式指定,默认落在 /var/log/nginx/error.log 或容器内 /data/logs/fallback_error.log(如 Nginx Proxy Manager);
– 某些严重错误(如 master 进程退出)可能只出现在系统 journal 或容器启动日志中,需一并检查。
深度分析:用命令行挖出隐藏信息
不依赖第三方工具,纯 shell 就能完成多数日常分析任务:
- 查高频 IP(防刷/攻击初筛):awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10
- 找 4xx/5xx 错误集中路径:awk '$9 ~ /^(4|5)[0-9]{2}$/ {print $7}' access.log | sort | uniq -c | sort -nr | head
- 定位慢请求(>2s):awk '$10 > 2 {print $10, $7}' access.log | sort -nr | head -10
- 统计移动端访问占比:grep -i "mobile\|android\|iphone" access.log | wc -l && wc -l access.log
- 实时跟踪 API 调用(如 /api/v1/):tail -f access.log | grep '"GET /api/'
自动化日志切割:不让磁盘被撑爆
靠 Nginx 自身 reload 切割日志不可靠,推荐使用 logrotate 配合定时任务,稳定可控:
/etc/logrotate.d/nginx 示例:
/var/log/nginx/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 644 www-data www-data
sharedscripts
postrotate
if [ -f /run/nginx.pid ]; then
kill -USR1 `cat /run/nginx.pid`
fi
endscript
}
说明:
– daily 表示每天轮转一次;
– rotate 30 保留最近 30 份压缩日志;
– postrotate 中的 kill -USR1 是通知 Nginx 重新打开新日志文件的关键步骤;
– 容器部署时,若无法直接操作宿主机 logrotate,可在容器内启用 cron + logrotate,或改用 Docker 日志驱动(如 local + max-size/max-file)做替代。











