在 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。

https://site1.example.com/info.php
https://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

相关阅读:

Posted in: LinuxTags: ,