Debian上的Apache-升级到PHP8.1 - phpinfo()未显示新版本并且与mpm冲突

cigdeys3  于 2022-11-16  发布在  Apache
关注(0)|答案(3)|浏览(173)

我试图更新我的服务器以使用PHP8.1,我最终禁用了http/2,也不知道如何重新启用它,并真正让PHP8.1运行。
我做的第一步是:

sudo a2dismod php7.4
sudo a2enmod php8.1

第二个命令与mpm_event有冲突,因此我运行:

sudo a2dismod mpm_event
sudo a2enmod mpm_prefork

在再次运行“sudo a2 enmod php8.1”以及“sudo systemctl restart apache 2”之后,看起来还可以。
然而,每当我运行“php -v”时,它都会说CLI是“8. 1”,但在Live站点上使用“phpinfo()”仍然会返回“7. 4. 26”。
我还运行了以下命令,它们都显示8.1当前正在运行:

sudo update-alternatives --config php
sudo update-alternatives --config phar
sudo update-alternatives --config phar.phar
sudo update-alternatives --config phpize
sudo update-alternatives --config php-config

在这一切之后,我注意到我的网页停止通过http/2服务。在尝试“sudo a2 dismod mpm_prefork”以便我可以再次启用mpm_event时,它说它不能禁用mpm_prefork,因为与PHP模块有冲突。当我禁用PHP模块时,我可以禁用mpm_prefork并启用mpm_event,但这样我就不再有PHP了(我想?这一切都是如此令人困惑...)
编辑:我试着禁用PHP模块并启用mpm_event,但它使网站不再工作,所以我恢复了这些更改。
为清楚起见,当我尝试“sudo a2 dismod mpm_prefork”时,我得到以下错误:

ERROR: The following modules depend on mpm_prefork and need to be disabled first: php8.1

如果有用的话,phpinfo()会告诉我当前正在运行:

PHP Version 7.4.26
Server API  FPM/FastCGI
Configuration File (php.ini) Path   /etc/php/7.4/fpm

此外,我现在在我的mods_enabled文件夹中有PHP8.1,我发誓在这之前根本没有PHP模块。
总而言之,我对服务器管理很陌生,但我只是想在使用http/2的同时运行PHP8.1(fpm版本?),但我在原地打转,我还后退了一步,意外地禁用了http/2。
编辑:我的问题基本上是三个部分:
1.为什么我的网站在我禁用PHP8.1模块后会离线?我该如何防止这种情况再次发生?
1.如何安全地重新启用mpm_event(以便http/2可以再次工作)?请记住,只有当PHP8.1和mpm_prefork模块都被禁用时,才可以重新启用mpm_event。
1.如何升级到PHP 8.1-fpm?
如果一个答案可以提供步骤,挖掘自己的洞,我挖自己,同时也启用PHP8.1-fpm,那么这将是可怕的。
哦,我说清楚了;我当前设置是:

  • PHP8.1和mpm_prefork模块已启用(mpm_event已禁用)
  • 网站使用PHP7.4-fpm,没有http/2
  • PHP的CLI版本是PHP8.1
  • 我没有安装PHP8.1-fpm
6rqinv9w

6rqinv9w1#

我认为第三个问题的答案是第二个,将它们合并为一个命令列表
为什么我的网站在我禁用PHP8.1模块后离线了?
当你关闭apache php模块时,web服务器会把php代码当作纯文本,这是未知内容类型的默认行为。它有点工作,但是你的代码根本不会被解释。
我该如何防止这种情况再次发生?
为了防止这种情况的发生,请使用varnish、负载平衡器(apache/nginx),在系统稳定时使用snapshots,或者使用Docker将您的应用程序容器化。
在varnish的情况下,它会创建缓存版本的网页,并将它们作为响应返回,忽略您的Web服务器,直到没有这样的缓存版本的网页存在(换句话说,没有缓存命中)。但在此之前,您需要编写脚本来缓存所有页面。然后varnish将简单地发送html响应。
在负载平衡器的情况下,如果一个节点失败,那么它会将流量重定向到另一个活跃的节点。
快照是你的操作系统的映像,你可以在不同的虚拟机中使用,例如。所以如果你搞砸了,那么你可以简单地删除快照,然后重新安装初始的。
在Docker中,您可以简单地将应用程序拆分为2个服务,您可以根据自己的需要进行配置,而不必担心会造成任何问题)
1服务将缓存2
2服务将是php-fpm
然后,您可以简单地将每个服务构建为映像,并像在VM(虚拟机)中那样旋转映像。
如何升级到PHP 8.1-fpm?

# step 1, optional if you did it before
sudo apt update
sudo apt upgrade

# step 2, dont see any issues with simply installing newer version of php-fpm
sudo apt install php8.1-fpm

# check if user and group in php-fpm config are correct(/etc/php/8.1/fpm/pool.d/www.conf). 
# User and group should be the same as webserver user and group.
# if you want to check under which user webserver runs
# sudo ps aux| grep apache2 
listen.owner = www-data
listen.group = www-data
# and also check if socket/port for php-fpm are created/opened and its running normally

# step 3
# disable modules and restart configured services. For apache better to reload instead of restart
sudo a2dismod php8.1
sudo a2dismod mpm_prefork
sudo a2disconf php7.4-fpm
sudo a2enmod mpm_event
# optional in case its enabled
sudo a2enmod proxy
# optional in case its enabled
sudo a2enmod proxy_fcgi
sudo a2enconf php8.1-fpm
sudo systemctl restart php8.1-fpm
sudo systemctl restart apache2
# manually set php version for CLI
sudo update-alternatives --set php /usr/bin/php8.1
sudo update-alternatives --set phar /usr/bin/phar8.1
sudo update-alternatives --set phar.phar /usr/bin/phar.phar8.1

# step 4
# Mask the old PHP-FPM daemon (tell the system to not start the old php-fpm daemon)
sudo systemctl mask php7.4-fpm

希望此列表中的一些内容会有所帮助)

fafcakar

fafcakar2#

您需要一个名为php8.1-fpm的软件包来使用mpm_event而不是mpm_prefork。例如,this tutorial中提到了这一点:
根据您使用的Web服务器,您将需要安装其他软件包以与Web服务器集成。
对于使用mpm_event,...,php8.0的Apache-fpm包通过FPM提供与PHP 8.0的集成。
当然你会想要php8.1-fpm package

9vw9lbht

9vw9lbht3#

在我的Apache配置中,我必须更改下面这一行以使用正确的套接字:

<FilesMatch \.php$>
          SetHandler "proxy:unix:/var/run/php/php8.1-fpm.sock|fcgi://localhost/"
  </FilesMatch>

有关套接字的信息:

# ls -l /var/run/php/
total 4
-rw-r--r-- 1 root     root      5 Sep 22 12:42 php8.1-fpm.pid
srw-rw---- 1 www-data www-data  0 Sep 22 12:42 php8.1-fpm.sock=

相关问题