Linux PHP-FPM负载均衡实战指南
一、架构选型与总体思路
二、方案一 Nginx upstream 直接负载均衡到多个 PHP-FPM
http {
upstream php_backend {
# 方式A:Unix socket(同机多实例)
server unix:/run/php/php7.4-fpm-1.sock;
server unix:/run/php/php7.4-fpm-2.sock;
# 方式B:TCP 端口(跨机或同机多实例)
# server 10.0.0.11:9000 weight=1 max_fails=3 fail_timeout=30s;
# server 10.0.0.12:9000 weight=1 max_fails=3 fail_timeout=30s;
# 负载均衡策略(按需选择其一)
# least_conn; # 最少连接
# ip_hash; # 会话保持(基于客户端IP)
# 默认轮询
}
server {
listen 80;
server_name example.com;
root /var/www/html;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_index index.php;
fastcgi_pass php_backend; # 指向 upstream 名称
}
}
}
三、方案二 HAProxy 作为前端负载均衡器
global
log /dev/log local0
log /dev/log local1 notice
daemon
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
frontend http_front
bind *:80
default_backend php_back
backend php_back
balance roundrobin
# Unix socket 示例(需 HAProxy 支持 Unix socket,部分版本/编译选项支持)
# server php1 unix@/run/php/php7.4-fpm-1.sock check
# server php2 unix@/run/php/php7.4-fpm-2.sock check
# TCP 示例(更通用)
server php1 10.0.0.11:9000 check
server php2 10.0.0.12:9000 check
四、方案三 单机多实例 PHP-FPM 配置要点
; www1.conf
[www1]
user = www-data
group = www-data
listen = /run/php/php7.4-fpm-1.sock
listen.owner = www-data
listen.group = www-data
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 10
; www2.conf
[www2]
user = www-data
group = www-data
listen = /run/php/php7.4-fpm-2.sock
listen.owner = www-data
listen.group = www-data
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 10
# 复制服务或自定义单元后,分别启动
systemctl start php7.4-fpm@www1
systemctl start php7.4-fpm@www2
# 或指定配置文件启动
php-fpm -y /etc/php/7.4/fpm/pool.d/www1.conf
php-fpm -y /etc/php/7.4/fpm/pool.d/www2.conf
五、验证、调优与排错
<?php
header('Content-Type: text/plain');
echo "Host: " . gethostname() . "\n";
echo "Remote: " . $_SERVER['REMOTE_ADDR'] . "\n";
echo "Time: " . date('Y-m-d H:i:s') . "\n";