nginx代理请求缓冲未按预期工作



这是我的nginx配置:

worker_processes auto;
user nginx;
events {
worker_connections 1024;
use epoll;
}
http {
tcp_nodelay               on;
add_header Cache-Control  no-cache;
upstream servers {
server                127.0.0.1:9999;
server                127.0.0.1:9998;
}
proxy_request_buffering   on;
server {
listen 80;
client_max_body_size 200M;
client_body_buffer_size 200M;
server_name           localhost;
location / {
try_files    $uri @proxy_upload;
}
location @proxy_upload {
proxy_pass_request_body on;
proxy_pass              http://servers;
}
}
}

我试着上传文件,我正在做一些类似于分块上传的事情,文件超过2G,客户端分块发送文件,nginx和脚本正在工作,但nginx没有按预期工作

你看,我打开了proxy_request_buffering,所以我希望nginx缓冲所有200M的文件,然后一次将其传递到后端(这是龙卷风python),但nginx将其以1M或2M的块传递到后端,这种行为会导致更高的cpu使用率、更高的系统负载和更低的上传速度,这种行为与关闭proxy_request_buffering没有太大区别,所以我觉得我在这里做错了什么

为什么nginx没有正确缓冲,我应该如何让nginx缓冲整个请求,然后立即传递它?

我尝试使用post_action,但无法将请求正文传递给后端

更新:Nginx缓冲正确,我的意思是客户端上传整个文件后,它会立即将请求体传递到后端,但Nginx会将请求体以较小的块传递到后端而不会一次传递,它有整个请求体,但不会一次传过整个请求体。我该如何告诉Nginx立即将请求主体传递到后端?

看起来您需要打开proxy_buffering,设置proxy_buffers来设置缓冲区的数量和大小,可能还需要proxy_buffers_size来确保它不会过度使用内存:

location @proxy_upload {
proxy_buffering on;
proxy_buffers 10 200m;
proxy_buffer_size 1000m;
proxy_pass_request_body on;
proxy_pass              http://servers;
}

不确定你的上游服务器有多少流量,但我可以想象这么大的缓冲区并没有那么有效。。。您在上游使用的哪个Web服务器需要如此大的缓冲区?也许试着一次增加缓冲区1米,直到它达到一个合适的最佳点。

发件人:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffers

以及:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffer_size

最新更新