如何实现多版本的php共存一台服务器?

PHP

1. 背景

Boss分配下来一个任务,在一台外网的服务器配置一个云服务。但在我们部署服务后发现,云服务运行在PHP7.1版的环境中会报致命的错误。原有的PHP运行了一个用户校验的接口,而服务器只有一台,O(∩_∩)O哈哈~,笔者抹把汗先。
于是乎,如何在同一台服务器上实现两个版本的PHP共存提上日程,参考网络上前辈的经验,一番折腾,搞定!

2. 实现原理分析

2.1 架构原理

– PHP有一种运行方式叫做fastCGI,他支持PHP分布式运算,
— FastCGI可以运行在Apach之外的服务器
— 或者说是动态内容(PHP代码)经过后端的fastCGI解析成html代码后再交给前端的Apache处理。
– 既然是分布式运算,那理论上可以部署多个fastCGI解析器
– 即可以部署多个fastCGI解析器,那么不同应用的PHP编码理论上可以发送给不同的fastCGI处理

2.2 实现前提

我们部署PHP经常会用到Remi’s的源,此源会编译PHP多个版本,最重要的他们选择不同的版本编译在不同的目录,即是不同的版本可以独立运行。
注:程序能够独立运行才有可能成功,如果你选择编译安装也要只有此问题。

3. 实践部分

3.1 基础安装

3.1.1 安装yum源

yum install -y http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

注:更新的版本请从以下地址下载,
http://rpms.famillecollet.com/

3.1.2 关闭SELinux

sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0

3.1.3 安装Apache的相关包

yum install -y httpd

3.1.4 启动http服务并配置自启动

systemctl start httpd
systemctl enable httpd

3.1.5 配置防火墙

firewall-cmd --permanent --add-service http
firewall-cmd --reload
firewall-cmd --list-all

3.2 安装php 7.1的fastCGI

3.2.1 安装rpm包

yum install -y mod_fcgid php71-php-fpm php71-php

注:其他php71的相关安装包请根据实际情况选择,因与本主题无关,故被节删。

3.2.2 关闭Apache模块方式加载PHP

mv /etc/httpd/conf.d/php71-php.conf /etc/httpd/conf.d/php71-php.conf.default

3.2.3 确认fcgid配置文件存在

ls /etc/httpd/conf.d/fcgid.conf

3.2.4 确认服务名称

ls /usr/lib/systemd/system/php*fpm.service

3.2.5 检查配置

grep include /etc/opt/remi/php71/php-fpm.conf

确认存在以下行:

include=/etc/opt/remi/php71/php-fpm.d/*.conf

确认监听端口:

grep listen /etc/opt/remi/php71/php-fpm.d/www.conf

可见如下服务监听端口:

listen = 127.0.0.1:9000

3.2.6 启动服务并配置自启动

systemctl start php71-php-fpm.service
systemctl enable php71-php-fpm.service

3.2.7 确认服务运行

netstat -antp | grep fpm

可见如下信息:

tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      2598/php-fpm: maste

3.2.8 配置虚拟服务器

创建网站目录:

mkdir /var/www/www.cmdschool.org

创建测试代码:

echo '<?php phpinfo(); ?>' > /var/www/www.cmdschool.org/index.php

创建虚拟服务器配置:

vim /etc/httpd/conf.d/www.cmdschool.org.conf

加入如下配置:

<VirtualHost *:80>
DocumentRoot /var/www/www.cmdschool.org
ServerName www.cmdschool.org
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/www.cmdschool.org/$1
DirectoryIndex index.php
</VirtualHost>

<Directory /var/www/www.cmdschool.org>
Options All
AllowOverride all
</Directory>

确认配置可用:

httpd -t

重启Apache服务是配置生效:

systemctl restart httpd

3.2.9 浏览器测试服务

http://www.cmdschool.org

注:要测试请现在客户端host配置名称解析

3.3 安装php 5.6的fastCGI

3.3.1 安装rpm包

yum install -y mod_fcgid php56-php-fpm php56-php

3.3.2 关闭Apache模块方式加载PHP

mv /etc/httpd/conf.d/php56-php.conf /etc/httpd/conf.d/php56-php.conf.default

3.3.3 确认fcgid配置文件存在

ls /etc/httpd/conf.d/fcgid.conf

3.3.4 确认服务名称

ls /usr/lib/systemd/system/php*fpm.service

3.3.5 检查并修改配置

grep include /etc/opt/remi/php56/php-fpm.conf

确认存在以下行:

include=/opt/remi/php56/root/etc/php-fpm.d/*.conf

修改监听端口:

vim /etc/opt/remi/php56/php-fpm.d/www.conf

修改参数如下:

listen = 127.0.0.1:9001

3.3.6 启动服务并配置自启动

systemctl start php56-php-fpm.service
systemctl enable php56-php-fpm.service

3.3.7 确认服务运行

netstat -antp | grep fpm

可见如下信息:

tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      2598/php-fpm: maste
tcp        0      0 127.0.0.1:9001          0.0.0.0:*               LISTEN      2818/php-fpm: maste

3.3.8 配置虚拟服务器

vim /etc/httpd/conf.d/demo.cmdschool.org.conf

创建虚拟服务器配置:

<VirtualHost *:80>
DocumentRoot /var/www/demo.cmdschool.org
ServerName demo.cmdschool.org
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9001/var/www/demo.cmdschool.org/$1
DirectoryIndex index.php
</VirtualHost>

<Directory /var/www/demo.cmdschool.org>
Options All
AllowOverride all
</Directory>

创建网站目录:

mkdir /var/www/demo.cmdschool.org

创建测试代码:

echo '<?php phpinfo(); ?>' > /var/www/demo.cmdschool.org/index.php

确认配置可用:

httpd -t

重启Apache服务是配置生效:

systemctl restart httpd

3.3.9 浏览器测试服务

http://demo.cmdschool.org

注:要测试请现在客户端host配置名称解析

参阅文档:
==================================================
https://www.cnblogs.com/ningskyer/articles/5639276.html

没有评论

发表评论

PHP
如何编译安装Apache+PHP8.1.1?

1 前言 笔者平素不喜欢简单的编译安装,因为很多系统管理员为了省事,编译安装的东西没有rpm包安装那 …

Apache
如何编译安装Apache+PHP7.4.3?

1 前言 笔者平素不喜欢简单的编译安装,因为很多系统管理员为了省事,编译安装的东西没有rpm包安装那 …

Apache
如何打包Docker Apache+PHP 7.4.11(可连MySQL)?

1 基础知识 以下版本基于MySQL数据库的连接,本章节需要你先掌握Linux系统的PHP 7.4. …