位置:首页 > PHP > Linux 下如何用 PHP-FPM 管理多个 PHP 站点

Linux 下如何用 PHP-FPM 管理多个 PHP 站点

时间:2026-08-22  |  作者:电竞小硕  |  阅读:0

目录

  1. 安装 PHP-FPM
  2. 为每个站点配置独立 PHP-FPM 池
  3. 把站点接入 Nginx 或 Apache
  4. 新增站点时按同样模式扩展
  5. 上线后怎么验证与优化
  6. 多站点 PHP-FPM 管理的落点

前言

在一台 Linux 服务器上同时承载多个 PHP 站点时,真正容易出问题的往往不是安装,而是后续的隔离、权限和资源分配。用 PHP-FPM 按站点拆分进程池,是目前最常见也最实用的做法:每个站点拥有自己的 socket、运行用户和日志配置,出了问题也更容易定位。下面按实际部署顺序整理这套方法,从 PHP-FPM 安装、池配置,到接入 Nginx 或 Apache,再到上线后的验证与调优。看完后,你可以判断自己当前的多站点环境是否已经具备足够的隔离性,以及哪些参数值得优先检查。

在一台 Linux 服务器上同时承载多个 PHP 站点时,真正容易出问题的往往不是安装,而是后续的隔离、权限和资源分配。用 PHP-FPM 按站点拆分进程池,是目前最常见也最实用的做法:每个站点拥有自己的 socket、运行用户和日志配置,出了问题也更容易定位。

下面按实际部署顺序整理这套方法,从 PHP-FPM 安装、池配置,到接入 Nginx 或 Apache,再到上线后的验证与调优。看完后,你可以判断自己当前的多站点环境是否已经具备足够的隔离性,以及哪些参数值得优先检查。

安装 PHP-FPM

先确认系统里已经安装 PHP-FPM。不同发行版的安装命令如下。

Debian/Ubuntu

sudo apt update
sudo apt install php-fpm

Red Hat/CentOS

sudo yum install php-fpm

这一步的目标很明确:让系统先具备 PHP-FPM 服务本身,后面的多站点隔离配置才有落点。

为每个站点配置独立 PHP-FPM 池

PHP-FPM 的多站点管理核心在“池”上。一个站点对应一个独立池配置,可以把进程、socket、日志和资源限制拆开,避免不同应用互相影响。

展示单台 Linux 服务器内多个站点分别连接独立 PHP-FPM 池,并通过独立 socket 与 Web 服务器通信的结构图
一站点一池的结构关系多站点 PHP-FPM 的核心是把每个站点拆到独立池中,再用各自 socket 与 Web。

常见做法是以默认池配置为模板复制一份。主配置文件通常位于 /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;usergroup 决定 PHP 进程以什么身份运行;pm.* 参数则控制进程池的并发和空闲进程策略。

其中最需要优先确认的是 listen 路径、usergroup。如果这三项和站点实际权限不匹配,后面最常见的问题就是 502、权限拒绝,或者请求根本进不到对应池。

把站点接入 Nginx 或 Apache

PHP-FPM 池建好后,还需要 Web 服务器把 PHP 请求转发到对应 socket。这里的关键不是“能跑起来”,而是“每个虚拟主机都准确指向自己的池”。

对比 Nginx 与 Apache 在多站点 PHP-FPM 部署中的配置入口与关键指向项
Nginx 与 Apache 的接入重点对比无论使用 Nginx 还是 Apache,核心都是让虚拟主机把 PHP 请求准确转发到对应池。

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 nginx

Apache 配置示例

如果使用 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 池,再根据负载调整进程参数。

展示多站点上线后的检查顺序,包括访问验证、socket 与权限排查,以及 pm 参数调优重点
多站点部署后的检查与调优顺序多站点配置完成后,先确认请求路径和权限,再根据真实负载微调进程池参数。

先验证路由和权限是否正确

逐个访问站点 URL,确认 PHP 请求能被正确转发。如果某个站点打不开,优先检查以下两类问题:

  • Web 服务器配置里的 socket 路径,是否和池配置中的 listen 完全一致。
  • socket 文件、站点目录、user/group 是否存在权限不匹配。

这一步通常比盲目调整参数更重要,因为大部分多站点部署故障都出在路径或权限层面。

再根据负载调整 pm 参数

站点运行稳定后,可以结合 htopphp-fpm status 等工具观察进程占用,再调整以下参数:

  • pm.max_children:限制最大并发子进程数。
  • pm.start_servers:服务启动时预先拉起的进程数。
  • pm.min_spare_serverspm.max_spare_servers:控制空闲进程区间。

如果站点流量较低,参数可以保守一些,避免空耗内存;如果站点并发较高,则需要结合机器内存和 CPU 情况逐步上调,而不是一次性拉满。

多站点 PHP-FPM 管理的落点

Linux 下用 PHP-FPM 管理多个 PHP 站点,本质上就是把执行层按站点拆开,再让 Nginx 或 Apache 分别接入。真正影响稳定性的,不是配置文件写了多少,而是 socket、权限、日志和进程池参数是否都按站点独立落地。

如果你现在维护的是一台承载多个业务的 PHP 主机,优先检查是否还在共用默认池。只要把池配置和虚拟主机关系理顺,后续无论是调优、迁移还是排障,成本都会低很多。

免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。

相关文章

更多

精选合集

更多

大家都在玩

热门话题

大家都在看

更多