nginx出现upstream timed out错误主因是超时参数错位、keepalive失效或连接池失配,需同步校准fastcgi/proxy超时值、启用keepalive连接池、调优上游accept队列、精细化设置长耗时接口超时,并启用php-fpm慢日志定位真实瓶颈。

如果您在 Nginx 日志中看到 upstream timed out (110: Connection timed out) 错误,说明 Nginx 在连接、发送请求或读取响应头阶段未能及时获得上游服务(如 PHP-FPM、Tomcat、Go 后端)的有效响应。该问题极少源于后端业务逻辑真正缓慢,而多由 Nginx 与上游之间的超时参数错位、keepalive 失效或连接池配置失配导致。以下是多种针对性调优方法:
一、同步校准 Nginx 与上游服务的核心超时参数
该方法聚焦于闭环对齐 fastcgi 或 proxy 场景下最关键的三类超时值,避免单点调整引发故障转移。必须确保 Nginx 端 timeout 值严格小于上游服务自身空闲关闭时限,否则复用连接将失效。
1、打开站点配置文件(如 /usr/local/phpenv/nginx/conf/vhost/example.conf)或全局 nginx.conf 的 http 块。
2、定位到 fastcgi_pass 或 proxy_pass 所在的 location 块,添加或修正以下三行(以 fastcgi 场景为例):
fastcgi_connect_timeout 5s;
fastcgi_send_timeout 30s;
fastcgi_read_timeout 30s;
3、若使用 proxy_pass,替换为对应 proxy_ 指令:
proxy_connect_timeout 5s;
proxy_send_timeout 30s;
proxy_read_timeout 30s;
4、确认 PHP-FPM 的 request_terminate_timeout(www.conf 中)设为 ≥30s;若为 Tomcat,检查 server.xml 中 connectionTimeout 是否 ≥60s(建议设为 90000)。
5、执行 nginx -t && nginx -s reload 生效配置。
二、启用并正确配置 upstream keepalive 连接池
该方法解决因连接反复新建/断开引发的 timed out,尤其适用于短生命周期请求高频访问同一上游的场景。仅配置 keepalive 数值无效,必须配套 HTTP/1.1 协议声明与 Connection 头清理。
1、在 upstream 块内添加三行指令(缺一不可):
upstream backend {
server 127.0.0.1:9000;
keepalive 32;
}
2、在对应的 location 块中加入:
proxy_http_version 1.1;
proxy_set_header Connection '';
3、若为 fastcgi 场景,需在 fastcgi_params 或 location 中显式设置:
fastcgi_keep_conn on;
4、验证是否生效:使用 ss -tn state established | grep :9000 观察 ESTAB 连接数是否稳定维持,而非持续波动。
三、检查并调优上游 accept 队列与子进程资源
该方法应对 while connecting to upstream 类错误,本质是上游服务无法及时 accept 新连接,常见于 PHP-FPM ondemand 模式下 pm.start_servers 过低或 listen.backlog 溢出。
1、检查 PHP-FPM listen.backlog 值(www.conf 中):
listen.backlog = 65535
2、运行 ss -lnt | grep :9000,观察 Recv-Q 是否持续 ≥ Send-Q;若存在,说明队列已满,需增大 backlog 并重启 php-fpm。
3、调整 PHP-FPM 进程管理参数:
pm = dynamic
pm.max_children = 128
pm.start_servers = 32
pm.min_spare_servers = 16
pm.max_spare_servers = 48
4、确认 socket 文件权限与 nginx worker 用户一致(如 www-data),避免因权限拒绝导致连接失败。
四、分离高耗时接口的超时策略
该方法防止全局拉高 timeout 值带来连接堆积风险,通过 location 精细化覆盖,仅对导出、轮询等长耗时路径放宽限制,其余路径保持严苛超时。
1、识别需特殊处理的 URI 路径,例如 /api/export、/task/poll。
2、在 server 块内新增独立 location 块:
location ^~ /api/export {
proxy_pass http://backend;
proxy_read_timeout 600;
proxy_send_timeout 600;
proxy_connect_timeout 15;
}
3、确保该 location 位于通用 location / { ... } 之前,避免被通配规则覆盖。
4、测试路径是否命中:curl -I http://example.com/api/export,检查响应头中是否携带 X-Upstream-Addr 等可识别标识。
五、启用慢日志定位真实瓶颈点
该方法用于排除“假超时”干扰,当所有配置调优后仍偶发 timed out,需确认是否由某段 PHP 代码阻塞 I/O(如未加锁的 file_get_contents、无索引数据库查询)引发上游响应延迟。
1、编辑 PHP-FPM pool 配置(如 /usr/local/etc/php-fpm.d/www.conf):
slowlog = /var/log/php-fpm/www-slow.log
request_slowlog_timeout = 5s
2、创建日志目录并授权:
mkdir -p /var/log/php-fpm
chown www-data:www-data /var/log/php-fpm
3、重启 php-fpm 服务。
4、复现超时请求后,立即执行:tail -f /var/log/php-fpm/www-slow.log,捕获完整堆栈与执行路径。











