一台服务器跑多个网站:资源怎么隔离
发布时间:2025-10-24 16:41       
更新时间:2025-10-25 06:39
一台服务器挂五六个网站很常见,麻烦也常见:一个站被刷爆,其他站跟着卡。隔离要在架站时就做,事后补救的难度大得多,分三层最有效。
进程层:fpm 分池
每个站点一个独立的 php-fpm 池。复制 /etc/php-fpm.d/www.conf 改名 site-a.conf,池名、监听 socket、运行用户各不相同:
[site-a]
user = sitea
listen = /run/php-fpm/site-a.sock
pm.max_children = 10
Nginx 各站点的 fastcgi_pass 指向各自的 socket。池的进程数按站点分量给:轻量博客十个进程绰绰有余,别照抄大站模板,进程数本身也占内存。这样某个站点的代码失控时,耗尽的是它自己池里的进程,其他站点照常服务,各池的慢日志、错误日志也天然分开,排查不用搅在一起。定时任务同样按站点分用户跑,一个站的跑批脚本吃满 CPU 时,不至于把别人的任务一起拖死,这一层最容易被忽略,也最容易出事。
文件层:目录与权限
站点根目录分开,比如 /var/www/sitea、/var/www/siteb,配合每池设置 php_admin_value[open_basedir] 把文件访问圈在自己目录内。可写目录单独划出来,其余目录运行用户只读。做到这一步,一个站被传了 webshell,活动范围也被锁在自己目录里,翻不到隔壁站的配置文件,这一层是横向移动的最后一道闸。
数据层:数据库分账号
每个站点独立数据库账号,只授权自己的库,顺手加上连接数上限:
CREATE USER 'sitea'@'localhost' IDENTIFIED BY '强密码';
GRANT ALL ON sitea_db.* TO 'sitea'@'localhost' WITH MAX_USER_CONNECTIONS 20;
程序配置文件泄露时,损失的也只是单站的库;某站代码写疯了也抢不光连接数,数据库自身的最大连接数上限也要留出管理余量。三层做完,站点之间只剩服务器本身这个共同依赖,业务层面互不牵连。监控也按池和站拆分指标,出问题时先定位到站、再定位到池,比整机一把抓快得多。这套结构前期多花的功夫,在站点涨到五六个之后会加倍还回来,把它当成架站的默认动作,而不是出了问题才想起来补救。