如何在 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实现,具有一些功能对于负载较重的网站来说,还有额外有用的功能。
测试环境搭建
- 具有最少安装的 CentOS 7 或 RHEL 7 服务器。
- Nginx HTTP 服务器。
- PHP 7.1(用作默认版本)和 5.6。
- MariaDB 数据库服务器。
- 服务器IP地址:192.168.56.10。
- 网站:example1.com 和 example2.com。
第 1 步:安装并启用 EPEL 和 Remi 存储库
1. 首先安装并启用 EPEL 和 Remi 存储库,它提供最新版本的 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.完成上述所有配置后,您需要启动并启用Nginx、MariaDB和PHP-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.要应用上面所做的所有更改,您需要重新启动Nginx、php-fpm和php56-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 版本部署文件并测试网站。如果您有任何补充或问题要提出,请使用下面的评论表。