nginx的超时配置、php\php-fpm的超时时间配置
Nginx 的超时配置用于控制连接、请求、响应等过程的时间限制,避免资源被长期占用或请求无响应导致的问题。不同场景需配置不同的超时参数,以下是常用的超时配置分类及说明:
一、HTTP 连接层超时(作用于客户端与 Nginx 的连接)
client_body_timeout- 作用:客户端向 Nginx 发送请求体(如 POST 数据)的超时时间。
- 场景:若客户端发送数据中断或过慢,超过此时间 Nginx 会关闭连接。
- 默认值:60s
配置示例:
client_body_timeout 30s; # 30秒内未收到客户端请求体则超时
client_header_timeout- 作用:客户端向 Nginx 发送请求头(如
Host、User-Agent)的超时时间。 - 场景:客户端未完整发送请求头时触发。
- 默认值:60s
配置示例:
client_header_timeout 10s; # 10秒内未收到完整请求头则超时
- 作用:客户端向 Nginx 发送请求头(如
keepalive_timeout- 作用:长连接(
Keep-Alive)的超时时间。 - 场景:客户端与 Nginx 建立长连接后,若超过此时间无新请求,Nginx 会关闭连接。
- 默认值:75s
配置示例:
keepalive_timeout 60s; # 长连接保持60秒,无请求则关闭
- 作用:长连接(
send_timeout- 作用:Nginx 向客户端发送响应数据的超时时间(仅在两次写操作之间生效)。
- 场景:若客户端接收数据过慢,两次发送数据的间隔超过此时间,Nginx 会关闭连接。
- 默认值:60s
配置示例:
send_timeout 30s; # 向客户端发送数据时,间隔超过30秒则超时
二、反向代理/ FastCGI 超时(作用于 Nginx 与后端服务的交互)
1. 反向代理(Proxy)场景(如代理到 Tomcat、Node.js 等)
proxy_connect_timeout
作用:Nginx 与后端代理服务器建立连接的超时时间(三次握手阶段)。
默认值:60s
配置示例:proxy_connect_timeout 10s; # 10秒内未与后端建立连接则超时proxy_send_timeout
作用:Nginx 向后端代理服务器发送请求数据的超时时间(两次写操作间隔)。
默认值:60s
配置示例:proxy_send_timeout 20s; # 向后端发送数据间隔超20秒则超时proxy_read_timeout
作用:Nginx 等待后端代理服务器返回响应的超时时间(从连接建立后开始算)。
场景:若后端处理请求过慢(如复杂计算),超过此时间 Nginx 会返回 504 错误。
默认值:60s
配置示例:proxy_read_timeout 60s; # 等待后端响应超60秒则超时
2. FastCGI 场景(如处理 PHP 请求,对接 PHP-FPM)
fastcgi_connect_timeout
作用:Nginx 与 FastCGI 进程(如 PHP-FPM)建立连接的超时时间。
默认值:60s
配置示例:fastcgi_connect_timeout 10s;fastcgi_send_timeout
作用:Nginx 向 FastCGI 进程发送请求数据的超时时间(两次写操作间隔)。
默认值:60s
配置示例:fastcgi_send_timeout 20s;fastcgi_read_timeout
作用:Nginx 等待 FastCGI 进程返回响应的超时时间(关键参数,需与 PHP-FPM 配合)。
场景:PHP 脚本执行时间过长时,若超过此时间,Nginx 会返回 504 错误。
默认值:60s
配置示例(需大于 PHP-FPM 的request_terminate_timeout):fastcgi_read_timeout 120s; # 等待PHP-FPM响应超120秒则超时
三、其他常用超时配置
lingering_timeout- 作用:关闭连接前,等待客户端发送剩余数据的超时时间(用于处理半关闭连接)。
- 默认值:30s
配置示例:
lingering_timeout 5s;
resolver_timeout- 作用:DNS 解析的超时时间(当 Nginx 需通过域名访问后端服务时生效)。
- 默认值:30s
配置示例:
resolver_timeout 10s; # DNS解析超10秒则失败
四、配置位置
超时配置可根据范围在 http、server 或 location 块中设置:
http块:全局生效(所有虚拟主机共享);server块:仅对当前虚拟主机生效;location块:仅对匹配的请求路径生效(优先级最高)。
示例(针对 PHP 站点的 location 配置):
server {
listen 80;
server_name example.com;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_read_timeout 120s; # PHP脚本执行超时设置
fastcgi_send_timeout 30s;
# 其他FastCGI配置...
}
}注意事项
- 超时时间需根据业务场景调整(如大文件上传需增大
client_body_timeout,复杂计算接口需增大proxy_read_timeout或fastcgi_read_timeout)。 - 反向代理/FastCGI 超时需与后端服务自身的超时配置配合(如 PHP-FPM 的
request_terminate_timeout、Java 的tomcat timeout),避免 Nginx 先于后端超时导致 504 错误。 - 配置后需执行
nginx -t检查语法,再nginx -s reload生效。
php\php-fpm的超时时间配置
PHP 及 PHP-FPM 的超时时间配置主要用于控制脚本执行时长、请求处理时限等,避免长时间运行的脚本占用资源或导致服务阻塞。以下是核心配置参数及说明:
一、PHP 内核级超时配置(php.ini)
PHP 本身提供了脚本执行时间的限制,通过 php.ini 中的参数控制,作用于所有 PHP 脚本(包括 CLI 模式,但通常 CLI 会禁用此限制)。
max_execution_time- 作用:单个 PHP 脚本的最大执行时间(单位:秒),从脚本开始运行时计时。
- 注意:不包括脚本在外部系统的等待时间(如数据库查询、网络请求等,除非启用了
max_input_time或相关扩展限制)。 - 默认值:30 秒
配置示例:
max_execution_time = 60 ; 脚本最多执行60秒- 特殊场景:若需临时调整某个脚本的超时时间,可在脚本内通过
set_time_limit(seconds)动态修改(0表示无限制)。
max_input_time- 作用:接收客户端请求数据(如 POST 表单、文件上传)的最大时间(单位:秒)。
- 注意:从 PHP 开始接收数据到完全接收完毕的时间,超过则报
408 Request Timeout。 - 默认值:60 秒(PHP 7.4 及以上已废弃,由
max_execution_time间接控制) 配置示例(适用于 PHP 7.3 及以下):
max_input_time = 30 ; 30秒内未接收完请求数据则超时
二、PHP-FPM 进程级超时配置(php-fpm.conf 或 www.conf)
PHP-FPM 作为 FastCGI 进程管理器,提供了更底层的超时控制,优先级高于 php.ini 的 max_execution_time(即使脚本内用 set_time_limit 也无法突破 FPM 的限制)。
request_terminate_timeout- 作用:单个 PHP-FPM 进程处理一个请求的最大总时间(单位:秒),包括脚本执行、IO 等待等所有耗时。
- 超时后:PHP-FPM 会强制终止该进程(发送
SIGTERM信号),避免进程长期占用资源。 - 默认值:0(无限制,继承
php.ini的max_execution_time) 配置示例:
request_terminate_timeout = 120 ; 单个请求最多处理120秒,超时则终止进程
request_slowlog_timeout- 作用:定义“慢请求”的阈值(单位:秒),超过此时间的请求会被记录到慢日志。
- 配合参数:
slowlog(指定慢日志文件路径),用于排查执行缓慢的脚本。 配置示例:
slowlog = /var/log/php-fpm/slow.log ; 慢日志路径 request_slowlog_timeout = 10 ; 执行超过10秒的请求记录到慢日志
process_control_timeout- 作用:PHP-FPM 主进程管理子进程时的超时时间(如重启、回收子进程的等待时间)。
- 默认值:0(无限制)
配置示例:
process_control_timeout = 5 ; 管理子进程的操作最多等待5秒
三、配置位置与生效方式
php.ini:通常位于/etc/php/7.x/cli/php.ini(CLI 模式)或/etc/php/7.x/fpm/php.ini(FPM 模式),修改后需重启 PHP-FPM 生效。PHP-FPM 配置文件:
- 主配置
php-fpm.conf位于/etc/php/7.x/fpm/php-fpm.conf; 池配置(如
www.conf)位于/etc/php/7.x/fpm/pool.d/www.conf(更常用,针对特定进程池配置)。
修改后需重启 PHP-FPM 生效:systemctl restart php7.4-fpm # 根据实际版本调整
- 主配置
四、关键注意事项
与 Nginx 配合:
Nginx 的fastcgi_read_timeout需大于等于 PHP-FPM 的request_terminate_timeout,否则 Nginx 会先超时返回504 Gateway Timeout,而 PHP-FPM 可能仍在处理请求。
示例:# Nginx 配置 location ~ \.php$ { fastcgi_read_timeout 150s; # 大于 PHP-FPM 的 120s }- 避免无限制超时:
生产环境中不建议将request_terminate_timeout设为0(无限制),否则可能因脚本死循环、阻塞等导致进程耗尽资源。 - 长任务处理:
对于需要长时间执行的任务(如数据导出、批量处理),建议采用“异步队列”(如 RabbitMQ)+“后台进程”(如 Supervisor 管理)的方式,而非直接通过 Web 脚本处理,避免触发超时。
通过合理配置 PHP 与 PHP-FPM 的超时参数,可平衡服务稳定性与业务需求,减少因超时导致的异常问题。
版权属于:Joyber
本文链接:https://blog.qqvbc.com/default/1370.html
转载时须注明出处及本声明