Nginx反代导致的文件下载问题
最近把自己的搭建的私人网盘从NextCloud换成了Zfile,感觉NextCloud还是太臃肿了,更多的是面向团队或者企业开发的,之后也陆陆续续的换了其他的网盘程序,包括可道云、Seafile等等,最终决定使用Zfile作为我的网盘程序,关于这几种网盘的使用感受可以查看私人云盘使用感受。
个人使用Zfile的原因是我只需要网盘资源的上传和下载功能即可,偏向于资源的存储和下载,而不是同步,感觉Zfile功能简洁,符合我的要求。使用Zfile也有一段时间了,使用体验也很好。
不过今天遇到了问题——下载大文件到达1G之后浏览器端立即报错“网络错误”,然后就无法下载了。
下面是我的排查思路:
v2ray
问题,一开始以为是服务端v2ray的缓存限制带来的问题,后来发现裸连,问题依旧存在- 服务器内存太小了,于是在下载的时候
watch
服务器内存变化,发现内存依旧有很多可用 jvm
设置的问题,由于是自用,设置了JVM的最大内存空间为512M,后来发现即使不设置限制,问题依旧存在
最后还是通过万能的Google发现了问题所在——Nginx的缓冲区设置,Nginx下有一个默认参数proxy_max_temp_file_size 1024m;
,这个参数可以理解为,当Nginx要传输的数据大于默认的buffer大小时,就会把剩余的部分写入到磁盘临时文件,proxy_max_temp_file_size
参数就代表着磁盘文件的大小。当我下载大文件的时候,后端程序传给Nginx的数据很快,但客户端这边下载速度远不及后端发送的数据,就会导致后端阻塞超时,进而出现报错导致文件无法继续下载。
解决方案有两个:
- 增大
proxy_max_temp_file_size
,尽量让磁盘缓存文件不溢出,不过这个在传输时会占用一定的磁盘空间 - 减小
proxy_max_temp_file_size
,尽量让服务端的发送速度与客户端的接收速度相匹配
我的处理方式是将该值调小,毕竟服务器磁盘空间有限,下面是我的 nginx 部分配置
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://127.0.0.1:xxxxx;
# 本地存储策略
client_max_body_size 200m;
# 硬盘缓冲区大小
proxy_max_temp_file_size 10M;
}
如果你认为这篇文章还不错,可以考虑 为作者充电 ⚡️