V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
MiKing233
V2EX  ›  NGINX

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

  •  
  •   MiKing233 · 303 天前 · 2261 次点击
    这是一个创建于 303 天前的主题,其中的信息可能已经有所发展或是发生改变。
    小弟我在伺服器(這裏就稱作伺服器 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; 但並不起作用現象照舊

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

    1. 引入对象存储,比如 oss ,有现成的 js sdk 做文件直传,数据不经过 nginx (底层原理应该是数据上传前分片+上传+服务端合并)
    2. 自己实现 js 文件分片,上传到服务端后在手动合并
    guanzhangzhang
        6
    guanzhangzhang  
       303 天前
    上传文件一般是用户获取上传的 oss 的 sts 和 endpoint ,然后上传到对象存储,上传完成后给你后端发送上传完成的请求
    zengxs
        7
    zengxs  
       303 天前
    可以试试 nginx 的 stream 模块直接转发 tcp 流量,做一层 ssl offloading 就行,这样 nginx 就不会解析 http 内容了
    MiKing233
        8
    MiKing233  
    OP
       303 天前
    @ysc3839 感謝大佬, 確實是 proxy_request_buffering off;加上之後正常 upload, Nginx 終於不向磁碟寫數據了, 感謝感謝!!!
    MiKing233
        9
    MiKing233  
    OP
       303 天前
    @wheat0r proxy_request_buffering off;非常感謝!!!
    MiKing233
        10
    MiKing233  
    OP
       303 天前
    @vivisidea 聼留言區大佬説的, 加上了 proxy_request_buffering off;確實解決問題了, Nginx 不會再寫磁碟, 實現「真•stream 上傳了」😁
    salmon5
        11
    salmon5  
       303 天前
    proxy_request_buffering off;#关闭上传硬盘 buffer ,保留内存 buffer:client_body_buffer_size 。
    proxy_buffering off;关闭下载内存和硬盘 buffer (关闭 proxy_buffers 和 proxy_max_temp_file_size 0 )。
    mingl0280
        12
    mingl0280  
       303 天前
    别开 buffer 就行了,这是 nginx 的 buffer 的问题。
    MiKing233
        13
    MiKing233  
    OP
       303 天前
    @mingl0280 主要是很多參數不指定的話就是默認開的, 還得一個個去找然後手動加上才能關掉
    vivisidea
        14
    vivisidea  
       303 天前
    @MiKing233 学习了!
    iamwin
        15
    iamwin  
       303 天前 via Android
    端口转发用 stream 模块,不要用反向代理
    om2mo
        16
    om2mo  
       303 天前
    楼主台湾人
    mingl0280
        17
    mingl0280  
       302 天前 via Android
    @iamwin 这不是端口转发的配置,这是给 http 套 https...
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2901 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 12:58 · PVG 20:58 · LAX 04:58 · JFK 07:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.