为什么 add_header 中的 $upstream_response_time 是一个连字符?

为什么 add_header 中的 $upstream_response_time 是一个连字符?

鉴于/etc/nginx/nginx.conf

events {}

http {
    server {
        listen 8000;

        location / {
            proxy_pass  http://localhost:8001;

            add_header X-Trip-Time    $request_time;
            add_header X-Process-Time $upstream_response_time;
        }
    }
}

跑步:

python3 -u -m http.server 8001 > app.log 2>&1 & sudo nginx

其次是:

curl -i localhost:8000

显示这两个标题:

X-Trip-Time: 0.001
X-Process-Time: -

我见过相关问题,其中说:

如果在连接到上游时出现内部错误或者从缓存中获取答复,则变量设置为 -

但我的上游服务器已成功连接,如下所示cat app.log

127.0.0.1 - - [03/Feb/2021 19:41:44] "GET / HTTP/1.0" 200 -

$upstream_response_time相等-但仍然$request_time按预期工作的原因是什么?

答案1

我收到了这个答案在 nginx 邮件列表上:

这是因为响应标头是在知道 $upstream_response_time 之前发送的:只有当从上游服务器完全收到响应(包括响应主体)时才知道,而这发生在响应标头发送到客户端之后。如果您想在响应标头中返回某些内容,请考虑使用 $upstream_header_time 变量(http://nginx.org/r/$upstream_header_time)。

我在文档中找不到有关 nginx 如何缓冲的任何信息回应(只能找到请求的文档)以及是否可以配置,但可以肯定的是更改$upstream_response_time$upstream_header_time正在运行,而且从日志来看时间非常接近,至少当响应主体大小很小时,比如我的情况。

相关内容