我们的服务器是 Ubuntu 18.04.5 LTS(GNU/Linux 4.15.0-135-generic x86_64)。
我们按照https://tecadmin.net/install-multiple-php-version-apache-ubuntu/前段时间,在 7.2 刚发布时,PHP 5.6 和 7.2 就开始运行了,直到今天早上,我升级并添加了 7.3 和 7.4,都没有问题。昨天它运行正常,但今天却不行了。我们昨天早些时候打包了更新,但它不需要重新启动,而且我不相信它会在一夜之间自行重新启动,因为uptime
我们已经快 15 天了。
所以今天我们开始再次经历这个过程,并且做到了这一点,在每个步骤之后重新启动 apache2:
尝试过:
a2enmod actions fcgid alias proxy_fcgi
并得到:
ERROR: Module fcgid does not exist!
做了apt install apache2 libapache2-mod-fcgid
和那工作并添加了该包。
确实a2enmod actions fcgid alias proxy_fcgi
如此,它说明了一切已经启用。
检查了conf文件/etc/apache2/sites-enabled
:
<FilesMatch \.php$>
SetHandler "proxy:unix:/var/run/php/php5.6-fpm.sock|fcgi://localhost"
</FilesMatch>
尝试了phpinfo()
页面,得到的是 PHP 7.4.15,而不是预期的 5.6.40。我们对 7.3 做了同样的操作,phpinfo()
使用 php7.3 的 SetHandler 也得到了相同的 7.4。
然后尝试systemctl status php5.6-fpm
并php7.4-fpm
得到两者active (running)
。
我的文件在这里供初学者使用,除了版本之外,/etc/apache2/conf/php5.6-fpm.conf
其他都php7.4-fpm.conf
相同:mod_php5/7
SetHandler
# Redirect to local php-fpm if mod_php is not available
<IfModule !mod_php5.c>
<IfModule proxy_fcgi_module>
# Enable http authorization headers
<IfModule setenvif_module>
SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
</IfModule>
<FilesMatch ".+\.ph(ar|p|tml)$">
<If "-f %{REQUEST_FILENAME}">
SetHandler "proxy:unix:/run/php/php5.6-fpm.sock|fcgi://localhost"
</If>
</FilesMatch>
<FilesMatch ".+\.phps$">
# Deny access to raw php sources by default
# To re-enable it's recommended to enable access to the files
# only in specific virtual host or directory
Require all denied
</FilesMatch>
# Deny access to files without filename (e.g. '.php')
<FilesMatch "^\.ph(ar|p|ps|tml)$">
Require all denied
</FilesMatch>
</IfModule>
</IfModule>
这里是否有错误或者我应该查看其他地方?
值得一提的是,我们有另一台具有类似设置的服务器,并且遇到了同样的问题,但目前我们只需要该服务器上的 5.6 旧版应用程序,因此我们只需通过删除指针文件 /etc/apache2/conf-enabled/php7.4-fpm.conf
并重新启动即可禁用 7.4 apache2
。但是,此服务器需要多个版本。
答案1
改变:
<FilesMatch \.php$>
SetHandler "proxy:unix:/var/run/php/php5.6-fpm.sock|fcgi://localhost"
</FilesMatch>
为了:
<FilesMatch \.php$>
<If "-f %{REQUEST_FILENAME}">
SetHandler "proxy:unix:/var/run/php/php5.6-fpm.sock|fcgi://localhost"
</If>
</FilesMatch>
答案2
自从我在 2021 年 2 月 15 日更新操作系统 (ubuntu 20.04 LTS) 后,我开始遇到这个问题。现在我的所有网站都使用 php 8.0,而不是 SetHandler 配置
答案3
我在 Ubuntu WSL 设置上遇到了完全相同的问题。但是,以下文章对我的同事很有帮助,因此也可能对您有所帮助。
避免使用代理密码匹配
# don't
<IfModule mod_proxy.c>
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/
</IfModule>
自从代理密码匹配优先于文件匹配你用什么设置处理程序
来源: https://ma.ttias.be/apache-2-4-proxypass-for-php-taking-precedence-over-filesfilesmatch-in-htaccess/
答案4
我正在使用 Ubuntu 20.04,我遇到了完全相同的问题 - 只显示一个版本的 PHP,即最新版本。我尝试设置三个 PHP 版本以同时与同一个 Apache 一起运行。
在我看来,所有三个配置的 SetHandler 行都设置为与上次加载的配置文件相同的值。配置文件在目录中按以下顺序列出:
- /etc/apache2/conf-enabled/php5.6-fpm.conf
- /etc/apache2/conf-enabled/php7.4-fpm.conf
- /etc/apache2/conf-enabled/php8.1-fpm.conf
Apache 日志显示,我创建的每个虚拟主机(应该运行不同版本的 PHP)都试图连接到 php8.1 的同一个 unix 套接字。
Alfredos 的回答本身并没有解决我的问题。
解决方案对我来说,从使用 unix 套接字切换到 TCP 套接字,作为 apache2 和 php-pfm 之间的通信形式。为此,我修改了这三个文件以设置 php-pfm 的 ip 和监听端口。
在文件中: /etc/php/5.6/fpm/pool.d/www.conf
listen = 127.0.0.1:9056
在文件中: /etc/php/7.4/fpm/pool.d/www.conf
listen = 127.0.0.1:9074
在文件中: /etc/php/8.1/fpm/pool.d/www.conf
listen = 127.0.0.1:9081
为了反映 Apache 中的上述更改,我修改了文件:/etc/apache2/conf-enabled/php*-fpm.conf和/etc/apache2/sites-enabled/php*.mydomain.conf这样 Apache 就可以连接到正确的 ip/端口。配置文件包含 Alfredos 答案。
文件/etc/apache2/conf-enabled/php5.6-fpm.conf看起来像这样:
<IfModule !mod_php5.c>
<IfModule proxy_fcgi_module>
<IfModule setenvif_module>
SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
</IfModule>
<FilesMatch ".+\.ph(ar|p|tml)$">
<If "-f %{REQUEST_FILENAME}">
SetHandler "proxy:fcgi://localhost:9056"
</If>
</FilesMatch>
<FilesMatch ".+\.phps$">
Require all denied
</FilesMatch>
<FilesMatch "^\.ph(p[3457]?|t|tml|ps)$">
Require all denied
</FilesMatch>
</IfModule>
</IfModule>
文件/etc/apache2/conf-enabled/php7.4-fpm.conf看起来像这样:
<IfModule !mod_php7.c>
<IfModule proxy_fcgi_module>
<IfModule setenvif_module>
SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
</IfModule>
<FilesMatch ".+\.ph(ar|p|tml)$">
<If "-f %{REQUEST_FILENAME}">
SetHandler "proxy:fcgi://localhost:9074"
</If>
</FilesMatch>
<FilesMatch ".+\.phps$">
Require all denied
</FilesMatch>
<FilesMatch "^\.ph(ar|p|ps|tml)$">
Require all denied
</FilesMatch>
</IfModule>
</IfModule>
文件/etc/apache2/conf-enabled/php8.1-fpm.conf看起来像这样:
<IfModule !mod_php8.c>
<IfModule proxy_fcgi_module>
<IfModule setenvif_module>
SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
</IfModule>
<FilesMatch ".+\.ph(ar|p|tml)$">
<If "-f %{REQUEST_FILENAME}">
SetHandler "proxy:fcgi://127.0.0.1:9081"
</If>
</FilesMatch>
<FilesMatch ".+\.phps$">
Require all denied
</FilesMatch>
<FilesMatch "^\.ph(ar|p|ps|tml)$">
Require all denied
</FilesMatch>
</IfModule>
</IfModule>
我的虚拟主机文件如下所示:
/etc/apache2/sites-enabled/php56.mydomain.com.conf:
<VirtualHost *:80>
ServerName php56.mydomain.com
ServerAlias www.php56.mydomain.com
DocumentRoot /var/www/php56
<Directory /var/www/php56>
Options -Indexes +FollowSymLinks +MultiViews
AllowOverride All
Require all granted
</Directory>
<FilesMatch \.php$>
<If "-f %{REQUEST_FILENAME}">
SetHandler "proxy:fcgi://127.0.0.1:9056"
</If>
</FilesMatch>
LogLevel debug
ErrorLog ${APACHE_LOG_DIR}/php56.error.log
CustomLog ${APACHE_LOG_DIR}/php56.access.log combined
</VirtualHost>
/etc/apache2/sites-enabled/php74.mydomain.com.conf:
<VirtualHost *:80>
ServerName php74.mydomain.com
ServerAlias www.php74.mydomain.com
DocumentRoot /var/www/php74
<Directory /var/www/php74>
Options -Indexes +FollowSymLinks +MultiViews
AllowOverride All
Require all granted
</Directory>
<FilesMatch \.php$>
<If "-f %{REQUEST_FILENAME}">
SetHandler "proxy:fcgi://127.0.0.1:9074"
</If>
</FilesMatch>
LogLevel debug
ErrorLog ${APACHE_LOG_DIR}/php74.error.log
CustomLog ${APACHE_LOG_DIR}/php74.access.log combined
</VirtualHost>
/etc/apache2/sites-enabled/php81.mydomain.com.conf:
<VirtualHost *:80>
ServerName php81.mydomain.com
ServerAlias www.php81.mydomain.com
DocumentRoot /var/www/php81
<Directory /var/www/php81>
Options -Indexes +FollowSymLinks +MultiViews
AllowOverride All
Require all granted
</Directory>
<FilesMatch \.php$>
<If "-f %{REQUEST_FILENAME}">
SetHandler "proxy:fcgi://127.0.0.1:9081"
</If>
</FilesMatch>
LogLevel debug
ErrorLog ${APACHE_LOG_DIR}/php81.error.log
CustomLog ${APACHE_LOG_DIR}/php81.access.log combined
</VirtualHost>
以供参考:
#apache2 -v
Server version: Apache/2.4.41 (Ubuntu)
Server built: 2021-10-14T16:24:43
我希望它能有所帮助并为您节省一些时间。
编辑: 回答你的问题,你的配置中是否有错误。如果你使用 TCP 套接字,则带有 SetHandler 的行可能会出现问题,因为未指定端口,这可能会导致 Apache 尝试连接到相同的 PHP 版本。
还有什么地方需要查找:检查这些文件中是否也有正确的 SetHandler 行:/etc/apache2/sites-enabled/php*.mydomain.conf
检查上述文件中的 SetHandler 行是否与以下文件中的“listen”行匹配: /etc/php/*/fpm/pool.d/www.conf