架构选型与总体思路
- 在 LNMP 场景中,负载均衡通常指在 Nginx 层做反向代理,把请求分发到多台后端 Nginx+PHP-FPM 应用节点;数据库层通过 MySQL 主从复制实现读写分离,避免数据库成为瓶颈。
- 负载均衡策略可选:轮询 round-robin、最少连接 least_conn、IP 哈希 ip_hash(会话保持)。
- 高可用方案:在 L4/L7 负载均衡器前再加一层 Keepalived + VIP,实现故障秒切,消除单点。
- 监控与优化:接入 Prometheus + Grafana 或 Zabbix/Netdata 做指标与健康检查,按负载调整 worker_processes/worker_connections 与后端权重。
方案一 Nginx 层负载均衡(最常用)
- 拓扑:客户端 → Nginx 负载均衡器 → 多台 Nginx+PHP-FPM 应用节点(相同代码与配置)。
- 负载均衡器配置示例(/etc/nginx/nginx.conf 或 /etc/nginx/conf.d/lb.conf):
http {
upstream backend {
least_conn;
server 10.0.0.11:80 weight=3 max_fails=2 fail_timeout=30s;
server 10.0.0.12:80 weight=1 max_fails=2 fail_timeout=30s;
server 10.0.0.13:80 backup;
}
server {
listen 80;
server_name www.example.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_next_upstream error timeout http_502 http_503 http_504;
}
}
}
- 后端节点要点:
- 各节点部署相同站点目录与代码;Nginx 处理静态资源,PHP 通过 PHP-FPM 处理。
- PHP-FPM 建议配置(/etc/php-fpm.d/www.conf):
- 动态进程管理:pm = dynamic
- 进程数:pm.max_children、pm.start_servers、pm.min_spare_servers、pm.max_spare_servers
- 通信方式:可用 TCP 127.0.0.1:9000 或 Unix socket /var/run/php-fpm/php-fpm.sock
- 数据库层建议:部署 MySQL 主从复制,应用写主库、读从库,降低主库压力。
方案二 LVS + Keepalived 四层高可用负载均衡
- 适用场景:更高并发与更高可靠性需求;LVS 做四层转发,Keepalived 提供 VRRP 主备与 VIP 漂移。
- 基本拓扑:客户端 → VIP(漂移在 LVS 主备之间)→ LVS-DR 模式 → 多台 Nginx+PHP-FPM 后端。
- 核心配置要点(示例思路):
- 两台 LVS 调度器安装 keepalived,配置 vrrp_instance 与 virtual_ipaddress(同一 VRID 的主备不同优先级),实现 VIP 自动切换。
- LVS 配置 virtual_server 使用 lb_algo rr、lb_kind DR、protocol TCP,后端 realserver 指向各 Nginx 节点 80 端口。
- 后端 realserver 开启 ARP 抑制 与 lo:0 绑定 VIP,确保 DR 模式回包正确;健康检查可用 HTTP_GET 等。
- 该方案在出现节点故障时可实现 秒级切换,适合生产环境。
验证与优化
- 健康检查与故障演练:
- 临时停止某台后端,验证 proxy_next_upstream 是否生效、请求是否自动落到健康节点。
- 对 LVS 方案,停止主调度器 keepalived,确认 VIP 漂移到备机且业务不中断。
- 性能与容量:
- 调整负载均衡器 worker_processes(通常设为 CPU 核数)与 worker_connections(如 10240),并开启 gzip、合理的 keepalive 与缓存策略。
- 后端 PHP-FPM 依据内存与 QPS 调整 pm.max_children 等参数,避免 OOM 与排队过长。
- 监控与日志:
- 接入 Prometheus + Grafana 采集 Nginx/php-fpm 指标与后端健康;或 Zabbix/Netdata 做告警与可视化。
- 集中收集 Nginx access/error 与 php-fpm slowlog,定位长尾与异常。