要让Nginx记录更详细的客户端访问信息,需先用log_format定义字段组合(如真实IP、响应时间等),再用access_log启用该格式;默认格式仅含基础字段,扩展须手动配置。

要让 Nginx 记录更详细的客户端访问信息,关键在于两步:先用 log_format 定义你想要的字段组合,再用 access_log 指令启用它。默认的 combined 或 main 格式只含基础字段,扩展需手动配置。
定义含真实 IP 和响应时间的日志格式
当 Nginx 前有反向代理(如 CDN、负载均衡器)时,$remote_addr 只能拿到代理的 IP。应优先使用 $http_x_forwarded_for 获取客户端真实地址,并加入性能相关变量便于排障:
-
$http_x_forwarded_for:取请求头中第一个非空 IP(注意需上游代理正确设置该头) -
$request_time:Nginx 处理整个请求的总耗时(秒,精确到毫秒) -
$upstream_response_time:与后端服务交互的响应耗时(若为静态资源则为空) -
$sent_http_content_type:实际返回的内容类型(如text/html、application/json) -
$server_name:匹配的虚拟主机名,便于多站点日志区分
示例配置(放在 http 块内):
'$status $body_bytes_sent "$http_referer" "
"$http_user_agent" "$server_name" '
'$request_time $upstream_response_time $sent_http_content_type;'
在 server 或 location 中启用该格式
access_log 必须引用上面定义的格式名(如 detailed),且路径需确保 Nginx 进程有写入权限:
- 若想全局生效,加在
http块里;若只对某个站点生效,加在对应server块内 - 支持缓存写入提升性能,例如:
access_log /var/log/nginx/access.log detailed buffer=64k flush=1s; - 可按条件过滤日志,避免记录健康检查等无意义请求:
access_log /var/log/nginx/access.log detailed if=$loggable;(需配合map指令定义$loggable)
验证与调试要点
配置完成后不能直接生效,需重载而非重启:
- 执行
nginx -t确认语法无误 - 运行
nginx -s reload加载新配置 - 用
tail -f /var/log/nginx/access.log观察新格式是否输出,重点检查$http_x_forwarded_for是否为真实客户端 IP(若仍显示代理 IP,需确认上游是否透传该头) - 若
$upstream_response_time字段全为空,说明当前请求未经过 upstream(如静态文件直出),属正常现象
常见增强字段参考
根据分析需求可灵活添加以下变量:
-
$scheme:HTTP 或 HTTPS -
$request_length:请求头+请求体总长度(字节) -
$bytes_sent:发送总字节数(含响应头) -
$sent_http_x_cache:缓存命中状态(如HIT/MIS,需自定义响应头) -
$geoip_country_code:需加载 geoip 模块,记录国家代码
字段过多会增大日志体积,建议按监控目标精简选用。


















