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

Apache on Debian - Upgrading to PHP8.1 - phpinfo() not showing new version and conflicts with mpm

我正在尝试更新我的服务器以使用 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 a2enmod php8.1”以及“sudo systemctl restart apache2”后,似乎没问题。

然而,每当我 运行“php-v”时,它说 CLI 是“8.1”,但在实时站点上仍然使用“phpinfo()” returns "7.4.26".

我也 运行 这些命令都显示 8.1 当前 运行ning:

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 a2dismod mpm_prefork”以便我可以再次启用 mpm_event 时,它说它无法禁用 mpm_prefork 因为与 PHP 模块存在冲突。当我禁用 PHP 模块时,我可以禁用 mpm_prefork 并启用 mpm_event 但那样我就不会再有 PHP (我想?这一切都太令人困惑了...... )

编辑:我尝试禁用 PHP 模块并启用 mpm_event 但它使网站不再工作所以我恢复了这些更改。

为清楚起见,当我尝试“sudo a2dismod mpm_prefork”时,出现此错误:

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

如果有帮助,phpinfo() 表示我目前 运行ning:

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

此外,我的 mods_enabled 文件夹中现在有 PHP8.1,我发誓在此之前根本没有 PHP 模块。

总而言之,我是服务器管理的新手,但我只是想 运行 PHP8.1(fpm 版本?),同时使用 http/2 但 运行兜兜转转,我也后退了一步,不小心禁用了 http/2。

编辑:我的问题基本上分为三个部分:

  1. 为什么在我禁用 PHP8.1 模块后我的网站离线了?和, 我该如何防止这种情况再次发生?
  2. 如何安全地重新启用 mpm_event(以便 http/2 再次工作)?请记住,它似乎 仅当 PHP8.1 和 mpm_prefork 模块都为 禁用。
  3. 如何升级到 PHP 8.1-fpm?

如果答案可以提供将自己从自己挖的洞中挖出来的步骤,同时还启用 PHP8.1-fpm,那就太棒了。

哦,就这么清楚了;我当前的设置是:

您需要一个名为 php8.1-fpm 的包才能使用 mpm_event 而不是 mpm_prefork。例如,this tutorial:

中提到了这一点

Depending on the web server you use, you will need to install additional packages to integrate with the web server.

For Apache using mpm_event, ..., php8.0-fpm package provides integration with PHP 8.0 via FPM.

当然你会想要php8.1-fpm package

我认为你的第三个问题回答了第二个问题,将它们组合成一个命令列表

Why did my site go offline after I disabled the PHP8.1 module?

当您关闭 apache php 模块时,Web 服务器将 php 代码视为纯文本,这是未知内容类型的默认行为。它有点工作,但你的代码根本没有被解释。

And, how do I prevent that from happening again?

为了防止在系统稳定时使用 varnish, load balancer(apache/nginx), make snapshots 或使用 docker 容器化您的应用程序。适合您的需求。

在清漆的情况下,它将创建您的网页的缓存版本,并将 return 它们作为响应而忽略您的网络服务器,直到不存在这样的网页缓存版本(换句话说,没有缓存命中)。但在此之前,您需要编写脚本来缓存所有页面。然后清漆将简单地发送 html 响应。

在负载均衡器的情况下,如果一个节点发生故障,那么它会将流量重定向到另一个活动节点。每个节点基本上都是您网站的副本。

快照是您的 OS 的图像,例如您可以在不同的 VM 中使用它们。所以如果你搞砸了那么你可以简单地删除快照并重新安装初始快照。

在 docker 中,您可以简单地将您的应用拆分为 2 个服务,您可以根据需要配置这些服务,而不用担心让一切变得糟糕)

1 个服务将 apache2

2 服务将是 php-fpm

然后你可以简单地将每个服务构建为一个图像并像在 VM(虚拟机)中一样旋转图像。

How do I upgrade to 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

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