本文目录导读:

- 核心概念:无状态化
- 方案一:使用 Nginx 作为反向代理(最常见、推荐)
- 方案二:使用 HAProxy(高性能专用负载均衡器)
- 方案三:云服务商提供的负载均衡(最佳实践 - 生产环境)
- 关键注意事项
- 推荐选择
为 PHP 项目配置负载均衡,核心目的是将流量分发到多台服务器上,以提高可用性、扩展性和性能,由于 PHP 通常是无状态的(状态存储在 Session/数据库/Redis 中),配置起来相对直接。
以下是详细的配置步骤和常见方案,从简单的 DNS 轮询到企业级反向代理。
核心概念:无状态化
在配置负载均衡之前,最重要的前提是 确保你的 PHP 应用是无状态的。
- Session 问题:不要将 Session 存储在本地文件系统(
php.ini默认),因为用户的下一个请求可能被分发到另一台服务器。 - 解决方案:将 Session 存储在共享的中央存储中,如 Redis、Memcached 或 数据库。
- 修改
php.ini:session.save_handler = redis且session.save_path = "tcp://192.168.1.100:6379"(示例)
- 修改
使用 Nginx 作为反向代理(最常见、推荐)
这是目前最流行、最灵活的方式,Nginx 作为“入口服务器”接收所有用户请求,然后根据算法将请求分发给后端的多台 PHP-FPM 服务器。
架构图:
用户 -> Nginx (负载均衡器) -> 后端 PHP-FPM 服务器组 (Server1, Server2, Server3)
配置步骤:
-
环境要求:
- 一台或多台运行 PHP-FPM 的应用服务器(A、B、C)。
- 一台运行 Nginx 的负载均衡服务器(或直接将 Nginx 安装在其中一台应用服务器上并反向代理其他服务器)。
- 所有 PHP 应用代码必须同步到所有后端服务器(可以使用 Git、Rsync 或共享存储如 NFS)。
-
修改 Nginx 配置文件(通常是
/etc/nginx/nginx.conf或对应的站点配置文件):# 在 http 块中定义上游服务器组 (upstream) upstream php_backend { # 负载均衡算法:默认是 round-robin (轮询) # 可选: least_conn (最少连接), ip_hash (根据IP保持会话,慎用) server 192.168.1.10:9000 weight=3; # Server A,权重3 server 192.168.1.11:9000 weight=1; # Server B,权重1 server 192.168.1.12:9000; # Server C,权重默认1 # 健康检查 (需要 Nginx Plus 或开源版 ngx_http_upstream_check_module) # 开源版建议使用被动健康检查, 如下配置 fail_timeout 和 max_fails keepalive 32; # 保持与后端的连接数 } server { listen 80; server_name yourdomain.com; root /var/www/html; # 注意:Nginx 是独立的 LB,这个路径可能不需要或指向一个默认页 # 关键 location 块 location ~ \.php$ { # 将请求转发到 upstream 组 fastcgi_pass php_backend; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; # 传递真实客户端 IP proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; } # 静态文件处理 (推荐由 Nginx 直接处理, 不经过 PHP) location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ { expires 30d; # 如果静态文件共享, 可以配置多个后端, 或者直接指向共享存储 } } -
重启 Nginx:
sudo systemctl restart nginx -
PHP-FPM 配置调整:
- 在每台后端 PHP 服务器上,确保 PHP-FPM 监听所有网络接口或 Nginx 可以访问的 IP。
- 修改
www.conf:listen = 9000或listen = 192.168.1.10:9000(而非只监听0.0.1)。 - 安全提示:使用防火墙(如
iptables或ufw)限制只有负载均衡服务器的 IP 才能访问 9000 端口。
使用 HAProxy(高性能专用负载均衡器)
HAProxy 是非常专业的 TCP/HTTP 负载均衡软件,性能极高,配置灵活。
架构图:
用户 -> HAProxy (监听 80/443) -> Nginx/Apache (每台后端服务器) -> PHP-FPM
配置步骤:
-
安装 HAProxy:
sudo apt install haproxy(Debian/Ubuntu) -
配置
/etc/haproxy/haproxy.cfg:global log /dev/log local0 maxconn 4096 user haproxy group haproxy defaults log global mode http # 工作在 HTTP 模式,支持更高级的会话保持 option httplog option dontlognull retries 3 timeout connect 5000ms timeout client 50000ms timeout server 50000ms # 前端: 接收用户请求 frontend php_frontend bind *:80 default_backend php_backends # 可选: 根据 URI 或 Cookie 进行分发 # acl is_static path_end .jpg .png .css .js # use_backend static_backends if is_static # 后端: 服务器池 backend php_backends balance roundrobin # 负载均衡算法 # 健康检查 option httpchk GET /health_check.php HTTP/1.1\r\nHost:\ example.com server web1 192.168.1.10:80 check weight 3 server web2 192.168.1.11:80 check weight 1 server web3 192.168.1.12:80 check weight 1 # 会话保持 (基于 Cookie) cookie PHPSESSID prefix server web1 192.168.1.10:80 cookie s1 check server web2 192.168.1.11:80 cookie s2 check -
在后端服务器上创建简单的健康检查文件
/var/www/html/health_check.php:<?php // 可以在这里检查数据库连接、缓存等 http_response_code(200); echo 'OK';
-
重启 HAProxy:
sudo systemctl restart haproxy
云服务商提供的负载均衡(最佳实践 - 生产环境)
如果你使用 AWS、阿里云、腾讯云、Azure 等,强烈推荐使用它们的托管负载均衡服务,这将大大减少运维复杂度。
- AWS:使用 ELB (Elastic Load Balancer),特别是 ALB (Application Load Balancer),ALB 支持基于路径和主机的路由,与 AWS Auto Scaling 完美集成。
- 阿里云:使用 SLB (Server Load Balancer),支持 HTTP/HTTPS,直接关联后端 ECS 实例。
- 腾讯云:使用 CLB (Cloud Load Balancer)。
配置步骤(以 AWS ALB 为例):
- 创建目标组 (Target Group),选择协议为 HTTP,端口为 80(或 8080)。
- 注册后端 EC2 实例(运行 PHP-FPM + Nginx)。
- 配置健康检查路径(如
/health_check.php)。 - 创建 Application Load Balancer,监听 80/443 端口,关联上述目标组。
- 关键:配置 Sticky Sessions(会话粘性) 功能,基于 Cookie(如
AWSALB),或者你的应用已经将 Session 存储在 Redis 中,可以关闭粘性。
关键注意事项
-
Session 共享:再次强调,这是第一件要做的事,使用 Redis 或 Memcached 是最佳实践。
// 在 php.ini 或配置文件中设置 ini_set('session.save_handler', 'redis'); ini_set('session.save_path', 'tcp://192.168.1.50:6379?auth=yourpassword'); -
文件上传与同步:
- 用户上传的文件(如头像、图片)不能只存在一台服务器上。
- 方案 A:使用共享文件系统(如 NFS、GlusterFS、AWS EFS)。
- 方案 B:直接上传到对象存储(如 AWS S3、阿里云 OSS、腾讯云 COS),这是最佳选择。
-
缓存一致性:
- 如果使用 OpCache(如
opcache),在部署新代码后,需要刷新所有服务器的 OpCache(重启 PHP-FPM 或使用opcache_reset()函数),可以编写一个部署脚本,通过curl触发所有服务器的清理接口。
- 如果使用 OpCache(如
-
日志集中化:
- 每台服务器的 PHP 错误日志、访问日志都会分散,建议使用 ELK Stack (Elasticsearch, Logstash, Kibana) 或 Graylog 进行日志收集。
-
健康检查:
- 配置一个简单的 PHP 文件用于负载均衡器检查,不应只返回
200 OK,最好检查数据库连接、缓存是否可用。<?php $db = new PDO('mysql:host=db_host;dbname=test', 'user', 'pass'); return http_response_code(200); // OK
- 配置一个简单的 PHP 文件用于负载均衡器检查,不应只返回
-
数据库:
负载均衡解决了 Web 层问题,但数据库依然是单点,需要配置数据库的主从复制或使用云数据库(RDS)。
推荐选择
| 场景 | 最佳方案 |
|---|---|
| 小型项目 / 测试环境 | Nginx 反向代理 (Upstream) |
| 生产环境 / 高并发 | HAProxy (前端) + Nginx (后端) 或 云服务商 ALB/SLB/CLB |
| 云原生 / 微服务 | 云服务商负载均衡 + Kubernetes (K8s) |
最终建议:如果你的项目是部署在云上的,直接使用云服务商提供的负载均衡器,它能自动处理故障转移、健康检查,并提供管理控制台和监控,比手动配置 Nginx/HAProxy 要可靠得多,只需要在自己服务器上配置好 PHP-FPM 并确保无状态即可。