PHP负载均衡核心是Nginx反向代理+upstream分发PHP-FPM节点,需配置proxy_set_header、集中式Session(如Redis)、共享存储及数据库主从分离,并辅以健康检查与Keepalived高可用。

PHP网站要实现负载均衡,核心不在PHP本身,而在于用Nginx做统一入口,把HTTP请求合理分发到多个运行PHP-FPM的后端服务器上。整个过程分三块:反向代理是基础,上游集群是骨架,会话与数据一致性是关键保障。
反向代理配置是第一步
Nginx作为前端网关,不直接执行PHP,而是接收所有用户请求,并按规则转发。最简配置只需一个proxy_pass指向后端服务地址:
- 监听80端口,匹配
server_name域名,所有location /请求都走代理 - 必须设置
proxy_set_header三项:Host、X-Real-IP、X-Forwarded-For,否则后端PHP拿不到真实客户端信息 - 若代理目标是另一台Web服务器(如Apache或另一套Nginx+PHP),用
proxy_pass http://192.168.1.10/;注意末尾斜杠影响路径拼接
定义upstream实现多PHP-FPM节点分发
PHP本身不支持原生负载均衡,得靠Nginx的upstream模块管理多个PHP-FPM实例。每个节点应独立部署PHP 8.2+ FPM服务,监听TCP端口或本地socket:
- 在
http块中声明upstream php_pool,列出各服务器IP和端口,例如server 192.168.1.10:9000 weight=3 - 使用
weight参数可按性能分配流量;加max_fails=3 fail_timeout=30s让Nginx自动剔除故障节点 - 在PHP处理的
location ~ \.php$块中,把fastcgi_pass从固定地址改为fastcgi_pass php_pool
解决Session丢失和文件共享问题
默认PHP文件型Session在多服务器下必然失效——用户第一次登录Server A生成session文件,第二次请求落到Server B就找不到。必须改用集中式存储:
立即学习“PHP免费学习笔记(深入)”;
- 启用Redis作为Session处理器:
session.save_handler = redis,并配置session.save_path = "tcp://192.168.1.5:6379" - 静态资源(上传文件、缓存)不能存在单机磁盘,需迁移到对象存储(如MinIO、阿里云OSS)或NFS共享目录
- 数据库必须主从分离或集群部署,写操作走主库,读操作可由Nginx配合
upstream按需分发到从库(需应用层适配)
健康检查与高可用补全闭环
仅靠Nginx内置的max_fails不够稳健,建议叠加主动健康检查和VIP漂移:
- 用
nginx-plus或第三方模块(如nginx_upstream_check_module)定期探测PHP-FPM端口是否响应 - 部署Keepalived,在两台Nginx前置机之间虚拟一个浮动IP,避免单点故障
- 代码更新通过Git钩子或CI/CD推送到所有PHP服务器,确保逻辑版本一致



















