核心方案是为每个网站配置独立的php-fpm进程池实现物理隔离:通过专属pool名、socket路径、用户权限及open_basedir限制,配合nginx精准指向对应socket,并设置request_terminate_timeout与fastcgi_read_timeout超时熔断机制。

核心思路是让每个网站运行在独立的 PHP-FPM 进程池中,物理隔离资源与执行环境。一个站点的脚本崩溃、死循环或内存泄漏,只会杀死它自己的 pool 子进程,不会波及其他站点。
用独立 pool 实现硬隔离
多个站点共用默认 www 池时,只要一个脚本卡死或触发 OOM,整个池的子进程(比如 pm.max_children=50)很快被占满,其他所有站点立刻 502。解决办法是为每个站点建专属 pool:
- 在 /www/server/php/74/etc/php-fpm.d/ 下新建 site-a.com.conf,定义唯一 pool 名和 socket 路径:
pool = site-a.com<br>listen = /tmp/php-cgi-site-a.sock
- 设置独立用户与权限:
user = www<br>group = www<br>listen.mode = 666
- 加文件访问限制:
php_admin_value[open_basedir] = /www/wwwroot/site-a.com:/tmp:/proc - 同理为 site-b.com 建 site-b.com.conf,只改 pool 名、socket 和根目录路径
Nginx 端绑定对应 socket
进入宝塔【网站】→ 编辑站点 → 【配置文件】,找到 location ~ \.php$ 区块,把默认的:
fastcgi_pass unix:/tmp/php-cgi-74.sock;
替换成该站点专属路径:
fastcgi_pass unix:/tmp/php-cgi-site-a.sock;
保存后宝塔会自动重载 Nginx。注意:改完必须执行 php-fpm74 -t 校验语法,再重启 PHP-FPM 服务。
配合超时与熔断进一步兜底
即使有了独立 pool,单个脚本长时间阻塞仍可能拖慢自身站点响应。建议同步加固:
- 在 pool 配置中设
request_terminate_timeout = 30s,强制终止超时脚本 - Nginx 中配
fastcgi_read_timeout 30s,与 PHP-FPM 超时对齐,避免 504 - 启用
fastcgi_next_upstream error timeout http_500 http_502,当该 pool 不可用时快速失败,不堆积请求
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











