在一台 Linux 服务器上同时承载多个 PHP 站点时,真正容易出问题的往往不是安装,而是后续的隔离、权限和资源分配。用 PHP-FPM 按站点拆分进程池,是目前最常见也最实用的做法:每个站点拥有自己的 socket、运行用户和日志配置,出了问题也更容易定位。
下面按实际部署顺序整理这套方法,从 PHP-FPM 安装、池配置,到接入 Nginx 或 Apache,再到上线后的验证与调优。看完后,你可以判断自己当前的多站点环境是否已经具备足够的隔离性,以及哪些参数值得优先检查。
安装 PHP-FPM
先确认系统里已经安装 PHP-FPM。不同发行版的安装命令如下。
Debian/Ubuntu
sudo apt update
sudo apt install php-fpmRed Hat/CentOS
sudo yum install php-fpm这一步的目标很明确:让系统先具备 PHP-FPM 服务本身,后面的多站点隔离配置才有落点。
为每个站点配置独立 PHP-FPM 池
PHP-FPM 的多站点管理核心在“池”上。一个站点对应一个独立池配置,可以把进程、socket、日志和资源限制拆开,避免不同应用互相影响。

常见做法是以默认池配置为模板复制一份。主配置文件通常位于 /etc/php/7.x/fpm/pool.d/www.conf:
sudo cp /etc/php/7.x/fpm/pool.d/www.conf /etc/php/7.x/fpm/pool.d/site1.conf然后编辑新建的站点池配置:
sudo nano /etc/php/7.x/fpm/pool.d/site1.conf示例配置如下:
[site1]
listen = /run/php/php7.x-fpm-site1.sock
listen.owner = www-data
listen.group = www-data
user = www-data
group = www-data
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
php_value[sendmail_path] = /usr/sbin/sendmail -t -i
php_admin_value[error_log] = /var/log/php-fpm/site1-error.log
php_admin_flag[log_errors] = on这些参数分别在解决什么问题
[site1] 是池名称,用来区分不同站点;listen 定义该站点与 Web 服务器通信时使用的 socket;user 和 group 决定 PHP 进程以什么身份运行;pm.* 参数则控制进程池的并发和空闲进程策略。
其中最需要优先确认的是 listen 路径、user 和 group。如果这三项和站点实际权限不匹配,后面最常见的问题就是 502、权限拒绝,或者请求根本进不到对应池。
把站点接入 Nginx 或 Apache
PHP-FPM 池建好后,还需要 Web 服务器把 PHP 请求转发到对应 socket。这里的关键不是“能跑起来”,而是“每个虚拟主机都准确指向自己的池”。

Nginx 配置示例
先编辑站点配置文件,例如 /etc/nginx/sites-a vailable/site1:
sudo nano /etc/nginx/sites-a vailable/site1写入以下配置:
server {
listen 80;
server_name site1.example.com;
root /var/www/site1;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
location ~ .php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.x-fpm-site1.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}这里最重要的是 fastcgi_pass unix:/run/php/php7.x-fpm-site1.sock;,它必须和对应 PHP-FPM 池里的 listen 路径一致。
配置完成后启用站点并检查语法:
sudo ln -s /etc/nginx/sites-a vailable/site1 /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginxApache 配置示例
如果使用 Apache,则编辑 /etc/apache2/sites-a vailable/site1.conf:
sudo nano /etc/apache2/sites-a vailable/site1.conf写入:
ServerName site1.example.com
DocumentRoot /var/www/site1
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
ErrorLog ${APACHE_LOG_DIR}/site1_error.log
CustomLog ${APACHE_LOG_DIR}/site1_access.log combined
再启用站点并重启 Apache:
sudo a2ensite site1.conf
sudo systemctl restart apache2无论是 Nginx 还是 Apache,配置逻辑都一样:虚拟主机负责入口路由,PHP-FPM 池负责执行 PHP,请求路径要一一对应。
新增站点时按同样模式扩展
第一个站点跑通后,后续站点不需要重新设计结构,只要重复两件事:
扩展时保持一站点一池一虚拟主机
每个新站点都复制一份新的 PHP-FPM 池配置,并为它单独创建对应的 Web 服务器虚拟主机。这样做的好处是结构清晰,资源边界明确,某个站点出现高负载或报错时,不容易把其他站点一起拖下水。
在实际维护中,这种“一站点一池”的方式也更方便排查:socket、日志、目录和服务入口都是独立的,不必在共享池里猜测是哪一个应用出了问题。
上线后怎么验证与优化
配置完成后,不建议直接收工。至少要先验证请求是否已经进入正确的 PHP-FPM 池,再根据负载调整进程参数。

先验证路由和权限是否正确
逐个访问站点 URL,确认 PHP 请求能被正确转发。如果某个站点打不开,优先检查以下两类问题:
- Web 服务器配置里的 socket 路径,是否和池配置中的
listen完全一致。 - socket 文件、站点目录、
user/group是否存在权限不匹配。
这一步通常比盲目调整参数更重要,因为大部分多站点部署故障都出在路径或权限层面。
再根据负载调整 pm 参数
站点运行稳定后,可以结合 htop、php-fpm status 等工具观察进程占用,再调整以下参数:
pm.max_children:限制最大并发子进程数。pm.start_servers:服务启动时预先拉起的进程数。pm.min_spare_servers和pm.max_spare_servers:控制空闲进程区间。
如果站点流量较低,参数可以保守一些,避免空耗内存;如果站点并发较高,则需要结合机器内存和 CPU 情况逐步上调,而不是一次性拉满。
多站点 PHP-FPM 管理的落点
Linux 下用 PHP-FPM 管理多个 PHP 站点,本质上就是把执行层按站点拆开,再让 Nginx 或 Apache 分别接入。真正影响稳定性的,不是配置文件写了多少,而是 socket、权限、日志和进程池参数是否都按站点独立落地。
如果你现在维护的是一台承载多个业务的 PHP 主机,优先检查是否还在共用默认池。只要把池配置和虚拟主机关系理顺,后续无论是调优、迁移还是排障,成本都会低很多。







