我正在 docker 容器中運行應用程式(https://github.com/filebrowser/filebrowser/)我正在嘗試上傳非常大(> 2)GB的檔案。容器在本地主機上的非標準連接埠上公開應用程序,我透過反向代理連接到該連接埠(這樣我就可以在一台電腦上運行多個應用程式)。問題是當我上傳超過 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;