Halo恢复上传失败解决方法
今天在恢复 Halo 备份的时候,遇到了一个小问题。
我是在 Halo 后台的网页端上传备份文件恢复,文件其实不算特别大,也就 50MB 左右。但是上传的时候一直失败。一开始我以为是 Halo 本身限制了上传大小,毕竟页面上就是上传失败,看起来很像程序不让传。
后来查了一下,发现问题不一定出在 Halo 本身,更可能是前面的反向代理限制了上传大小。
我这里用的是 1Panel,站点前面走的是 Nginx / OpenResty 反向代理。也就是说,浏览器上传文件时,请求并不是直接到 Halo,而是先经过 Nginx / OpenResty,再转发到 Halo。
所以如果 Nginx 那边限制了上传大小,文件可能还没到 Halo,就已经被拦住了。
我打开站点的配置文件,里面大概是这种结构:
server {
listen 80 ;
listen 443 ssl ;
server_name nue.366833.xyz;
location / {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://127.0.0.1:8090;
}
}
其中这一行:
proxy_pass http://127.0.0.1:8090;
表示把请求转发到本机的 8090 端口,也就是我的 Halo 服务。
我发现配置里没有设置上传大小限制,于是就在 server {} 里面加了下面几行:
client_max_body_size 15360m;
client_body_timeout 7200s;
proxy_read_timeout 7200s;
proxy_send_timeout 7200s;
proxy_connect_timeout 300s;
加完之后大概是这样:
server {
listen 80 ;
listen 443 ssl ;
server_name nue.366833.xyz;
client_max_body_size 15360m;
client_body_timeout 7200s;
proxy_read_timeout 7200s;
proxy_send_timeout 7200s;
proxy_connect_timeout 300s;
index index.php index.html index.htm default.php default.htm default.html;
location / {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Connection upgrade;
proxy_set_header Upgrade $http_upgrade;
proxy_http_version 1.1;
proxy_request_buffering off;
proxy_pass http://127.0.0.1:8090;
}
}
这里最关键的是这一句:
client_max_body_size 15360m;
15360m 大概就是 15GB。
我之所以没有只写 50m,是因为上传文件的时候并不只是文件本体,还会有一些额外的表单数据。如果文件刚好接近限制,也可能还是会失败。所以我干脆把限制放大了一些。

后面这些超时时间:
client_body_timeout 7200s;
proxy_read_timeout 7200s;
proxy_send_timeout 7200s;
proxy_connect_timeout 300s;
主要是为了防止大文件上传时间太久,中途因为超时断掉。
7200s 等于 2 小时。
另外我还在 location / 里面加了:
proxy_request_buffering off;
这个是为了减少反向代理在上传大文件时的缓存问题。
改完配置之后,一定要重载或者重启 Nginx / OpenResty。不重启的话,新配置不会生效。
我这里是在 1Panel 里重启 OpenResty,重启之后再回到 Halo 后台上传备份文件,这次就成功了。
这次的问题总结下来就是:
不是 Halo 网页端一定不能上传 50MB 的文件,而是我前面的 Nginx / OpenResty 没有放开上传大小限制。
真正解决问题的关键是:
client_max_body_size 15360m;
如果以后要上传更大的文件,比如几个 GB,理论上网页端也可以继续放大这个限制。
不过我目前只测试了 Halo 后台网页端上传恢复这种方式。其他方式,比如直接把文件放到服务器备份目录、远程恢复、对象存储直链这些,我自己没有实际尝试过,所以这里就不展开了。
这篇主要记录的是:
在 1Panel + Nginx / OpenResty 反向代理环境下,Halo 网页端上传备份文件失败时,可以优先检查站点配置里的上传大小限制。