with proxy_pass - 当客户端的连接速度比上游服务器慢时,NGINX 如何处理这种情况,比如上游服务器以 12MBPS 将内容推送到 nginx 服务器,但读取内容的客户端使用 1.2MBPS 连接?
location / {
proxy_buffering off;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_buffer_size 128k;
proxy_buffers 100 128k;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass https://proxy.backend.server;}
在这种情况下,proxy_buffering被关闭,当客户端到达数据中的那个点时,Nginx是否保存要服务的数据?
答案1
可以从文档中找到proxy_buffering
:
当禁用缓冲时,响应将在收到后立即同步传递到客户端。 nginx 不会尝试从代理服务器读取整个响应。 nginx一次可以从服务器接收的数据的最大大小由proxy_buffer_size指令设置。
换句话说,NGINX 保持与后端的连接的时间更长(只要客户端需要下载整个响应)。禁用缓冲后,客户端和后端之间的连接是同步的。
是否要关闭代理缓冲取决于资源。通常有一个像 PHP-FPM 这样的资源匮乏的后端,因此不建议在客户端下载响应期间让它一直挂着。因此,对于 PHP-FPM 作为后端(fastcgi_buffering 是正确的指令),我会保留它。
另外值得注意的是,即使禁用代理缓冲,仍然存在一些缓冲,例如 proxy_buffer_size 指令。这是一个介绍正确调整尺寸。它仅包含标题。 128k 是(可能)典型 HTML 页面的大小。 HTTP 标头比这小得多。