大佬們求助個關於 Nginx 的問題

302 天前
 MiKing233
小弟我在伺服器(這裏就稱作伺服器 A)上的 Nginx 中配置了一個站點, 配置文件如下

server{
listen 443 ssl;
server_name cloud.xxxxx.net;
ssl_certificate /etc/letsencrypt/live/xxxx.net/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/xxxx.net/privkey.pem;
ssl_session_timeout 5m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://127.0.0.1:8021;
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
access_log /www/wwwlogs/access_cloud.xxxx.net.log main;
}

其中此機器的 8021 端口是一臺遠端主機(這裏就稱作伺服器 B), 透過内網穿透將 8021 轉發到伺服器 A 的 8021 上

問題是這樣的, 我上傳了一個 10GB 的文件, 按照我的理解這個文件將會通過 ServerA 實時傳輸到 ServerB 上, 對於 A 來説只是在轉發流量到 B 而已, 但實際情況是, 在文件沒有完成上傳之前, 上傳的文件會占用 A 的磁盤空間, 例如上傳到 9/10GB, 此時會占用 A 機器 9GB 的空間大小, 當完成上傳後空間將被釋放, 但我的伺服器 A 只用作流量轉發, 并沒有多少存儲空間

通過在文件上載時使用 iotop 命令在 ServerA 上檢查確認是 Nginx 進程對磁盤進行的寫入操作, 懷疑是 Nginx 緩存的問題, 我也嘗試添加了 proxy_cache off;proxy_buffering off;proxy_max_temp_file_size 0; 但並不起作用現象照舊

是我的思路一開始就錯了嗎, 難道不是緩存方面的問題, 實在是看不明白了😵‍💫
2259 次点击
所在节点    NGINX
17 条回复
ysc3839
302 天前
proxy_request_buffering off 呢?
Richared
302 天前
内网穿透使用的什么?检查下这个?例如使用另一台服务器 c 去做内网穿透,验证下是谁的问题,ng 有磁盘写入也不能确认是 ng 的问题,也会落日志的。
ysc3839
302 天前
可以看看文档,把能关的缓存都关掉
https://nginx.org/en/docs/http/ngx_http_proxy_module.html
wheat0r
302 天前
proxy_max_temp_file_size 0;
proxy_request_buffering off;
proxy_buffering off
vivisidea
302 天前
考虑对象存储么?文件上传是会出现你说的这个问题的,我感觉是绕不过的,没法实现《真 stream 上传》

1. 引入对象存储,比如 oss ,有现成的 js sdk 做文件直传,数据不经过 nginx (底层原理应该是数据上传前分片+上传+服务端合并)
2. 自己实现 js 文件分片,上传到服务端后在手动合并
guanzhangzhang
302 天前
上传文件一般是用户获取上传的 oss 的 sts 和 endpoint ,然后上传到对象存储,上传完成后给你后端发送上传完成的请求
zengxs
302 天前
可以试试 nginx 的 stream 模块直接转发 tcp 流量,做一层 ssl offloading 就行,这样 nginx 就不会解析 http 内容了
MiKing233
302 天前
@ysc3839 感謝大佬, 確實是 proxy_request_buffering off;加上之後正常 upload, Nginx 終於不向磁碟寫數據了, 感謝感謝!!!
MiKing233
302 天前
@wheat0r proxy_request_buffering off;非常感謝!!!
MiKing233
302 天前
@vivisidea 聼留言區大佬説的, 加上了 proxy_request_buffering off;確實解決問題了, Nginx 不會再寫磁碟, 實現「真•stream 上傳了」😁
salmon5
302 天前
proxy_request_buffering off;#关闭上传硬盘 buffer ,保留内存 buffer:client_body_buffer_size 。
proxy_buffering off;关闭下载内存和硬盘 buffer (关闭 proxy_buffers 和 proxy_max_temp_file_size 0 )。
mingl0280
302 天前
别开 buffer 就行了,这是 nginx 的 buffer 的问题。
MiKing233
302 天前
@mingl0280 主要是很多參數不指定的話就是默認開的, 還得一個個去找然後手動加上才能關掉
vivisidea
302 天前
@MiKing233 学习了!
iamwin
302 天前
端口转发用 stream 模块,不要用反向代理
om2mo
301 天前
楼主台湾人
mingl0280
301 天前
@iamwin 这不是端口转发的配置,这是给 http 套 https...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1017769

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX