【问题标题】:nginx proxy request buffering is not working as expectednginx 代理请求缓冲未按预期工作
【发布时间】:2018-04-17 22:49:56
【问题描述】:

这是我的 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 的文件,然后一次将其传递给后端(即 tornado-python),但 nginx 以 1M 或 2M 将其传递给后端块,这种行为导致非常高的cpu使用率,更高的系统负载和更低的上传速度,这种行为与将proxy_request_buffering设置为关闭没有太大区别,所以我认为我在这里做错了

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

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

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

【问题讨论】:

    标签: http nginx file-upload upload tornado


    【解决方案1】:

    看来您需要打开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;
    }
    

    不确定您的上游服务器获得了多少流量,但我可以想象这么大的缓冲区效率不高……您使用的上游网络服务器需要这么大的缓冲区吗?也许尝试一次将缓冲区增加 1m,直到它处于一个不错的最佳位置。

    发件人: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

    【讨论】:

    • 感谢您的回复,但我不认为 proxy_buffers 是这里的答案,我用您提供的配置进行了很多测试,但我认为它与后端对客户端的响应更相关,要么方式,结果没有变化,正如我所说,我认为 proxy_buffers 是关于响应的,我需要改变关于请求的行为
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-11
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 2023-01-20
    相关资源
    最近更新 更多