使用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 不会将整个响应体缓冲到磁盘。