Nginx:如何彻底禁用请求主体缓冲

Nginx:如何彻底禁用请求主体缓冲

我正在尝试设置麦德索尼克在我的 Ubuntu 机器上安装并让 Nginx 在它前面运行。问题是,当我尝试通过 Web 界面上传内容时,我总是收到此警告:

31115#0: *14 a client request body is buffered to a temporary file

这也解释了为什么上传窗口上的进度条不起作用。这是我的相关 Nginx 配置:

    # proxy the madsonic server here
    location / {
            proxy_pass                      https://madsonic-server/;
            proxy_redirect                  off;
            proxy_buffering                 off;
            proxy_request_buffering         off;
            allow                           all;
            proxy_http_version              1.1;

            proxy_set_header                Host $http_host;
            proxy_set_header                X-Real-IP $remote_addr;
            proxy_set_header                X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header                X-Forwarded-Host $server_name;
            proxy_set_header                X-Forwarded-Proto $scheme;

            client_body_buffer_size         0;
            client_max_body_size            0;
            proxy_max_temp_file_size        0;
            proxy_read_timeout              18000;
            proxy_send_timeout              18000;

            gzip                            off;
    }

我目前正在使用 Nginx 1.9.12。

我想要实现的是让 Nginx 完全不使用请求体缓冲区并将请求主体直接传递给 Madsonic,无论大小如何。这可能吗?如果可以,正确的配置是什么?

其他问题似乎可以通过设置缓冲区大小的方式来回答。我不需要任何缓冲区。我想直接将请求主体传递给 Madsonic。

答案1

我在为 Docker 注册表设置 Nginx 代理时遇到了同样的问题。我最终这样做了:

client_max_body_size 0;
proxy_http_version 1.1;
proxy_request_buffering off;

client_max_body_size仍然必须为 0 才能防止错误,但watch -n 1 du -hs .明显显示出差异。缓冲使数据在请求后出现,而无缓冲使数据在请求期间出现。

proxy_http_version 1.1由于分块编码,这是必需的。引自 Nginx 文档:

当使用 HTTP/1.1 分块传输编码发送原始请求体时,无论指令值如何,请求体都将被缓冲,除非启用了 HTTP/1.1 进行代理。

答案2

我使用此区域来禁用代理缓冲

proxy_buffering                 off;

相关内容