Nginx 作为高性能 Web 服务器,日志系统是它的重要组成部分。通过合理配置与分析访问日志(access log)和错误日志(error log),可以快速定位问题、统计流量、优化配置,甚至监控攻击行为。
本文将详解 Nginx 的日志类型、配置方式、调试技巧和常见分析方法,帮助你用日志驱动系统稳定性和运维效率提升。
Nginx 主要有两种日志:
此外,还有一些模块的内部日志(如 stream、Lua 日志),也会写入 error log 中。
默认配置:
access_log /var/log/nginx/access.log;
你可以自定义日志格式,例如:
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" $request_time';
access_log /var/log/nginx/access.log main;
常用变量说明:
$remote_addr:客户端 IP $request:请求行,如 GET /api HTTP/1.1 $status:响应状态码 $request_time:整个请求处理耗时 $body_bytes_sent:返回给客户端的字节数 $http_user_agent:客户端设备和浏览器信息 建议将日志格式统一设为 main,便于后续分析与统计。
默认路径通常为:
error_log /var/log/nginx/error.log error;
日志级别从低到高依次为:
debug:最详细的调试信息 info:普通运行信息 notice:重要但不影响运行的信息 warn:警告 error:错误信息 crit:严重错误 alert 和 emerg:紧急错误,系统级故障调试时推荐暂时将日志级别调高:
error_log /var/log/nginx/error.log debug;
生产环境建议使用 warn 或 error,避免日志过大影响性能。
在配置中加入调试输出:
rewrite_by_lua_block {
ngx.log(ngx.ERR, "当前请求 URI: ", ngx.var.request_uri)
}
你可以给不同 location 加上不同日志格式或 access_log 路径,来判断请求的匹配逻辑:
location /api/ {
access_log /var/log/nginx/api_access.log main;
}
如果某类请求频繁又不需要记录,可以临时关闭访问日志:
location ~* \.(png|jpg|js|css)$ {
access_log off;
}
在代理请求中,如果后端返回错误,可以增加:
proxy_intercept_errors on;
这样可以捕捉并记录完整后端异常信息。
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head
awk '{print $7}' access.log | sort | uniq -c | sort -nr | head
awk '$NF > 1 {print $7, $NF}' access.log | sort -k2 -nr | head
上面示例中 $NF 表示日志行最后一列(通常是 $request_time),可用于抓慢请求。
grep " 500 " access.log
你也可以筛选 404、502 等特定状态码,帮助排查失效接口或后端异常。
安装并运行:
goaccess -f /var/log/nginx/access.log -o report.html --log-format=COMBINED
生成一份直观的访问报告。
支持日志高亮、搜索、过滤等功能:
lnav /var/log/nginx/access.log
tail -f /var/log/nginx/error.log | grep "timeout"
可以实时跟踪错误信息。
Nginx 的日志系统不仅是排查问题的基础工具,也可以用于性能监控、安全审计和访问分析。通过合理设置日志格式、日志级别,并借助一些命令或工具,就能快速掌握服务运行状态。
建议日常开发和运维中养成“看日志说话”的习惯,让日志成为你的核心调试手段。
非著名程序员,全栈开发工程师,长期专注系统开发与架构设计。
功能待开通!
nginx服务器返回200但是浏览器报错 net::ERR_INCOMPLETE_CHUNKED_ENCODING 原因是nginx在获得后端服务器返回数据时,数据过大需要存在临时文件中,但是当前运行nginx用户,没有该文件的读写权限 导致的。 如何证实 可以查看nginx的日志,会有以下类似错误 2018/03/22 16:11:35 [crit] 9519#0: *339625 open() "/var/lib/nginx/tmp/fastcgi/5/02/0000000025" failed 很明显,nginx无法写/var/lib/nginx/tmp/fastcgi/5/02/000
模式 含义 location = /uri = 表示精确匹配只有完全相等才会匹配成功 location ^~ /uri ^~ 表示对路由进行前缀匹配 location ~ /uri ~ 表示对路由进行正则匹配 location ~* /uri ~* 表示对路由进行不区分大小写的正则匹配 location /uri 不带任何修饰符也表示前缀匹配 location / 默认匹配,任何没有匹配到的uri 多个 location 配置的情况下匹配顺序为(匹配到某一等级就结束,同一规则时匹配长度长的优先): 首先精确匹配 = 其次前缀匹配 ^~ 其次是按文件中顺
推荐日志配置 log_format main 'remote_addr=[$remote_addr] http_x_forward=[$http_x_forwarded_for] time=[$time_local] request=[$request] ' 'status=[$status] byte=[$bytes_sent] elapsed=[$request_time] upstream_connect_time=[$upstream_connect_time] upstream_response_time=[$upstream_response_time] '
在使用 Nginx 做反向代理时,经常会遇到一些看似莫名其妙的问题,比如返回 502 错误、路径出错、真实 IP 丢失等等。本文总结了开发和部署中最常见的 Nginx 反向代理问题,并给出对应的排查和解决方案,帮助你快速定位和修复问题。 目录 一、502 Bad Gateway 二、路径拼接异常 三、获取不到真实客户端-IP 四、跨域请求失败 五、WebSocket 无法正常工作 六、请求体过大导致-413-错误 七、反向代理跳转失效 八、HTTPS-代理配置问题 九、文件下载异常或中断 十、缓存未生效或生效异常 总结 一、502 Bad Gateway 这个错误意味着 Nginx 无法成
stream { log_format proxy 'time=[$time_local] remote_addr=[$remote_addr]' ' protocol=[$protocol] status=[$status] byte_send=[$bytes_sent] byte_received=[$bytes_received] ' 'session_time=[$session_time] upstream_addr=[$upstream_addr] ' 'upstream_