Nginx中proxy模块变量无独立生命周期,其值在对应处理阶段动态生成并绑定请求内存池。如$proxy_host在proxy_pass执行时实时解析,$proxy_add_x_forwarded_for在proxy_set_header阶段求值,$upstream_addr等则延迟至后端响应后才可用。

Nginx 中 ngx_http_proxy_module 本身不定义独立的“变量生命周期”概念,它所使用的变量(如 $proxy_host、$proxy_port、$proxy_add_x_forwarded_for 等)本质上是 Nginx 核心变量机制的一部分,其存在时间由请求处理阶段和内存管理策略决定。
变量在请求上下文中动态生成
绝大多数 proxy 模块相关变量(如 $proxy_host、$proxy_port、$proxy_url)并非预分配或长期驻留,而是在 proxy_pass 指令执行时、实际构造后端请求 URI 或头部前的瞬间计算得出。它们依赖当前请求的上下文(如 $host、$uri、$args、rewrite 后结果等),每次访问都会重新求值。
- 例如
$proxy_add_x_forwarded_for:在 proxy_set_header 阶段展开,逻辑是 “若原始请求含 X-Forwarded-For,则追加客户端真实 IP;否则直接设为 $remote_addr”,该值只在此 header 设置时刻有效 -
$proxy_host和$proxy_port:由proxy_pass的配置解析而来(如proxy_pass http://backend;或proxy_pass http://127.0.0.1:8080/;),不随 upstream 变化而缓存,每次转发都按当前 location 配置实时提取
生命周期绑定到请求内存池(request pool)
Nginx 为每个 HTTP 请求分配一个内存池(r->pool),所有在请求处理过程中动态生成的字符串变量值(包括 proxy 模块拼接的 URL、header 值等)都分配在此池中。
- 这些变量值的内存 在请求结束时由 Nginx 自动释放,无需手动清理
- 变量本身(如结构体字段)是请求结构体
ngx_http_request_t的一部分,随请求创建而初始化,随请求销毁而回收 - 不存在跨请求复用或全局缓存——每个请求的 proxy 变量值相互隔离
部分变量受 rewrite 阶段影响,不可在早期阶段使用
像 $proxy_host、$proxy_port 这类变量,其值依赖 proxy_pass 的最终解析结果,而该解析发生在 rewrite 阶段之后、access 阶段之前(具体在 NGX_HTTP_CONTENT_PHASE 的 proxy handler 中)。因此:
- 不能在
if、set或 rewrite 规则中安全引用它们——此时值尚未确定,可能为空或未定义 -
$proxy_url是伪变量,仅用于日志记录(log_format),不在请求处理中参与逻辑,其值在日志写入时才构建 - 真正可提前使用的 proxy 相关值,应通过
map或自定义变量在 rewrite 阶段显式构造
upstream 相关变量(如 $upstream_addr)延迟到转发完成后才可用
虽然属于 proxy 模块常用配套变量,但 $upstream_addr、$upstream_status、$upstream_response_time 等,其值由 upstream 模块在后端通信结束后写入,因此:
- 在
proxy_set_header中不可用(此时后端连接尚未建立) - 仅在
log_format、add_after_body、或者post_action等请求尾部阶段才保证有值 - 若后端超时或失败,部分变量可能为空或包含错误标识(如
"-"或"504")

















