在 Ubuntu 20.04 上使用不同 PHP 版本和 Nginx 的多个网站

介绍

Nginx 是一个轻量级和高性能的 Web 服务器。 PHP-FPM 是一个强大的 PHP FastCGI 进程管理器。 本指南将帮助您在单个 Ubuntu 20.04 服务器上使用 Nginx 和不同的 PHP 版本设置多个网站。

为简单起见,本教程假设您要设置两个网站,第一个运行 PHP 5.6,第二个运行 PHP 8.0。

先决条件

在 Vultr 部署一个新的 Ubuntu 20.04 服务器。 按照 Vultr 的最佳实践指南创建 sudo 用户并更新 Ubuntu 服务器。 有两个完全限定的域名指向您的服务器的 IP 地址,例如 site1.example.comsite2.example.com.

1. 安装软件包

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

安装 Nginx。

$ sudo apt -y install nginx

添加 ppa:ondrej/php 存储库,一个长期且受社区信任的存储库,提供 PHP 5.6、PHP 7.0 – 7.4 和 PHP 8.0。

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

列出可用的 PHP 5.6 包。

$ apt-cache search ^php5.6 | cut -f1 -d' '

安装第一个网站所需的包。 例如:

$ sudo apt -y install php5.6 php5.6-fpm php5.6-mysql

列出可用的 PHP 8.0 包。

$ apt-cache search ^php8.0 | cut -f1 -d' '

安装第二个网站所需的包。 例如:

$ sudo apt -y install php8.0-cli php8.0-fpm php8.0-pgsql

现在,您的服务器上共存了两个不同版本的 PHP。 在命令行模式下,PHP 5.6 解释器是 php5.6, 而 PHP 8.0 解释器是 php8.0.

目前, php 是一个别名 php8.0. 如果你想做 php 的别名 php5.6,运行以下命令并选择适当的选项。

$ sudo update-alternatives --config php

如果需要,您还可以安装其他 PHP 版本。

2. 上传源代码

为了安全起见,请为每个网站创建一个专用用户。 每个用户将拥有各自网站的所有源代码文件。 另外,每个网站的PHP-FPM进程也会在相应的用户下运行,因此两个网站将完全相互独立。

第一个网站

创建一个名为的专用用户 site1.

$ sudo adduser site1

创建一个名为的新文档根目录 /var/www/site1 来存储源代码。

$ sudo mkdir /var/www/site1

使用您的文件传输工具,例如 rsync 或 FileZilla,将第一个网站的源代码上传到 /var/www/site1 目录。

创建一个显示 PHP 信息的 PHP 文件,以确认 PHP 版本。

$ echo '<?php phpinfo();' | sudo tee /var/www/site1/info.php > /dev/null

制作 site1 所有源代码文件的所有者。

$ sudo chown -R site1:site1 /var/www/site1

第二个网站

创建一个名为的专用用户 site2.

$ sudo adduser site2

创建一个名为的新文档根目录 /var/www/site2 来存储源代码。

$ sudo mkdir /var/www/site2

将第二个网站的源代码上传到 /var/www/site2 目录。

创建一个显示 PHP 信息的 PHP 文件,以确认 PHP 版本。

$ echo '<?php phpinfo();' | sudo tee /var/www/site2/info.php > /dev/null

制作 site2 所有源代码文件的所有者。

$ sudo chown -R site2:site2 /var/www/site2

3.配置PHP

为第一个网站配置 PHP 5.6

列出您的 Ubuntu 系统支持的所有时区。 使用 UP / DOWN 键在列表中移动,然后按 Q 退出。

$ timedatectl list-timezones

从列表中复制适当的时区,例如, 美国/纽约. 然后使用该时区更新操作系统。

$ sudo timedatectl set-timezone America/New_York

编辑主要的 PHP 配置文件以告诉 PHP 使用新的时区。

$ sudo nano /etc/php/5.6/fpm/php.ini

找到线 ;date.timezone =. 删除分号并添加您的时区。 例如:

date.timezone = America/New_York

以下是您可以根据需要更改的常用设置:

max_execution_time
memory_limit
post_max_size
upload_max_filesize

保存配置文件并退出。

从默认配置文件创建 PHP-FPM 配置文件。

$ sudo cp /etc/php/5.6/fpm/pool.d/www.conf /etc/php/5.6/fpm/pool.d/site1.conf

重命名默认文件以禁用它并将其保留为备份。

$ sudo mv /etc/php/5.6/fpm/pool.d/www.conf /etc/php/5.6/fpm/pool.d/www.conf.default

编辑 PHP-FPM 配置文件。

$ sudo nano /etc/php/5.6/fpm/pool.d/site1.conf

在配置文件中,任何以 ; 是评论。

搜索以下设置,然后:

代替 [www][site1]
代替 user = www-datauser = site1
代替 group = www-datagroup = site1 (不要触摸 listen.group = www-data 环境)

确保 listen = /run/php/php5.6-fpm.sock 设置不以 ;. 此设置使 PHP-FPM 侦听由 /run/php/php5.6-fpm.sock 文件。

将以下设置复制并粘贴到文件末尾。

catch_workers_output = yes
php_flag[display_errors] = off
php_admin_flag[log_errors] = on
php_admin_value[error_log] = /var/log/php-fpm/site1/error.log

php_admin_value[session.save_path] = /var/lib/php/sessions/site1

这些设置使 PHP-FPM 将错误消息记录到 /var/log/php-fpm/site1/error.log 文件而不是将它们显示给网站用户并将会话数据存储在 /var/lib/php/sessions/site1 目录。

保存配置文件并退出。

创建两个目录来存储 PHP 日志和会话数据。

$ sudo mkdir -p /var/log/php-fpm/site1
$ sudo mkdir -p /var/lib/php/sessions/site1

更新两个目录的所有权和权限,以便只有第一个网站的 PHP-FPM 进程可以访问它们。

$ sudo chown site1:site1 /var/log/php-fpm/site1
$ sudo chmod 700 /var/log/php-fpm/site1
$ sudo chown site1:site1 /var/lib/php/sessions/site1
$ sudo chmod 700 /var/lib/php/sessions/site1

检查新配置。

$ sudo php-fpm5.6 -t

重新启动 PHP-FPM 服务以使更改生效。

$ sudo systemctl restart php5.6-fpm.service

为第二个网站配置 PHP 8.0

编辑主要的 PHP 配置文件以告诉 PHP 使用您的时区。

$ sudo nano /etc/php/8.0/fpm/php.ini

找到线 ;date.timezone =. 删除分号并添加您的时区。 例如:

date.timezone = America/New_York

以下是您可以根据需要更改的常用设置:

max_execution_time
memory_limit
post_max_size
upload_max_filesize

保存配置文件并退出。

从默认配置文件创建 PHP-FPM 配置文件。

$ sudo cp /etc/php/8.0/fpm/pool.d/www.conf /etc/php/8.0/fpm/pool.d/site2.conf

重命名默认文件以禁用它并将其保留为备份。

$ sudo mv /etc/php/8.0/fpm/pool.d/www.conf /etc/php/8.0/fpm/pool.d/www.conf.default

编辑 PHP-FPM 配置文件。

$ sudo nano /etc/php/8.0/fpm/pool.d/site2.conf

搜索以下设置,然后:

代替 [www][site2]
代替 user = www-datauser = site2
代替 group = www-datagroup = site2 (不要触摸 listen.group = www-data 环境)

确保 listen = /run/php/php8.0-fpm.sock 设置不以 ;. 此设置使 PHP-FPM 侦听由 /run/php/php8.0-fpm.sock 文件。

将以下设置复制并粘贴到文件末尾。

catch_workers_output = yes
php_flag[display_errors] = off
php_admin_flag[log_errors] = on
php_admin_value[error_log] = /var/log/php-fpm/site2/error.log

php_admin_value[session.save_path] = /var/lib/php/sessions/site2

这些设置使 PHP-FPM 将错误消息记录到 /var/log/php-fpm/site2/error.log 文件而不是将它们显示给网站用户并将会话数据存储在 /var/lib/php/sessions/site2 目录。

保存配置文件并退出。

创建两个目录来存储 PHP 日志和会话数据。

$ sudo mkdir -p /var/log/php-fpm/site2
$ sudo mkdir -p /var/lib/php/sessions/site2

更新两个目录的所有权和权限,以便只有第二个网站的 PHP-FPM 进程可以访问它们。

$ sudo chown site2:site2 /var/log/php-fpm/site2
$ sudo chmod 700 /var/log/php-fpm/site2
$ sudo chown site2:site2 /var/lib/php/sessions/site2
$ sudo chmod 700 /var/lib/php/sessions/site2

检查新配置。

$ sudo php-fpm8.0 -t

重新启动 PHP-FPM 服务以使更改生效。

$ sudo systemctl restart php8.0-fpm.service

4.配置Nginx

为第一个网站配置 Nginx

为第一个网站创建配置文件。

$ sudo nano /etc/nginx/sites-available/site1-http.conf

将以下内容粘贴到文件中:

server {
    listen 80;
    listen [::]:80;

    # Declare the domain name of the website
    server_name site1.example.com;

    # Declare the document root directory
    root  /var/www/site1;

    index index.html index.php;

    # Pass PHP files to PHP-FPM listening on /run/php/php5.6-fpm.sock
    location ~ .php$ {
        try_files $uri =404;

        # Mitigate https://httpoxy.org/ vulnerabilities
        fastcgi_param HTTP_PROXY "";

        fastcgi_pass unix:/run/php/php5.6-fpm.sock;
        fastcgi_index index.php;
        include fastcgi.conf;
    }
}

上面的配置包含了 PHP 网站最基本的指令。 您可以添加更多指令以满足您的网站要求。

保存配置文件并退出。

启用新配置。

$ sudo ln -s /etc/nginx/sites-available/site1-http.conf /etc/nginx/sites-enabled/site1-http.conf

为第二个网站配置 Nginx

为第二个网站创建配置文件。

$ sudo nano /etc/nginx/sites-available/site2-http.conf

将以下内容粘贴到文件中:

server {
    listen 80;
    listen [::]:80;

    # Declare the domain name of the website
    server_name site2.example.com;

    # Declare the document root directory
    root  /var/www/site2;

    index index.html index.php;

    # Pass PHP files to PHP-FPM listening on /run/php/php8.0-fpm.sock
    location ~ .php$ {
        try_files $uri =404;

        # Mitigate https://httpoxy.org/ vulnerabilities
        fastcgi_param HTTP_PROXY "";

        fastcgi_pass unix:/run/php/php8.0-fpm.sock;
        fastcgi_index index.php;
        include fastcgi.conf;
    }
}

保存配置文件并退出。

启用新配置。

$ sudo ln -s /etc/nginx/sites-available/site2-http.conf /etc/nginx/sites-enabled/site2-http.conf

添加 www-data 用户到 site1site2 组,以便 Nginx 进程可以访问两个网站的源代码。

$ sudo usermod -aG site1,site2 www-data

检查新配置。

$ sudo nginx -t

重新加载 Nginx 服务以使更改生效。

$ sudo systemctl reload nginx.service

5. 验证设置

重新启动服务器。

$ sudo reboot

等待操作系统启动,然后在浏览器中打开以下 URL。

http://site1.example.com/info.php
http://site2.example.com/info.php

您应该会看到每个网站的正确 PHP 版本。

为安全起见,再次以非root sudo 用户通过SSH 登录服务器,然后删除 info.php 文件。

$ sudo rm /var/www/site1/info.php
$ sudo rm /var/www/site2/info.php

您现在有两个网站,在同一台服务器上运行着两个不同版本的 PHP。 只要您的服务器有足够的资源,您就可以设置任意数量的网站。

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