我将非常感激任何帮助,我已经束手无策了。
客观的:配置 php-fpm,以便我可以在同一台服务器上拥有多个彼此没有写权限的网站,并且让 php-fpm 以各自的用户身份运行,而不是 www-data
服务器信息:
Ubuntu 20.04
Digital Ocean
PHP 7.4.18
Apache/2.4.41
Configuration File (php.ini) Path /etc/php/7.4/fpm
这是我禁用 www.conf 文件时产生的错误:
[Thu May 20 20:49:03.608217 2021] [proxy:error] [pid 79221] (2)No such file or directory: AH02454: FCGI: attempt to connect to Unix domain socket /var/run/php/php7.4-fpm.sock (*) failed
[Thu May 20 20:49:03.608274 2021] [proxy_fcgi:error] [pid 79221] [client 192.88.134.39:42844] AH01079: failed to make connection to backend: httpd-UDS
我已阅读配置指南并更新了所有 .conf 文件。我确实看到有 php-fpm 进程正在为我指定的用户运行:
systemctl status php7.4-fpm
CGroup: /system.slice/php7.4-fpm.service
├─79327 php-fpm: master process (/etc/php/7.4/fpm/php-fpm.conf)
├─79337 php-fpm: pool user1
├─79338 php-fpm: pool user1
├─79339 php-fpm: pool user2
├─79340 php-fpm: pool user2
├─79341 php-fpm: pool www
└─79342 php-fpm: pool www
但是,当我在 user1 的网站上运行 phpinfo 时,看到以下内容:
$_SERVER['USER'] www-data
$_SERVER['HOME'] /var/www
用户应该是 user1,主目录实际上是 /home/user1/website1.com
我根据 php-fpm 教程调整了这里所有的.conf 文件:
/etc/php/7.4/fpm/pool.d
/etc/apache2/sites-available
/usr/lib/tmpfiles.d
例子:
/etc/php/7.4/fpm/pool.d/user1.com.conf
; pool name ('www' here)
[user1]
user = user1
group = user1
listen = /var/lib/dpkg/alternatives/php-fpm-user1.sock
----
/etc/apache2/sites-available/user1.com.conf
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName user1.com
ServerAlias www.user1.com
DocumentRoot /home/user1/user1.com
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory /home/user1/user1.com/>
Options FollowSymLinks
AllowOverride All
Require all granted
</Directory>
<FilesMatch \.php$>
SetHandler "proxy:unix:/var/run/php/php7.4-fpm.sock|fcgi://localhost"
</FilesMatch>
</VirtualHost>
----
/usr/lib/tmpfiles.d/php7.4/php7.4-fpm.conf
#Type Path Mode UID GID Age Argument
d /run/php 0755 user1 user1 - -
.sock 文件在这里正确生成:
/var/lib/dpkg/alternatives/php-fpm-user1.sock
/var/lib/dpkg/alternatives/php-fpm-user2.sock
phpinfo 正确显示了这一点:
Server API FPM/FastCGI
但是当我重命名/禁用此文件时,服务器抛出 503 服务不可用,我猜测是因为网站仍以 www-data 身份运行:
/etc/php/7.4/fpm/pool.d/www.conf
我遗漏了什么,谢谢。
编辑:我通过拆除整个服务器并从头开始使用 nginx 而不是 apache 并遵循以下指南解决了该问题:
https://www.vultr.com/docs/use-php-fpm-pools-to-secure-multiple-web-sites
而且效果非常好。真是让人松了一口气。
答案1
我还没有完全调查这里的这个问题,但发现三天内没有人回答,因此提出了一个观察结果:
我希望 Apache 通过特定用户 sock 与 php 通信。具体来说,希望有以下行:
SetHandler "proxy:unix:/var/run/php/php7.4-fpm.sock|fcgi://localhost"
成为:
SetHandler "proxy:unix:/var/lib/dpkg/alternatives/php-fpm-user1.sock|fcgi://localhost"