在维护服务器(比如 Nextcloud 或 WordPress 等基于 PHP 的应用)时,我们经常会遇到「长时间操作」超时的问题,比如备份、安装大插件、文件上传等。在我的场景里,操作大约执行 1 分钟后就会被中断,提示 504 Gateway Timeout 或直接报错,后台虽然继续运行,但浏览器前端请求会被强制断开。

这篇文章记录我完整的排查和解决流程,希望对同样遇到问题的朋友有所帮助。


🟢 ❓ 现象

  • 请求超过 1 分钟后中断,提示超时错误。
  • 后台任务仍在服务器继续执行,最终可能成功,但前端会失败或返回 504。

应用环境:

  • Nextcloud、WordPress 同用一套 PHP(PHP-FPM)
  • 同用 Nginx 反向代理

🔎 🧩 排查思路

最初怀疑是 Nginx 反向代理 超时限制,于是开始逐层排查:

✅ 1️⃣ Nginx 配置

serverlocation 段落中查看是否有超时设置,默认情况下:

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 备份等操作可以顺利完成。

Leave a Reply

Your email address will not be published. Required fields are marked *