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

Http nginx代理请求缓冲未按预期工作,http,nginx,file-upload,upload,tornado,Http,Nginx,File Upload,Upload,Tornado,这是我的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

这是我的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\u request\u buffering,所以我希望nginx缓冲所有200M的文件,然后立即将其传递给后端(tornado python),但nginx将其以1M或2M的块传递给后端,这种行为会导致非常高的cpu使用率、更高的系统负载和更低的上传速度,这种行为与将proxy\u request\u buffering设置为off没有太大区别,所以我认为我在这里做错了什么

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

我尝试使用post_操作,但无法将请求正文传递到后端


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

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

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米的缓冲区,直到达到一个合适的最佳点

发件人:


而且:

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

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米的缓冲区,直到达到一个合适的最佳点

发件人:


而且:

谢谢您的回复,但我不认为proxy_buffers是这里的答案,我用您提供的配置测试了很多,但我认为它更多地与对客户端的后端响应有关,无论哪种方式,结果都没有变化,正如我所说,我认为proxy_buffers是关于响应的,我需要改变RequestsHanks的行为以获得您的回复,但我不认为proxy_buffers是这里的答案,我用您提供的配置进行了很多测试,但我认为它更与客户端的后端响应相关,不管怎样,结果都没有变化,正如我所说的,我认为代理缓冲区是关于响应的,我需要改变请求的行为