如何在mpm_event模式下为Apache2虚拟主机配置不同用户/组
在Apache mpm_event模式下实现多站点独立用户/组运行PHP的方案
由于mod_itk和mod_privileges与mpm_event不兼容,推荐使用PHP-FPM搭配Apache反向代理的方案,既能保留mpm_event的HTTP/2支持,又能实现每个站点以独立用户/组运行PHP。
步骤1:启用必要的Apache模块
确保Apache启用mpm_event、proxy_fcgi及相关模块,同时禁用与mpm_event冲突的模块:
# 启用模块 a2enmod mpm_event proxy_fcgi setenvif # 禁用冲突的mpm_prefork和mod_php(如果之前启用过) a2dismod mpm_prefork php* # 重启Apache生效 systemctl restart apache2
步骤2:为每个站点配置独立PHP-FPM池
PHP-FPM允许创建多个独立进程池,每个池可指定单独的运行用户/组。
- 进入PHP-FPM的池配置目录(路径根据PHP版本调整,示例为PHP 8.2):
cd /etc/php/8.2/fpm/pool.d/ - 为
site0创建池配置文件site0.conf:[site0] ; 指定站点运行的用户和组 user = user0 group = groupuser0 ; 定义FPM监听的Unix Socket(避免端口冲突) listen = /run/php/php8.2-fpm-site0.sock ; Socket的所有者设为www-data,确保Apache能访问 listen.owner = www-data listen.group = www-data ; 进程管理配置(根据站点流量调整) pm = dynamic pm.max_children = 5 pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 3 - 同理创建
site1.conf,替换user、group和listen路径为对应的值。
步骤3:配置Apache虚拟主机,转发PHP请求到对应FPM池
修改每个站点的虚拟主机配置,将PHP请求转发到对应的FPM Socket,并启用HTTP/2:
site0虚拟主机示例:
<VirtualHost *:80> ServerName site0.example.com DocumentRoot /var/www/site0 <Directory /var/www/site0> Options -Indexes +FollowSymLinks AllowOverride All Require all granted </Directory> ; 将.php请求转发到site0的FPM Socket <FilesMatch \.php$> SetHandler "proxy:unix:/run/php/php8.2-fpm-site0.sock|fcgi://localhost/" </FilesMatch> ; 启用HTTP/2(需确保Apache已支持) Protocols h2 http/1.1 </VirtualHost>
- site1虚拟主机只需替换
DocumentRoot、ServerName和SetHandler中的Socket路径为对应配置即可。
步骤4:重启服务生效
# 重启PHP-FPM systemctl restart php8.2-fpm # 重启Apache systemctl restart apache2
验证效果
访问每个站点的phpinfo()页面,查看User/Group字段,会显示对应站点的user0/groupuser0或user1/groupuser1,同时Server API为FPM/FastCGI,Apache的MPM模式为event,且HTTP/2正常工作。
权限补充说明
无需修改站点文件的所有权,只需确保对应站点用户(如user0)对/var/www/site0下的文件有读取权限:
- 可设置文件权限为
644,目录权限为755; - 若需要写入权限,可通过ACL给对应用户添加权限:
setfacl -R -m u:user0:rwx /var/www/site0
内容的提问来源于stack exchange,提问作者PsyTrxOps
相关产品推荐
相关产品推荐

