Nginx上传大文件慢 解决

2024-08-28 109 0

使用apisix(nginx)转发 nginx+php 在上传大文件时,发现比原来上传慢了很多。

  • 使用apisix转发 上传
    上传15G文件,耗时4.7分钟, 其中在2.7分钟时是上传完了,客户端上传速率也降下来为几十kb,但还要再等2分钟才会返回数据。
  • 直接在上游(后端)nginx+php 上传
    不使用apisix转发, 直接上传文件是正常,上传15G耗时2.7分钟,上传完立即返回数据。

查看日志

192.168.10.73 - - [14/Jan/2024:12:09:03 +0000] "PUT /remote.php/webdav/test111/%E8%A7%86%E9%A2%91.zip HTTP/1.1" 400 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
192.168.10.73 - - [14/Jan/2024:12:09:04 +0000] "PROPFIND /remote.php/webdav/test111 HTTP/1.1" 207 977 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
192.168.10.73 - - [14/Jan/2024:12:09:04 +0000] "GET /index.php/apps/files/ajax/getstoragestats.php?dir=%2Ftest111 HTTP/1.1" 200 207 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" "-"
2024/01/14 12:09:09 [warn] 22#22: *5 a client request body is buffered to a temporary file /var/cache/nginx/client_temp/0000000002, client: 192.168.10.73, server: in.appcd.cn, request: "PUT /remote.php/webdav/test111/%E8%A7%86%E9%A2%91.zip HTTP/1.1", host: "in.appcd.cn"

Nginx 在处理一个 PUT 请求时,由于请求体较大,将其缓冲到了一个临时文件中。这是 Nginx 处理大文件上传的一种常见方式,特别是当文件太大无法完全缓存到内存时。

默认是启用请求缓冲的,关闭就可以透传了。

解决

server {
    listen 80;
    server_name your-server-name;

    location / {
        proxy_pass http://your-upstream-server;
        proxy_request_buffering off;
        proxy_buffering off;
    }
}
  • proxy_request_buffering off;: 禁止请求体缓冲,即 Nginx 不会将整个请求体缓冲到磁盘。即透传至上游(后端)
  • proxy_buffering off;: 禁止响应体缓冲,即 Nginx 不会将整个响应体缓冲到磁盘。

相关文章

nginx 1.22 编译webdav插件
ubuntu 22.04 编译 nginx 1.22

发布评论