一、PHP-FPM负载均衡的意义
PHP-FPM(FastCGI Process Manager)是PHP的进程管理器,负责处理来自Web服务器的PHP请求。在高流量网站中,单台服务器的PHP-FPM进程池可能无法满足需求,此时需要部署负载均衡来分散请求压力。
负载均衡的核心优势:
| 优势 | 说明 |
|---|---|
| 高可用性 | 单点故障不影响整体服务 |
| 性能扩展 | 横向扩展处理能力 |
| 资源利用 | 充分利用多台服务器资源 |
| 弹性伸缩 | 根据负载动态调整资源 |
二、PHP-FPM架构基础
2.1 进程池模型
PHP-FPM采用Master-Worker进程模型:
- Master进程:管理Worker进程池,监听端口
- Worker进程:处理实际的PHP请求
- 进程池:一组Worker进程的集合
2.2 关键配置参数
编辑PHP-FPM配置文件:
sudo nano /etc/php/8.2/fpm/pool.d/www.conf
核心参数:
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
2.3 进程管理模式
| 模式 | 说明 | 适用场景 |
|---|---|---|
| static | 固定进程数 | 负载稳定、高性能 |
| dynamic | 动态调整 | 负载波动大 |
| ondemand | 按需创建 | 低流量、节省资源 |
三、Nginx Upstream负载均衡
3.1 基础配置
编辑Nginx配置文件:
sudo nano /etc/nginx/conf.d/php-fpm-upstream.conf
添加Upstream配置:
upstream php-fpm-backend {
server 192.168.1.10:9000 weight=5;
server 192.168.1.11:9000 weight=5;
server 192.168.1.12:9000 weight=3 backup;
}
3.2 负载均衡策略
Nginx支持多种负载均衡策略:
轮询(默认):
upstream php-fpm-backend {
server 192.168.1.10:9000;
server 192.168.1.11:9000;
}
加权轮询:
upstream php-fpm-backend {
server 192.168.1.10:9000 weight=5;
server 192.168.1.11:9000 weight=3;
}
IP哈希:
upstream php-fpm-backend {
ip_hash;
server 192.168.1.10:9000;
server 192.168.1.11:9000;
}
最少连接:
upstream php-fpm-backend {
least_conn;
server 192.168.1.10:9000;
server 192.168.1.11:9000;
}
3.3 健康检查配置
upstream php-fpm-backend {
server 192.168.1.10:9000 max_fails=3 fail_timeout=30s;
server 192.168.1.11:9000 max_fails=3 fail_timeout=30s;
server 192.168.1.12:9000 backup;
}
3.4 虚拟主机配置
server {
listen 80;
server_name example.com;
root /var/www/html;
location ~ \.php$ {
fastcgi_pass php-fpm-backend;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
# 超时配置
fastcgi_connect_timeout 60s;
fastcgi_send_timeout 60s;
fastcgi_read_timeout 60s;
}
}
四、PHP-FPM进程池分布式部署
4.1 多服务器架构
架构示意:
+----------------+
| Nginx LB |
+-------+--------+
|
+---------------+---------------+
| | |
+-------v-------+-------v-------+-------v-------+
| PHP-FPM #1 | PHP-FPM #2 | PHP-FPM #3 |
| 192.168.1.10 | 192.168.1.11 | 192.168.1.12 |
+-------+-------+-------+-------+-------+-------+
| | |
+---------------+---------------+
|
+-------v-------+
| MySQL DB |
+---------------+
4.2 各节点PHP-FPM配置
节点1(192.168.1.10):
[www]
listen = 192.168.1.10:9000
listen.allowed_clients = 192.168.1.100
pm = dynamic
pm.max_children = 50
节点2(192.168.1.11):
[www]
listen = 192.168.1.11:9000
listen.allowed_clients = 192.168.1.100
pm = dynamic
pm.max_children = 50
4.3 共享文件存储
NFS挂载共享代码目录:
# 在所有PHP-FPM节点上执行
sudo apt install nfs-common
sudo mkdir -p /var/www/html
sudo mount -t nfs 192.168.1.200:/var/www/html /var/www/html
五、PHP-FPM性能调优
5.1 进程数计算
公式:
pm.max_children = (Total RAM - DB RAM - System RAM) / PHP Process RAM
示例计算:
- 服务器总内存:16GB
- 数据库预留:4GB
- 系统预留:2GB
- 每个PHP进程:128MB
pm.max_children = (16384 - 4096 - 2048) / 128 = 80
5.2 慢日志配置
request_slowlog_timeout = 5s
slowlog = /var/log/php-fpm-slow.log
request_terminate_timeout = 30s
分析慢日志:
tail -f /var/log/php-fpm-slow.log
5.3 状态页面配置
pm.status_path = /php-fpm-status
Nginx配置:
location ~ ^/php-fpm-status {
fastcgi_pass php-fpm-backend;
include fastcgi_params;
allow 127.0.0.1;
allow 192.168.1.0/24;
deny all;
}
访问状态:
curl http://localhost/php-fpm-status
curl http://localhost/php-fpm-status?full
六、高可用配置
6.1 Keepalived实现VIP漂移
主节点配置:
sudo apt install keepalived
sudo nano /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
192.168.1.200
}
}
备节点配置:
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
192.168.1.200
}
}
启动服务:
sudo systemctl enable keepalived
sudo systemctl start keepalived
6.2 健康检查脚本
#!/bin/bash
# /usr/local/bin/php-fpm-health-check.sh
PHP_FPM_STATUS=$(curl -s http://localhost/php-fpm-status | grep "active processes" | awk '{print $3}')
if [ "$PHP_FPM_STATUS" -gt 100 ]; then
echo "PHP-FPM进程数过高: $PHP_FPM_STATUS"
exit 1
fi
exit 0
七、监控与告警
7.1 Prometheus监控
使用php-fpm-exporter:
docker run -d \
--name php-fpm-exporter \
-p 9253:9253 \
--restart=always \
enmsoap/php-fpm-exporter:latest \
--phpfpm.listen-address tcp://192.168.1.10:9000
7.2 Grafana仪表板
导入PHP-FPM仪表板(ID: 1234):
- 活跃进程数
- 空闲进程数
- 慢请求数
- 处理请求数
7.3 告警规则
# Prometheus告警规则
groups:
- name: php-fpm
rules:
- alert: PHP-FPM进程池饱和
expr: phpfpm_active_processes / phpfpm_max_children > 0.9
for: 5m
labels:
severity: critical
annotations:
summary: "PHP-FPM进程池接近饱和"
八、故障排查
8.1 连接超时
症状:502 Bad Gateway
排查:
# 检查PHP-FPM状态
sudo systemctl status php8.2-fpm
# 检查端口监听
sudo netstat -tlnp | grep 9000
# 检查进程数
ps aux | grep php-fpm | wc -l
8.2 进程数不足
症状:请求排队等待
解决:
# 临时增加进程数
sudo sed -i 's/pm.max_children = 50/pm.max_children = 100/' /etc/php/8.2/fpm/pool.d/www.conf
sudo systemctl reload php8.2-fpm
8.3 内存泄漏
症状:PHP进程内存持续增长
解决:
# 配置最大请求数后重启
pm.max_requests = 500
九、最佳实践
9.1 配置优化清单
- [ ] 根据服务器内存计算pm.max_children
- [ ] 启用慢日志定位性能瓶颈
- [ ] 配置状态页面便于监控
- [ ] 设置合理的超时参数
- [ ] 启用Keepalived实现高可用
- [ ] 部署Prometheus+Grafana监控
- [ ] 配置健康检查和自动故障转移
- [ ] 使用NFS或分布式存储共享代码
- [ ] 定期分析慢日志优化查询
9.2 不同规模配置建议
| 规模 | 服务器数量 | pm.max_children | 负载均衡策略 |
|---|---|---|---|
| 小型 | 2台 | 30-50 | 轮询 |
| 中型 | 4台 | 50-100 | 加权轮询 |
| 大型 | 8台+ | 100-200 | 最少连接 |
十、总结
PHP-FPM负载均衡是提升PHP应用性能和可用性的关键措施。通过合理配置Nginx Upstream、优化PHP-FPM进程池、部署高可用架构,可以显著提升应用的并发处理能力。
关键要点:
- Nginx Upstream实现请求分发
- PHP-FPM进程池参数优化
- Keepalived保障高可用
- Prometheus+Grafana全面监控
- 慢日志分析持续优化
注:本文基于PHP 8.2、Nginx 1.24、Ubuntu 22.04编写。