nginx 中 $server_addr 变量用于记录实际响应请求的本机 ip 地址,可在 log_format 中加入以标识多节点部署中的具体服务节点,其值为监听套接字绑定的真实 ipv4/ipv6 地址,区别于不可信的 $host 和用于虚拟主机匹配的 $server_name。

在 Nginx 中,access_log 默认不记录处理请求的服务器(即本机)IP 地址,因为它关注的是客户端行为。但若需明确知道是哪台服务器(尤其是多节点部署时)响应了该请求,可通过内置变量 $server_addr 实现——它代表 Nginx 实际监听并响应请求的本地 IP 地址。
使用 $server_addr 记录服务器 IP
只需在自定义 log_format 中加入 $server_addr 变量即可。它返回绑定监听套接字的实际 IP(如 192.168.5.10 或 10.0.2.3),而非域名或 0.0.0.0 这类通配地址。
- 若 server 块显式监听特定 IP(如
listen 192.168.5.10:80),$server_addr就是该 IP - 若监听
*:80或0.0.0.0:80,Nginx 会取实际接收连接的网卡 IP,通常为路由路径上的首选地址 - 该变量始终为 IPv4 或 IPv6 字符串,无需额外解析
配置示例:在日志中包含服务器 IP
在 http 块中定义增强格式:
log_format with_server '$server_addr $remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'rt:$request_time u:$upstream_response_time';
然后在 server 或 location 中启用:
access_log /var/log/nginx/access.log with_server buffer=32k;
日志行将类似:
对设计或页面进行 WCAG 2.1 AA 无障碍审计。触发关键词:“audit accessibility”、 “check a11y”、 “is this accessible?” 或在审查设计时使用。
区分 $server_addr 与 $host、$server_name
注意三者用途不同:
-
$server_addr:真实响应请求的本机 IP(网络层地址) -
$host:来自请求头Host字段的值(可能被篡改,不可信) -
$server_name:当前server块中配置的server_name(如api.example.com),用于虚拟主机匹配
排查多实例混用或 VIP 漂移问题时,$server_addr 是唯一能准确标识物理/逻辑服务节点的字段。
补充:配合真实客户端 IP 使用更完整
若同时用了反向代理(如 LB 或 CDN),建议组合 $realip_remote_addr(需配置 set_real_ip_from)和 $server_addr:
log_format full_client_server '$server_addr $realip_remote_addr - [$time_local] "$request" $status';
这样一行日志就能同时体现「谁(客户端)」在「哪台机器(服务端)」上发起了请求,对容量分析、故障隔离和灰度验证非常实用。










