【问题标题】:Apache on Debian - Upgrading to PHP8.1 - phpinfo() not showing new version and conflicts with mpmDebian 上的 Apache - 升级到 PHP8.1 - phpinfo() 未显示新版本并与 mpm 冲突
【发布时间】:2022-01-13 23:04:42
【问题描述】:

我正在尝试更新我的服务器以使用 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()”仍会返回“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 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() 表示我正在运行:

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 模块后我的网站下线了?和, 如何防止这种情况再次发生?
  2. 如何安全地重新启用 mpm_event(以便 http/2 再次工作)?请记住,它似乎 仅当 PHP8.1 和 mpm_prefork 模块都存在时才可以选择 已禁用。
  3. 如何升级到 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

【问题讨论】:

  • 你正在使用 php-fpm 所以试试a2disconf php7.4-fpm, a2enconf php8.1-fpm and systemctl restart php-fpm
  • 谢谢 - 我会记住这一点,但我也想让 http/2 再次工作,不明白为什么网站在我最初的问题中的那一步出现故障。跨度>
  • 您现在是否尝试禁用 php 模块?
  • 我不想尝试,因为我担心网站会再次崩溃。如果我有一个完整的步骤列表和如何扭转它们的备份计划,我会尝试。

标签: php apache debian sudo


【解决方案1】:

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

为什么我禁用 PHP8.1 模块后我的网站下线了?

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

还有,我该如何防止这种情况再次发生?

为了防止在系统稳定时使用varnish,负载均衡器(apache/nginx),或者使用 docker 容器化您的应用程序。任何适合您的需求。

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

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

快照是操作系统的映像,例如,您可以在不同的虚拟机中使用它们。所以如果你搞砸了,那么你可以简单地删除快照并重新安装初始快照。

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

1 服务将 apache2

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

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

【讨论】:

  • 谢谢!需要明确的是,当网站出现故障时,浏览器中什么也没有显示,Chrome 开发工具显示“(失败)”响应代码。此外,shell 还提到 Apache 配置不正确。我不明白的是,我所做的只是禁用 PHP8.1 模块(在这之前甚至没有启用)和 mpm-prefork 以及启用 mpm-event。为什么这会彻底搞砸网站?可以肯定的是,在我开始修补之前,一切都正常工作时,一切都是这样设置的。
  • @user1413341 也为您的网站启用error logs。或者只是查看/var/log/apache2/error 或类似路径以了解更具体的系统错误。可能某些东西配置错误或未安装或启用。也值得检查/etc/apache2/conf-enabled/php8.1-fpm.conf 是否具有正确的值以防万一。一些模块依赖于其他模块。例如mpm_prefork 依赖于php_mod,没有它就无法工作。可能你试图结合非工作的东西:)
【解决方案2】:

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

根据您使用的网络服务器,您将需要安装额外的软件包以与网络服务器集成。

对于使用 mpm_event 的 Apache,...,php8.0-fpm 包通过 FPM 提供与 PHP 8.0 的集成。

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

【讨论】:

  • 是的。我当前的设置是使用 PHP7.4-fpm,但是在愚蠢地禁用 mpm_event、启用 mpm_prefork 和启用 PHP8.1 模块之后,考虑到存在冲突,我似乎无法恢复到我之前启用 mpm_event 的设置。当我尝试禁用 mpm_prefork 和 PHP8.1 模块并启用 mpm_event 时,网站停止工作。现在,我启用了 PHP8.1 模块,启用了 prefork,并且现场使用的是 PHP7.4-fpm。
猜你喜欢
  • 2016-10-17
  • 2021-03-04
  • 1970-01-01
  • 1970-01-01
  • 2014-04-10
  • 1970-01-01
  • 1970-01-01
  • 2017-05-16
  • 2022-10-13
相关资源
最近更新 更多