![通过 nginx 反向代理将大文件(>2gb)上传到容器时出错](https://linux22.com/image/776569/%E9%80%9A%E8%BF%87%20nginx%20%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86%E5%B0%86%E5%A4%A7%E6%96%87%E4%BB%B6%EF%BC%88%3E2gb%EF%BC%89%E4%B8%8A%E4%BC%A0%E5%88%B0%E5%AE%B9%E5%99%A8%E6%97%B6%E5%87%BA%E9%94%99.png)
我正在docker容器中运行一个应用程序(https://github.com/filebrowser/filebrowser/),我正尝试上传非常大 (>2) GB 的文件。容器将应用程序公开在 localhost 上的非标准端口上,我通过反向代理连接到该端口(这样我可以在一台机器上运行多个应用程序)。问题是,当我上传超过 2097152 字节的文件时,它会出错。我可以看到文件已完全上传到 nginx,并且部分文件到达了容器化应用程序,但随后在 2097152 字节处挂起很长时间,然后出错,导致容器化应用程序出现意外的 EOF 错误。我怀疑 nginx 出了问题,因为当我直接将文件上传到容器化应用程序时,它工作正常。我尝试在 nginx 配置中添加各种指令,但不知所措。我的站点的 nginx 配置是:
server {
server_name example.com;
client_max_body_size 30g;
proxy_buffer_size 1024k;
proxy_buffers 4 1024k;
proxy_busy_buffers_size 1024k;
proxy_max_temp_file_size 10000m;
proxy_connect_timeout 10000;
proxy_send_timeout 10000;
proxy_read_timeout 10000;
send_timeout 10000;
client_header_timeout 10000;
client_body_timeout 10000;
location / {
proxy_pass http://localhost:8088/;
proxy_http_version 1.1;
proxy_cache_bypass $http_upgrade;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
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_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
proxy_connect_timeout 10000s;
proxy_send_timeout 10000s;
proxy_read_timeout 10000s;
}}
我在 nginx 中得到的错误是:
2022/04/14 20:26:56 [error] 3286524#3286524: *13184 connect() failed (111: Connection refused) while connecting to upstream, client: xxx.xxx.xxx.xxx, server: example.com, request: "POST /api/resources/Fedora-KDE-Live-x86_64-35-1.2.iso?override=false HTTP/1.1", upstream: "http://[::1]:8088/api/resources/Fedora-KDE-Live-x86_64-35-1.2.iso?override=false", host: "example.com", referrer: "https://example.com/files/"
编辑:经过大量挖掘,似乎解决方案是删除proxy_buffer_size
、proxy_buffers
和proxy_busy_buffer_size
并添加proxy_request_buffering off;
我不知道为什么这样做有效,但确实有效。配置中修改的行是:
# proxy_buffer_size 1024k;
# proxy_buffers 4 1024k;
# proxy_busy_buffers_size 1024k;
proxy_request_buffering off;
答案1
简单回答:
proxy_request_buffering off;
解决了你的问题,因为这是唯一相关的选项上传(要求)。
所有其他选项仅适用于下载给客户端(响应)。引用文档中的话:
proxy_buffer_size
...用于读取第一部分的缓冲区大小回复从代理服务器接收...
proxy_buffers
...用于读取的缓冲区回复来自代理服务器...
proxy_busy_buffers_size
... 当缓冲回应来自代理服务器...
答案2
我也达到了 2GB 的限制。proxy_request_buffering off;
对我来说不起作用。将以下两个选项添加到/
位置是唯一对我有用的方法:
proxy_buffering off;
client_max_body_size 0;