避免504错误需同步调整nginx与php-fpm超时参数:fastcgi_connect_timeout、send_timeout、read_timeout须匹配php-fpm的request_terminate_timeout及max_execution_time,并优化缓冲区与并发配置,再通过日志定位瓶颈。

要避免因 FastCGI 响应过慢触发 504 错误,关键不是“消除超时”,而是让 Nginx 的超时参数与后端 PHP(如 php-fpm)的实际处理能力匹配。FastCGI 超时配置需同时调整 Nginx 和 php-fpm 两端,单边调大容易失效。
设置 Nginx 的 FastCGI 超时参数
这三个指令必须放在 location 或 server 块中,且仅在启用 fastcgi_pass 时生效:
-
fastcgi_connect_timeout:Nginx 连接 php-fpm 的最大等待时间,建议设为
10s~30s(网络稳定时无需过大); -
fastcgi_send_timeout:Nginx 向 php-fpm 发送完整请求体的超时,适用于大 POST 数据,一般设为
60s~180s; -
fastcgi_read_timeout:Nginx 等待 php-fpm 返回响应的总时间(含 headers + body),这是最直接影响 504 的参数,应略大于 php-fpm 的
request_terminate_timeout,常见设为180s或300s。
同步调整 php-fpm 的执行限制
Nginx 超时再长,若 php-fpm 自身提前杀掉进程,仍会返回 504(实际是 php-fpm 主动断连,Nginx 捕获为超时)。需检查并修改 php-fpm.conf 或 pool 配置文件:
-
request_terminate_timeout:强制终止运行超时的请求,单位秒,必须 ≥ Nginx 的
fastcgi_read_timeout; -
max_execution_time(php.ini 中):PHP 脚本级最大执行时间,应 ≤
request_terminate_timeout,避免被双重截断; - pm.max_children 和 pm.start_servers:确保并发请求有足够子进程可用,资源不足会导致排队等待,间接拉长响应时间。
优化缓冲区防止挂起
缓冲区过小可能导致 FastCGI 响应被截断或进程阻塞,继而触发假性超时:
-
fastcgi_buffer_size:用于接收响应头,建议至少
128k; -
fastcgi_buffers:主缓冲区,例如
8 256k可支持 2MB 以内页面; -
fastcgi_busy_buffers_size:繁忙时可用缓冲上限,设为
fastcgi_buffers总和的一半或相等(如512k); -
fastcgi_temp_file_write_size:启用磁盘缓存阈值,设为与
fastcgi_buffers单块大小一致(如256k),避免小文件频繁刷盘。
验证与日志定位
配置生效后,用真实请求验证,并通过日志确认瓶颈所在:
- 在
log_format中加入$upstream_response_time和$request_time,对比两者差值可判断延迟发生在 Nginx 还是 php-fpm; - 查看 Nginx error log,出现
upstream timed out (110: Connection timed out)表明是fastcgi_read_timeout触发; - 检查 php-fpm slow log(开启
slowlog和request_slowlog_timeout),确认具体哪段 PHP 代码耗时过长。











