Nginx通过upstream模块配合fastcgi_pass实现PHP-FPM多节点负载均衡,需在http块定义upstream组、各节点监听不同地址(TCP推荐)、location中用fastcgi_pass引用组名,并配置权重、least_conn或ip_hash等策略及max_fails/fail_timeout健康检查。

FastCGI 本身不自带负载均衡能力,Nginx 是通过 upstream 模块配合 fastcgi_pass,把 PHP 动态请求分发到多个 PHP-FPM 节点的。本质是“用反向代理的方式做 FastCGI 负载均衡”,不是 FastCGI 协议层面的功能。
配置多个 PHP-FPM 后端节点
在 http{} 块中定义一个 upstream 组,每个 server 指向一个独立运行的 PHP-FPM 实例(支持 IP+端口 或 Unix socket):
- 确保各 PHP-FPM 节点监听不同地址,例如:
192.168.1.10:9000、192.168.1.11:9000、unix:/var/run/php-fpm-2.sock - PHP-FPM 需开启 TCP 监听(而非仅本地 socket),并在防火墙放行对应端口
- 推荐统一使用 TCP 模式,便于跨主机部署和健康检查
在 location 中调用 upstream 组
不再写死 fastcgi_pass 127.0.0.1:9000,而是指向 upstream 名称:
-
fastcgi_pass backend_php;—— backend_php 就是 upstream 块的名字 - 必须保留
include fastcgi_params;和关键参数如fastcgi_param SCRIPT_FILENAME - 建议加上超时控制,避免单个 FPM 响应慢拖垮整体:
fastcgi_read_timeout 60;fastcgi_send_timeout 60;fastcgi_connect_timeout 10;
选择合适的分发策略
upstream 内可指定算法,影响请求如何落到各节点:
-
轮询(默认):依次分发,适合无状态、性能相近的节点
upstream backend_php { server 192.168.1.10:9000; server 192.168.1.11:9000; } -
权重轮询:按性能差异分配流量,比如新机器配更高 weight
server 192.168.1.10:9000 weight=3; -
最少连接:适合长耗时脚本或 WebSocket 类场景
upstream backend_php { least_conn; server ...; } -
IP Hash:保证同一客户端始终打到同一 FPM 节点,适用于 session 文件未共享时
ip_hash;(注意:不适用于 CDN 后多层代理场景)
加入健康检查与容灾机制
Nginx 默认具备被动健康检查,但建议显式配置以提升可靠性:
-
max_fails=3 fail_timeout=30s:30 秒内失败 3 次,就临时剔除该节点 -
backup:标记备用节点,主节点全宕时才启用server 192.168.1.12:9000 backup; -
down:手动下线节点,不参与任何分发server 192.168.1.13:9000 down;


















