使用 Nginx 在 Ubuntu 20.04 上将 PHP 7.4 升级到 PHP 8.0

介绍

PHP 8.0 是 PHP 语言的重大更新,其中包含许多新功能和优化。 但是,Ubuntu 20.04 LTS 仅在其官方存储库中包含 PHP 7.4。 本指南解释了如何将 PHP 升级到版本 8.0 并配置 Nginx 以使用它。

先决条件

在 Ubuntu 20.04 服务器上运行 Nginx 和 PHP 7.4 的现有网站。 按照 Vultr 的最佳实践指南创建 sudo 用户并更新 Ubuntu 服务器。 回顾 迁移指南 以确保您的网站源代码与 PHP 8.0 兼容。

虽然您可以直接在生产服务器上应用本指南,但最好先通过将生产服务器的快照恢复到测试实例来对其进行测试。 阅读快照快速入门指南,了解有关创建快照和从中部署新服务器的更多详细信息。

1. 列出已安装的 PHP 7.4 软件包

通过 SSH 以非 root sudo 用户身份登录服务器。

列出系统上安装的所有 PHP 7.4 软件包。

$ dpkg -l | grep php7.4

输出看起来像这样。

ii  php7.4-cli        7.4.3-4ubuntu2.6   amd64   command-line interpreter for the PHP scripting language
ii  php7.4-common     7.4.3-4ubuntu2.6   amd64   documentation, examples and common module for PHP
ii  php7.4-curl       7.4.3-4ubuntu2.6   amd64   CURL module for PHP
ii  php7.4-fpm        7.4.3-4ubuntu2.6   amd64   server-side, HTML-embedded scripting language (FPM-CGI binary)
ii  php7.4-gd         7.4.3-4ubuntu2.6   amd64   GD module for PHP
ii  php7.4-json       7.4.3-4ubuntu2.6   amd64   JSON module for PHP
ii  php7.4-mbstring   7.4.3-4ubuntu2.6   amd64   MBSTRING module for PHP
ii  php7.4-mysql      7.4.3-4ubuntu2.6   amd64   MySQL module for PHP
ii  php7.4-opcache    7.4.3-4ubuntu2.6   amd64   Zend OpCache module for PHP

第二列包含已安装软件包的名称。

将上述输出通过管道传输到 cut, xargs, 和 sed 命令,分别生成对应的 PHP 8.0 包列表。

$ dpkg -l | grep php7.4 | cut -f3 -d' ' | xargs | sed 's/7.4/8.0/g'

结果如下所示:

php8.0-cli php8.0-common php8.0-curl php8.0-fpm php8.0-gd php8.0-json php8.0-mbstring php8.0-mysql php8.0-opcache

安装 PHP 8.0 时使用您的输出。

将现有的 PHP-FPM 7.4 模块列表保存到一个文件中:

$ php-fpm7.4 -m > ~/php-fpm7.4.modules

您将使用此文件来确认升级后没有丢失任何模块。

2. 安装 PHP 8.0 包

您可以从以下位置安装 PHP 8.0 ppa:ondrej/php 由长期的 Debian 开发人员 Ondřej Surý 开发的存储库。

添加 ppa:ondrej/php 存储库。

$ sudo LC_ALL=C.UTF-8 add-apt-repository -y ppa:ondrej/php

使用前面部分中生成的列表模拟 PHP 8.0 包的安装。

$ sudo apt --simulate install php8.0-cli php8.0-common php8.0-curl php8.0-fpm php8.0-gd php8.0-json php8.0-mbstring php8.0-mysql php8.0-opcache

如果你得到这样的错误:

E: Package 'php8.0-json' has no installation candidate

这意味着包列表包含一个名为的虚拟包 php8.0-json.

您需要重新运行模拟命令,但这一次,删除虚拟 php8.0-json 包列表中的包。 重复直到列表中没有剩余的虚拟包。

安装带有精炼列表的 PHP 8.0 包。 请注意,安装命令不包含“–simulate”选项。

$ sudo apt -y install php8.0-cli php8.0-common php8.0-curl php8.0-fpm php8.0-gd php8.0-mbstring php8.0-mysql php8.0-opcache

将当前 PHP-FPM 8.0 模块的列表保存到文件中。

$ php-fpm8.0 -m > ~/php-fpm8.0.modules

将现有的 PHP-FPM 7.4 模块与当前的 PHP-FPM 8.0 模块进行比较。

$ diff ~/php-fpm7.4.modules ~/php-fpm8.0.modules

如果输出为空,则表示升级后没有丢失模块。

验证命令行模式下 PHP 的默认版本为 8.0。

$ php -v

3.配置Nginx

Nginx 和 PHP-FPM 7.4 通过 PHP-FPM 7.4 创建的套接字相互通信。 因此,要切换到 PHP-FPM 8.0,您需要为 PHP-FPM 8.0 配置一个新的套接字并使用该套接字重新配置 Nginx。

找到由 PHP-FPM 7.4 创建的套接字和使用该套接字的 Nginx 配置文件。

$ sudo grep -R fastcgi_pass /etc/nginx/sites-enabled/ | grep -Ev '#s+fastcgi_pass'

如果是 Unix 套接字,输出将如下所示:

/etc/nginx/sites-enabled/default:    fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;

如果是 TCP 套接字,输出将如下所示:

/etc/nginx/sites-enabled/default:    fastcgi_pass 127.0.0.1:9000;

在这两种情况下, /etc/nginx/sites-enabled/default 是您需要编辑的 Nginx 配置文件,而 /var/run/php/php7.4-fpm.sock 或者 127.0.0.1:9000 是插座。

您可能有不同的文件名或多个文件名。 代替 default 在您系统上找到的文件后面的命令中。

在编辑之前创建一个备份文件夹来存储配置文件。

$ sudo mkdir /etc/nginx/sites-backup

将所有配置文件复制到备份文件夹。

$ sudo cp -L /etc/nginx/sites-enabled/* /etc/nginx/sites-backup

通过用新套接字替换旧套接字来编辑配置文件。

如果旧插座是 /var/run/php/php7.4-fpm.sock,新的应该是 /var/run/php/php8.0-fpm.sock.

$ sudo sed -i --follow-symlinks 
    's|php7.4-fpm.sock|php8.0-fpm.sock|g' 
    /etc/nginx/sites-enabled/default

如果旧插座是 127.0.0.1:9000,新的应该是 127.0.0.1:9001.

$ sudo sed -i --follow-symlinks 
    's|127.0.0.1:9000|127.0.0.1:9001|g' 
    /etc/nginx/sites-enabled/default

检查新配置。

$ sudo nginx -t

在应用新配置之前,您需要按照下一节配置 PHP 8.0。

4.配置PHP 8.0

删除默认的 PHP 8.0 工作池配置。

$ sudo rm /etc/php/8.0/fpm/pool.d/*

将配置从 PHP-FPM 7.4 复制到 PHP-FPM 8.0。

$ sudo cp -rL /etc/php/7.4/fpm/pool.d/* /etc/php/8.0/fpm/pool.d/

找到包含旧套接字定义的配置文件。

如果旧插座是 /var/run/php/php7.4-fpm.sock

$ sudo grep -rl 'php7.4-fpm.sock' /etc/php/8.0/fpm/pool.d

如果旧插座是 127.0.0.1:9000

$ sudo grep -rl '127.0.0.1:9000' /etc/php/8.0/fpm/pool.d

两种情况下,结果都是一样的,类似这样:

/etc/php/8.0/fpm/pool.d/www.conf

通过用新套接字替换旧套接字来编辑配置文件。

如果旧插座是 /var/run/php/php7.4-fpm.sock

$ sudo sed -i 's|php7.4-fpm.sock|php8.0-fpm.sock|g' /etc/php/8.0/fpm/pool.d/www.conf

如果旧插座是 127.0.0.1:9000

$ sudo sed -i 's|127.0.0.1:9000|127.0.0.1:9001|g' /etc/php/8.0/fpm/pool.d/www.conf

您可能还需要在主要的 PHP 8.0 配置文件中自定义一些设置以满足您的网站要求。 大多数 PHP 网站的常见设置是:

max_execution_time
memory_limit
post_max_size
upload_max_filesize
date.timezone

您可以在主要的 PHP 7.4 配置文件中找到所需的设置 /etc/php/7.4/fpm/php.ini,然后将这些设置复制到主要的 PHP 8.0 配置文件 /etc/php/8.0/fpm/php.ini.

检查新配置。

$ sudo php-fpm8.0 -t

重新加载 PHP-FPM 8.0 服务以应用更改。

$ sudo systemctl reload php8.0-fpm.service

重新加载 Nginx 服务,以便您的网站使用 PHP 8.0 而不是 7.4 运行。

$ sudo systemctl reload nginx.service

禁用 PHP-FPM 7.4 服务。

$ sudo systemctl disable --now php7.4-fpm.service

5. 验证设置

在浏览器中打开您的网站。 测试并确保所有功能都按预期工作。

如果您决定删除 PHP 7.4,请执行以下操作:

删除 Nginx 备份文件夹。

$ sudo rm -fr /etc/nginx/sites-backup

卸载所有 PHP 7.4 包。

$ sudo apt -y purge php7.4*

更多信息

更多信息 关于 PHP 8 的新特性。

注:本教程在Vultr VPS上测试通过,如需部署请前往Vultr.com