$request_id

$request_id 变量包含 NGINX 处理的每个请求的唯一标识符。 — NGINX Core (HTTP)

$request_id NGINX Core (HTTP)

说明

$request_id 变量为到达 NGINX 服务器的每个入站请求提供唯一标识。该标识对于请求跟踪和日志记录非常有用,尤其在分布式系统或微服务架构中,通过在多个服务间关联日志可以帮助调试和监控。默认情况下,如果请求未包含显式的 `X-Request-ID` 头,NGINX 会生成并分配一个 UUID(通用唯一标识符)作为请求 ID。这意味着无论客户端是否指定该头,NGINX 处理的每个请求都可以被跟踪。 当请求到达 NGINX 服务器时,可能会经历若干处理步骤(例如身份验证、访问规则等),而 $request_id 在这些过程中保持一致。重要的是通过使用 `request_id` 模块来启用此变量,该模块在精简的 NGINX 构建中可能不存在。在涉及外部系统或服务(例如 API 网关或负载均衡器)的情况下,通过请求头传递请求 ID 能确保在整个请求生命周期中实现一致的跟踪。 $request_id 的典型值采用 UUID 字符串格式,以确保全局唯一性。例如,示例输出可能类似 `3e4e989c-45c6-4de4-b7d6-2b4ebc4fc417`。这对于在不同系统组件或层之间识别并关联属于同一请求的日志条目非常有帮助。

配置示例

http {
    log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$_http_referer" "$_http_user_agent" "$request_id"';

daily_log { 
    access_log /var/log/nginx/access.log main;
    
    proxy_set_header X-Request-ID $request_id;
} 
}

子系统

http

可缓存

上下文

http, server, location

确保在你的 NGINX 构建中启用了 request_id 模块,因为某些精简构建可能不包含它。

该变量要到其被分配的请求处理阶段才可用,因此在较早的阶段(例如 server block)使用它可能会产生意想不到的结果。

除非明确配置,否则并非所有上游服务都支持或能够记录该 request ID。