我一直在阅读 php-fpm文档并且发现我可以为每个套接字赋予自己的用户、组和模式,但是我如何告诉 apache(我的意思是每个 vhost)使用 x 用户和 y 组来连接到套接字?
我想要实现的是防止池读取彼此的文件,如果发生违规,则只有该域的文件会被泄露,而不会泄露其他文件。我知道如何使用user
和group
设置为 fpm 池执行此操作,然后为文件结构赋予适当的权限。但是如果同一个 http 用户能够访问所有 fpm 套接字怎么办?我应该担心吗?
pool1.conf (php-fpm)
[pool1]
user = domain1
group = domain1
listen = /run/php-fpm/www.domain1.sock
listen.owner = http
listen.group = http
listen.mode = 0660
domain1.conf(apache虚拟主机)
<VirtualHost *:443>
ServerAdmin [email protected]
ServerName www.domain1.com
DocumentRoot "/srv/http/domain1.com/www"
<Directory "/srv/http/domain1.com/www">
<IfModule dir_module>
DirectoryIndex index.php
</IfModule>
<Files "index.php">
SetHandler "proxy:unix:/run/php-fpm/www.domain1.sock|fcgi://localhost/"
</Files>
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^index\.php$ - [L]
RewriteRule . index.php [L]
</IfModule>
</Directory>
SSLEngine On
SSLCertificateFile "/etc/letsencrypt/live/domain1.com/fullchain.pem"
SSLCertificateKeyFile "/etc/letsencrypt/live/domain1.com/privkey.pem"
Protocols h2 h2c
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains;"
ErrorLog "/srv/protected/sites/domain1.com/logs/www-error_log"
CustomLog "/srv/protected/sites/domain1.com/logs/www-access_log" common
</VirtualHost>
我还想弄清楚为什么默认值listen.mode
是0660
?为什么 http 组需要读写权限?
答案1
我不是专家,但我理解它的工作原理如下。每个进程都以系统(服务)用户的身份运行。Apache 是一个进程,并以它的用户身份运行(http
在您的示例中)。我认为,为了实现您想要的效果,您需要生成一个具有自己用户的单独 apache 进程。
但是,要做到这一点,您还需要将每个用户/站点放在自己的端口上,然后在同一台机器上设置一个反向代理,监听端口 80/443 并相应地访问相应的站点。
这实际上不是一个糟糕的设置,因为它还使您有机会在代理服务器上添加 mod_security 并一次覆盖所有站点。
因此,简而言之,PHP-FPM 不是您要寻找的解决方案(如果我正确理解了您的问题)。该listen.user
指令必须与运行 apache 的用户相同。
答案2
也许 apache2-mpm-itk 可以做到 https://cloudkul.com/blog/apache-virtual-hosting-with-different-users/