Apache 唯一 Vhost 用户,PHP 会话不工作
Apache unique Vhost user, PHP sessions not working
我正在寻找 运行 多个 Apache 服务器,它们将为多个客户端托管网站。我已经安装了 libapache2-mpm-itk 模块并为每个客户端文件集创建了唯一的 users/groups。并将其相应的 vhost 文件配置为 运行 具有 user/group.
的进程
<IfModule mpm_itk_module>
AssignUserId www-client www-client1
</IfModule>
在我尝试使用 PHP 会话之前,它工作正常。在虚拟主机文件中,我还添加了一个自定义会话保存路径。
php_admin_value session.save_path "/var/www/html/client1/_php/session"
PHP 脚本能够在具有以下权限的目录中生成会话文件,但无法读取它们:
-rw------- www-client1 www-client1
我的虚拟主机的完整示例是:
<VirtualHost *:443>
ServerName client1.com
ServerAlias client1.com www.client1.com
DocumentRoot /var/www/html/client1/www
ErrorLog /var/www/logs/client1/www-error.log
CustomLog /var/www/logs/client1/www-access.log combined
php_admin_value error_log "/var/www/logs/client1/www-error.php.log"
<Directory /var/www/html/client1/www>
Options None
AllowOverride None
Order Deny,Allow
Allow from All
</Directory>
<IfModule mpm_itk_module>
AssignUserId www-client1 www-client1
</IfModule>
php_admin_value log_errors 1
php_admin_value open_basedir "/var/www/html/client1"
php_admin_value upload_tmp_dir "/var/www/html/client1/_php/upload_tmp"
php_admin_value session.save_path "/var/www/html/client1/_php/session"
php_admin_value soap.wsdl_cache_dir "/var/www/html/client1/_php/soap_cache"
SSLEngine On
SSLCertificateFile /var/www/certs/client1/www.crt
SSLCertificateKeyFile /var/www/certs/client/www.key
</VirtualHost>
我 运行 在 Ubuntu 20.04 上 运行ning Apache 2.4.41,PHP 7.4.3,并且没有错误输出到我的任何日志文件。
任何 ideas/suggestions 对此和进一步的改进将不胜感激。
经过大量谷歌搜索后,我找到了解决方案。
我还需要确保 php-fpm 已安装并将以下配置行添加到指向每个用户唯一的 PHP FPM 套接字的 Apache VHost 解决了我的问题。
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php-fpm-client1.sock|fcgi://localhost"
</FilesMatch>
我的 PHP FPM 配置文件如下所示:
vi /etc/php/X/fpm/pool.d/client1.conf
[client1]
user = www-client1
group = www-client1
listen = /run/php/php-fpm-client1.sock
listen.owner = www-client1
listen.group = www-client1
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
php_admin_value[log_errors] = 1
php_admin_value[error_log] = "/var/www/logs/client1/php-error.log"
php_admin_value[open_basedir] = "/var/www/html/client1"
php_admin_value[session.save_path] = "/var/www/html/client1/_php/session"
bash /etc/init.d/php*-fpm restart
我还发现 VHost 中定义的所有 php_admin_value
值都需要移动到 FPM 池中。
我正在寻找 运行 多个 Apache 服务器,它们将为多个客户端托管网站。我已经安装了 libapache2-mpm-itk 模块并为每个客户端文件集创建了唯一的 users/groups。并将其相应的 vhost 文件配置为 运行 具有 user/group.
的进程<IfModule mpm_itk_module>
AssignUserId www-client www-client1
</IfModule>
在我尝试使用 PHP 会话之前,它工作正常。在虚拟主机文件中,我还添加了一个自定义会话保存路径。
php_admin_value session.save_path "/var/www/html/client1/_php/session"
PHP 脚本能够在具有以下权限的目录中生成会话文件,但无法读取它们:
-rw------- www-client1 www-client1
我的虚拟主机的完整示例是:
<VirtualHost *:443>
ServerName client1.com
ServerAlias client1.com www.client1.com
DocumentRoot /var/www/html/client1/www
ErrorLog /var/www/logs/client1/www-error.log
CustomLog /var/www/logs/client1/www-access.log combined
php_admin_value error_log "/var/www/logs/client1/www-error.php.log"
<Directory /var/www/html/client1/www>
Options None
AllowOverride None
Order Deny,Allow
Allow from All
</Directory>
<IfModule mpm_itk_module>
AssignUserId www-client1 www-client1
</IfModule>
php_admin_value log_errors 1
php_admin_value open_basedir "/var/www/html/client1"
php_admin_value upload_tmp_dir "/var/www/html/client1/_php/upload_tmp"
php_admin_value session.save_path "/var/www/html/client1/_php/session"
php_admin_value soap.wsdl_cache_dir "/var/www/html/client1/_php/soap_cache"
SSLEngine On
SSLCertificateFile /var/www/certs/client1/www.crt
SSLCertificateKeyFile /var/www/certs/client/www.key
</VirtualHost>
我 运行 在 Ubuntu 20.04 上 运行ning Apache 2.4.41,PHP 7.4.3,并且没有错误输出到我的任何日志文件。
任何 ideas/suggestions 对此和进一步的改进将不胜感激。
经过大量谷歌搜索后,我找到了解决方案。
我还需要确保 php-fpm 已安装并将以下配置行添加到指向每个用户唯一的 PHP FPM 套接字的 Apache VHost 解决了我的问题。
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php-fpm-client1.sock|fcgi://localhost"
</FilesMatch>
我的 PHP FPM 配置文件如下所示:
vi /etc/php/X/fpm/pool.d/client1.conf
[client1]
user = www-client1
group = www-client1
listen = /run/php/php-fpm-client1.sock
listen.owner = www-client1
listen.group = www-client1
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
php_admin_value[log_errors] = 1
php_admin_value[error_log] = "/var/www/logs/client1/php-error.log"
php_admin_value[open_basedir] = "/var/www/html/client1"
php_admin_value[session.save_path] = "/var/www/html/client1/_php/session"
bash /etc/init.d/php*-fpm restart
我还发现 VHost 中定义的所有 php_admin_value
值都需要移动到 FPM 池中。