Nginx 的超时配置用于控制连接、请求、响应等过程的时间限制,避免资源被长期占用或请求无响应导致的问题。不同场景需配置不同的超时参数,以下是常用的超时配置分类及说明:

一、HTTP 连接层超时(作用于客户端与 Nginx 的连接)

  1. client_body_timeout

    • 作用:客户端向 Nginx 发送请求体(如 POST 数据)的超时时间。
    • 场景:若客户端发送数据中断或过慢,超过此时间 Nginx 会关闭连接。
    • 默认值:60s
    • 配置示例:

      client_body_timeout 30s;  # 30秒内未收到客户端请求体则超时
  2. client_header_timeout

    • 作用:客户端向 Nginx 发送请求头(如 HostUser-Agent)的超时时间。
    • 场景:客户端未完整发送请求头时触发。
    • 默认值:60s
    • 配置示例:

      client_header_timeout 10s;  # 10秒内未收到完整请求头则超时
  3. keepalive_timeout

    • 作用:长连接(Keep-Alive)的超时时间。
    • 场景:客户端与 Nginx 建立长连接后,若超过此时间无新请求,Nginx 会关闭连接。
    • 默认值:75s
    • 配置示例:

      keepalive_timeout 60s;  # 长连接保持60秒,无请求则关闭
  4. 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秒则超时

三、其他常用超时配置

  1. lingering_timeout

    • 作用:关闭连接前,等待客户端发送剩余数据的超时时间(用于处理半关闭连接)。
    • 默认值:30s
    • 配置示例:

      lingering_timeout 5s;
  2. resolver_timeout

    • 作用:DNS 解析的超时时间(当 Nginx 需通过域名访问后端服务时生效)。
    • 默认值:30s
    • 配置示例:

      resolver_timeout 10s;  # DNS解析超10秒则失败

四、配置位置

超时配置可根据范围在 httpserverlocation 块中设置:

  • 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配置...
    }
}

注意事项

  1. 超时时间需根据业务场景调整(如大文件上传需增大 client_body_timeout,复杂计算接口需增大 proxy_read_timeoutfastcgi_read_timeout)。
  2. 反向代理/FastCGI 超时需与后端服务自身的超时配置配合(如 PHP-FPM 的 request_terminate_timeout、Java 的 tomcat timeout),避免 Nginx 先于后端超时导致 504 错误。
  3. 配置后需执行 nginx -t 检查语法,再 nginx -s reload 生效。

php\php-fpm的超时时间配置

PHP 及 PHP-FPM 的超时时间配置主要用于控制脚本执行时长、请求处理时限等,避免长时间运行的脚本占用资源或导致服务阻塞。以下是核心配置参数及说明:

一、PHP 内核级超时配置(php.ini

PHP 本身提供了脚本执行时间的限制,通过 php.ini 中的参数控制,作用于所有 PHP 脚本(包括 CLI 模式,但通常 CLI 会禁用此限制)。

  1. max_execution_time

    • 作用:单个 PHP 脚本的最大执行时间(单位:秒),从脚本开始运行时计时。
    • 注意:不包括脚本在外部系统的等待时间(如数据库查询、网络请求等,除非启用了 max_input_time 或相关扩展限制)。
    • 默认值:30 秒
    • 配置示例:

      max_execution_time = 60  ; 脚本最多执行60秒
    • 特殊场景:若需临时调整某个脚本的超时时间,可在脚本内通过 set_time_limit(seconds) 动态修改(0 表示无限制)。
  2. 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.confwww.conf

PHP-FPM 作为 FastCGI 进程管理器,提供了更底层的超时控制,优先级高于 php.inimax_execution_time(即使脚本内用 set_time_limit 也无法突破 FPM 的限制)。

  1. request_terminate_timeout

    • 作用:单个 PHP-FPM 进程处理一个请求的最大总时间(单位:秒),包括脚本执行、IO 等待等所有耗时。
    • 超时后:PHP-FPM 会强制终止该进程(发送 SIGTERM 信号),避免进程长期占用资源。
    • 默认值:0(无限制,继承 php.inimax_execution_time
    • 配置示例:

      request_terminate_timeout = 120  ; 单个请求最多处理120秒,超时则终止进程
  2. request_slowlog_timeout

    • 作用:定义“慢请求”的阈值(单位:秒),超过此时间的请求会被记录到慢日志。
    • 配合参数:slowlog(指定慢日志文件路径),用于排查执行缓慢的脚本。
    • 配置示例:

      slowlog = /var/log/php-fpm/slow.log  ; 慢日志路径
      request_slowlog_timeout = 10        ; 执行超过10秒的请求记录到慢日志
  3. process_control_timeout

    • 作用:PHP-FPM 主进程管理子进程时的超时时间(如重启、回收子进程的等待时间)。
    • 默认值:0(无限制)
    • 配置示例:

      process_control_timeout = 5  ; 管理子进程的操作最多等待5秒

三、配置位置与生效方式

  1. php.ini:通常位于 /etc/php/7.x/cli/php.ini(CLI 模式)或 /etc/php/7.x/fpm/php.ini(FPM 模式),修改后需重启 PHP-FPM 生效。
  2. 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  # 根据实际版本调整

四、关键注意事项

  1. 与 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
    }
  2. 避免无限制超时
    生产环境中不建议将 request_terminate_timeout 设为 0(无限制),否则可能因脚本死循环、阻塞等导致进程耗尽资源。
  3. 长任务处理
    对于需要长时间执行的任务(如数据导出、批量处理),建议采用“异步队列”(如 RabbitMQ)+“后台进程”(如 Supervisor 管理)的方式,而非直接通过 Web 脚本处理,避免触发超时。

通过合理配置 PHP 与 PHP-FPM 的超时参数,可平衡服务稳定性与业务需求,减少因超时导致的异常问题。

标签: none

添加新评论