核心是为每个站点配置独立php-fpm进程池,通过专属socket、用户隔离、open_basedir限制及nginx精准指向实现资源与安全隔离。

在 Nginx 多域名环境下为不同 PHP 站点配置独立 PHP-FPM 池,核心目标是实现资源隔离、安全加固和故障互不影响。每个站点使用专属的 FPM 进程池(pool),意味着各自有独立的用户、内存限制、子进程数、日志路径和监听地址。
一、为每个站点创建独立的 FPM 池配置文件
在 /etc/php/*/fpm/pool.d/ 目录下,为每个域名新建一个 .conf 文件,例如:
-
site1.com.conf对应site1.com -
admin.site1.com.conf对应后台子域 -
site2.net.conf对应第二个站点
每个文件内容结构一致,仅参数按需差异化。以 site1.com.conf 为例:
[site1.com]
user = site1
group = site1
listen = /run/php/php8.2-fpm-site1.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
<p>pm = dynamic
pm.max_children = 20
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 5</p><p>slowlog = /var/log/php8.2-fpm-site1.slow.log
access.log = /var/log/php8.2-fpm-site1.access.log
access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%"</p><p>php_admin_value[open_basedir] = /var/www/site1:/tmp
php_admin_value[upload_tmp_dir] = /var/www/site1/tmp
php_admin_value[session.save_path] = /var/www/site1/sessions</p>
关键点:
-
listen使用独立 Unix socket 路径,避免端口冲突且更安全 -
user/group建议为每个站点创建专用系统用户(如adduser --home /var/www/site1 --shell /usr/sbin/nologin site1) -
open_basedir强制限制脚本只能访问本目录及 tmp/session 子目录,防跨站读取
二、Nginx 站点配置中精准指向对应池
每个站点的 Nginx 配置(如 /etc/nginx/sites-available/site1.com)必须与 FPM 池的 listen 地址严格匹配:
server {
listen 80;
server_name site1.com www.site1.com;
root /var/www/site1;
index index.php;
<pre class="brush:php;toolbar:false;">location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.2-fpm-site1.sock; ← 必须与 pool 中 listen 一致
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}}
注意:fastcgi_pass 的路径不能写错,也不能复用默认的 www.conf socket;否则所有站点将共用同一池,失去隔离意义。
三、权限与服务管理要点
确保系统层面权限闭环:
- FPM 池文件属主为
root:www-data,权限644 - socket 文件由 PHP-FPM 自动创建,属主自动设为
www-data:www-data(因listen.owner/group已指定) - Nginx worker 进程需属于
www-data组,才能访问 socket(检查grep "worker_groups" /etc/nginx/nginx.conf) - 重启顺序:先
systemctl reload php8.2-fpm(加载新池),再nginx -t && systemctl reload nginx
四、验证与日常维护
上线后快速验证是否生效:
- 查看池是否运行:
sudo systemctl status php8.2-fpm→ 观察输出中是否列出site1.com、site2.net等池名 - 检查 socket 是否存在且可访问:
ls -l /run/php/php8.2-fpm-*.sock - 在各站点根目录放
info.php,访问后看PHP Variables → $_SERVER['USER']是否等于池中定义的user值 - 故意触发慢请求,观察对应
slowlog是否有记录,确认日志分流有效
这样配置后,一个站点的 PHP 内存溢出或死循环,不会拖垮其他站点,也杜绝了通过共享池越权访问他人文件的可能。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











