网站搜索

如何在 Nginx 中运行具有不同 PHP 版本的多个网站


有时,PHP 开发人员希望在同一 Web 服务器上使用不同版本的 PHP 构建和运行不同的网站/应用程序。作为 Linux 系统管理员,您需要设置一个环境,可以在单个 Web 服务器(即 Nginx)上使用不同 PHP 版本运行多个网站。

在本教程中,我们将向您解释如何安装多个版本的 PHP 并配置 Web 服务器 Nginx 通过服务器块(Apache 中的虚拟主机)与它们一起使用使用 LEMP 堆栈的 CentOS/RHEL 7 发行版。

另请阅读:Pyenv – 为特定项目安装多个 Python 版本

Nginx 使用PHP-FPM(代表FastCGI Process Manager),这是一种替代的PHP FastCGI实现,具有一些功能对于负载较重的网站来说,还有额外有用的功能。

测试环境搭建

  1. 具有最少安装的 CentOS 7 或 RHEL 7 服务器。
  2. Nginx HTTP 服务器。
  3. PHP 7.1(用作默认版本)和 5.6。
  4. MariaDB 数据库服务器。
  5. 服务器IP地址:192.168.56.10
  6. 网站:example1.comexample2.com

第 1 步:安装并启用 EPEL 和 Remi 存储库

1. 首先安装并启用 EPELRemi 存储库,它提供最新版本的 PHP堆栈在 CentOS/RHEL 7 发行版上。

yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm

2. 接下来安装yum-utils软件包,它扩展了yum的原生功能,并提供了yum-config-manager命令,用于启用或禁用系统上的 Yum 存储库。

yum install yum-utils

注意:在 RHEL 7 上,您可以使用以下命令为某些依赖项启用可选通道。

subscription-manager repos --enable=rhel-7-server-optional-rpms

第2步:安装Nginx Web服务器

3.要安装最新版本的Nginx,我们需要添加官方Nginx存储库,创建一个名为/etc/yum.repos.d/nginx.repo的文件。

vi /etc/yum.repos.d/nginx.repo

根据您的发行版将以下行添加到文件中。

--------------- On CentOS 7 --------------- 
[nginx] 
name=nginx repo 
baseurl=http://nginx.org/packages/centos/7/$basearch/ 
gpgcheck=0 
enabled=1 


--------------- On RHEL 7 ---------------
[nginx] 
name=nginx repo 
baseurl=http://nginx.org/packages/rhel/7.x/$basearch/ 
gpgcheck=0 
enabled=1 

4. 添加 nginx 存储库后,您可以使用 yum 包管理器工具安装 Nginx,如图所示。

yum install nginx

第3步:安装MariaDB数据库服务器

5.要安装最新版本的MariaDB,我们需要添加官方MariaDB存储库,创建一个名为/etc/yum.repos.d/mariadb.repo的文件。

vi /etc/yum.repos.d/mariadb.repo

根据您的发行版将以下行添加到文件中。

--------------- On CentOS 7 --------------- 
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.2/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1


--------------- On RHEL 7 ---------------
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.2/rhel7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1 

6. 添加 MariaDB 存储库后,您可以使用 yum 包管理器工具安装 MariaDB,如图所示。

yum install MariaDB-client MariaDB-server

7. 然后,使用以下脚本保护数据库服务器安装。设置 root 密码并回答 y,然后按 [Enter] 回答后续问题的其余部分,以禁用远程 root 用户登录、删除匿名用户帐户并测试数据库。默认情况下,所有用户都可以访问,甚至是匿名用户。

mysql_secure_installation

另请阅读:Linux 的 12 个 MySQL/MariaDB 安全最佳实践

步骤 4:安装多个版本的 PHP

8. 要为您的项目安装不同版本的 PHP,请使用 yum-config-manager 命令安装多个版本的 PHP 以及大多数必需的模块,如下所示。

安装PHP 7.1版本

yum-config-manager --enable remi-php71  [Default]
yum install php php-common php-fpm
yum install php-mysql php-pecl-memcache php-pecl-memcached php-gd php-mbstring php-mcrypt php-xml php-pecl-apc php-cli php-pear php-pdo

安装PHP 5.6版本

yum install php56 php56-php-common php56-php-fpm
yum install php56-php-mysql php56-php-pecl-memcache php56-php-pecl-memcached php56-php-gd php56-php-mbstring php56-php-mcrypt php56-php-xml php56-php-pecl-apc php56-php-cli php56-php-pear php56-php-pdo

9. 安装 PHP 后,您可以使用以下命令检查服务器上使用的默认 PHP 版本。

php -v

步骤5:配置PHP-FPM和PHP56-PHP-FPM

10. 这是本教程最有趣的部分,它解释了如何在服务器上实际运行多个 PHP 版本。在这里,您将配置 Nginx 将使用的不同版本的 php-fpm。您应该定义 FastCGI 进程的用户/组以及它们将侦听的端口。

以下是您将要编辑的两个配置文件。

  • php-fpm (默认 7.1) – /etc/php-fpm.d/www.conf
  • php56-php-fpm – /opt/remi/php56/root/etc/php-fpm.d/www.conf

打开上面的文件,设置FastCGI进程的用户/组。

vi /etc/php-fpm.d/www.conf   [PHP 7.1]
vi /opt/remi/php56/root/etc/php-fpm.d/www.conf  [PHP 5.6] 

默认值应为 apache,将其更改为 nginx,如图所示。

user = nginx
group = nginx

11. 接下来,找到侦听参数,并定义将接收 FastCGI 请求的地址:端口

listen = 127.0.0.1:9000	[php-fpm]
listen = 127.0.0.1:9001	[php56-php-fpm]

12.完成上述所有配置后,您需要启动并启用NginxMariaDBPHP-FPM在系统启动时自动启动。

systemctl enable nginx 
systemctl start nginx 

systemctl enable mariadb 
systemctl start mariadb 

---------------- PHP 7.1 ---------------- 
systemctl enable php-fpm 
systemctl start php-fpm 

---------------- PHP 5.6 ----------------
systemctl enable php56-php-fpm 
systemctl start php56-php-fpm 

注意:如果您在启动第二个 PHP 实例 php56-php-fpm 时遇到任何错误,SELinux 策略可能会阻止它从一开始。如果 SELinux 处于强制模式,请将其设置为宽容模式,然后尝试再次启动该服务。

getenforce
setenforce 0 

第 6 步:设置具有权限的网站

13.此时,您可以在/var/www/html/下为您的网站创建必要的目录。还需要创建存放日志的目录,如下:

---------------- Website 1 ----------------
mkdir -p /var/www/html/example1.com/ 
mkdir -p /var/log/nginx/example1.com/ 
 

---------------- Website 2 ----------------
mkdir -p /var/www/html/example2.com/
mkdir -p /var/log/nginx/example2.com/ 

14.对所有目录设置适当的所有权权限。

---------------- Website 1 ----------------
chown -R root:nginx /var/www/html/example1.com/ 
chmod -R 755 /var/www/html/example1.com/ 
chown -R root:nginx /var/log/nginx/example1.com/
chmod -R 660 /var/log/nginx/example1.com/ 

---------------- Website 2 ----------------
chown -R root:nginx /var/www/html/example2.com/ 
chmod -R 755 /var/www/html/example2.com/
chown -R root:nginx /var/log/nginx/example2.com/ 
chmod -R 660 /var/log/nginx/example2.com/

第 7 步:为网站设置 Nginx 服务器块

15. 现在,使用服务器块配置文件配置 Nginx 如何处理对您网站的请求,该文件应位于 /etc/nginx/conf.d/ 中。

为您的网站创建以 .conf 扩展名结尾的配置文件。

vi /etc/nginx/conf.d/example1.com.conf
vi /etc/nginx/conf.d/example2.com.conf

然后将以下服务器块配置粘贴到相应的文件中。

网站1

server {
        listen 80;
        server_name example1.com www.example1.com;

        root   /var/www/html/example1.com/;
        index index.php index.html index.htm;

        #charset koi8-r;
        access_log /var/log/nginx/example1.com/example1_access_log;
        error_log   /var/log/nginx/example1.com/example1_error_log   error;

       location / {
                try_files $uri $uri/ /index.php?$query_string;
        }

       # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        location ~ \.php$ {

                root    /var/www/html/example1.com/;
                fastcgi_pass   127.0.0.1:9000;	#set port for php-fpm to listen on
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                include         fastcgi_params;
                include /etc/nginx/fastcgi_params;

        }
}

网站2

server {
        listen 80;
        server_name example2.com www.example2.com;

        root    /var/www/html/example2.com/;
        index index.php index.html index.htm;

        #charset koi8-r;
        access_log /var/log/nginx/example2.com/example2_access_log;
        error_log  /var/log/nginx/example2.com/example2_error_log   error;

       location / {
                try_files $uri $uri/ /index.php?$query_string;
        }

       # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        location ~ \.php$ {

                root    /var/www/html/example2.com/;
                fastcgi_pass   127.0.0.1:9001;	#set port for php56-php-fpm to listen on
	        fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                include         fastcgi_params;
                include /etc/nginx/fastcgi_params;

        }
}

16. 确保 /etc/nginx/nginx.conf 中 http 块的结束部分包含以下行。当 Nginx 运行时,它有助于将所有配置文件包含在 /etc/nginx/conf.d/ 目录中。

include /etc/nginx/conf.d/*.conf;

第 8 步:测试不同的 PHP 版本

17.最后,您需要测试您的服务器是否正在使用两个版本的 PHP。您可以在网站的文档根目录中创建一个非常基本的 info.php 脚本,如图所示。

echo "<?php phpinfo(); ?>" > /var/www/html/example1.com/info.php
echo "<?php phpinfo(); ?>" > /var/www/html/example2.com/info.php

18.要应用上面所做的所有更改,您需要重新启动Nginxphp-fpmphp56-php- fpm。但在执行此操作之前,您可以首先检查 Nginx 配置文件是否存在任何语法错误。

nginx -t 
systemctl restart nginx php-fpm php56-php-fpm

19. 还有最后一件事要做,特别是如果您在本地运行服务器,则需要使用 /etc/hosts 文件设置本地 DNS,如下面的屏幕截图。

192.168.56.10   example1.com   example1
192.168.56.10   example2.com   example2

20. 最后,打开 Web 浏览器并键入以下地址来验证系统上安装的 PHP 版本。

http://example1.com/index.php
http://example2.com/index.php

就是这样!现在您可以使用不同的 PHP 版本部署文件并测试网站。如果您有任何补充或问题要提出,请使用下面的评论表。