在维护服务器(比如 Nextcloud 或 WordPress 等基于 PHP 的应用)时,我们经常会遇到「长时间操作」超时的问题,比如备份、安装大插件、文件上传等。在我的场景里,操作大约执行 1 分钟后就会被中断,提示 504 Gateway Timeout 或直接报错,后台虽然继续运行,但浏览器前端请求会被强制断开。
这篇文章记录我完整的排查和解决流程,希望对同样遇到问题的朋友有所帮助。
🟢 ❓ 现象
- 请求超过 1 分钟后中断,提示超时错误。
- 后台任务仍在服务器继续执行,最终可能成功,但前端会失败或返回 504。
应用环境:
- Nextcloud、WordPress 同用一套 PHP(PHP-FPM)
- 同用 Nginx 反向代理
🔎 🧩 排查思路
最初怀疑是 Nginx 反向代理 超时限制,于是开始逐层排查:
✅ 1️⃣ Nginx 配置
在 server 或 location 段落中查看是否有超时设置,默认情况下:
proxy_read_timeout 60s;
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
此处 60 秒就是导致中断的原因。
解决方案:把超时时间放宽,比如 3600 秒(1 小时):
proxy_connect_timeout 3600s;
proxy_send_timeout 3600s;
proxy_read_timeout 3600s;
注意:
fastcgi_read_timeout是针对 fastcgi(例如直接使用 php-fpm fastcgi)用的,如果 Nginx 是走proxy_pass给 Apache 或其他 HTTP 服务,就不需要设置。
修改后,执行:
systemctl reload nginx
即可生效。
✅ 2️⃣ PHP 配置
PHP 默认有多项限制,常见的限制项及修改:
max_execution_time = 300
max_input_time = 300
default_socket_timeout = 300
含义:
max_execution_time:脚本最大执行时间(默认 30 秒)max_input_time:解析表单数据最大时间(默认 60 秒)default_socket_timeout:网络流连接最大等待时间(默认 60 秒)
这里统一调整为 300 秒(或更长),防止长任务被 PHP 自己中断。
修改后,重启 php-fpm:
systemctl restart php8.1-fpm
✅ 3️⃣ 浏览器或 CDN
有些场景中,前面还会有 CDN(例如 Cloudflare),需要确认它的超时时间(Cloudflare 免费版默认 100 秒)。
在本案例中,没有额外 CDN,主要是本地 Nginx。
🎉 💡 最终效果
- 请求再也不会在 1 分钟左右被中断,能持续执行更长时间。
- Nextcloud 文件检查、WordPress 备份等操作可以顺利完成。