LAMP/LNMP开发进度(5):环境切换、PHP多版本共存的问题

王志勇 发表于 2019年10月12日 09:34

在Debian、Ubuntu、CentOS各个版本的系统下,现在已经完成每个系统下的LAMP/LNMP命令编写,并且逐一做了大量的测试,MySQL的安装和调试的部分已经完成了。这个项目,都是用“软件源安装”的方式,所以安装很快。

全新安装已经完成,现在新的难点是用户在不重装系统、网站数据无任何修改的情况下,需要切换安装不同的PHP版本,或者Apache和Nginx的切换,理论上容易实现,就是在命令里卸载旧的相关平台。但是有点复杂的地方在于,在每次用户全新安装,或者切换的时候,需要有个文件记录下当前的环境,切换时,只对不同的部分进行卸载。

起初这个一键Shell包,只是我个人用在Ubuntu 12、CentOS 5下,当时不含MySQL的安装,因为我的项目不用MySQL;当时只支持Apache;而且当时的PHP是用“自带源”的版本,所以安装很简单。如今为了兼容各个系统、各个版本,而且第三方源+PHP 7.X的安装也增加了不少复杂度,这时候这个一键包的开发复杂度,比原来增加了30、50倍以上。

另一个难度,我看到有的平台能在同一个VPS下,实现多个PHP版本共存、并运行,例如同一个VPS下的A站点是PHP 5,B站点是PHP 7。理论上应该可以实现,Apache较难实现;但是Nginx应该可以实现,因为一是Nginx关联的fpm的进程名称里含有PHP的版本号,如php5-fpm、php5.6-fpm、php7.4-fpm这样,二是可以给每个fpm在Nginx配置文件里设置一个不同的端口号(默认为9000),并且必须在www.conf文件里添加一行类似listen=127.0.0.1:9000、或listen=127.0.0.1:9001(否则会有502错误),这些端口号都转发到80端口。

www.conf文件,Debian、Ubuntu系统的路径为 /etc/php-fpm.d/www.conf
CentOS系统的路径为 /etc/php-fpm.d/www.conf

上述路径是自带源PHP 5。到了PHP 7,路径会有改变,我是用find命令在这个一键包的项目里获取www.conf路径,命令为:

Debian、Ubuntu系统的命令:
find /etc -name 'www.conf';

CentOS系统的命令:
find /etc/php* -name 'www.conf';

Nginx理论上可以实现同一个VPS的多版本PHP在不同站点运行。但我个人还是更鼓励非超高并发的站点,用Apache,原因是:

1. 之前做的测试:PHP多版本、多平台的速度测试结果(超完整)
非超高并发的情况下,在Debian、Ubuntu系统下,Apache+PHP和Nginx+PHP的运行速度是一样的。
(但是,CentOS系统下,Nginx+PHP平均比Apache+PHP快约20%-50%,出现这一状况,瓶颈可能是由于CentOS内核,而并不是由于Apache。)

Apache默认是10个进程,对于流量大的站点,可以适当增加进程数,来提高并发量。

2. fpm的功能和PHP理论上一样。但是,Nginx一方面不真正支持.htaccess,另一方面不能像Apache一样使用404页伪静态,详细如前文
Nginx的伪静态,只能在Nginx的配置文件里实现,是对整个VPS的全局设置。Apache的伪静态,既能在配置文件里实现(全局设置),也能在.htaccess里实现(局部设置)。

404页伪静态是一种十分先进的技术,在十多年前很多人用,后来突然失传了,现在人们大多使用Rewrite模块。

404页伪静态相比Rewrite有个优点是Rewrite在PHP程序编写时,必须记住Rewrite之前的带?号的真URL,而获取_GET参数,这会给开发带来不少工作量
而404页伪静态则不需要记住带?号的真URL,因为它就没有带?号的URL,它唯一的URL就是当前的那个静态URL

所以我在几乎所有个人开发的PHP项目里,全部用404页伪静态。以前在一些必须用到Rewrite的地方,后来有了新方案,所以能够全部改为404页伪静态。
这个必须用到Rewrite的地方,就是404页伪静态不支持POST,而Rewrite支持POST。

3. 也就是说,Nginx距离完美只差一步,如果它能支持.htaccess、支持404页伪静态,那么多数的站点应用起来,功能上和Apache的区别较小,完全可以代替Apache。
比如我最近测试安装Wordpress,最新版Wordpress 5.2.3或者更早之前的一些版本,如果是在Apache下,Wordpress已经直接在根目录下产生一个.htaccess文件,直接就是支持伪静态模式;而Nginx下Wordpress默认仍然是带?号的动态网页链接,需要手动在Nginx做Rewrite的全局设置。

VPS面板项目的开发难点:MySQL的备份、MySQL带来的站点的巨大的迁移困难
这么多年来,MySQL的目录仍然是和站点分离。备份真是大费周折,这就是为什么现在有些开发特别困难,因为前人的一个不合理设计。
mysqldump命令可用于MySQL的备份、导入、导出,但是会产生一个体积很大的.xml文本文件。用tar zcvf命令将此文件压缩为tar.gz文件后,体积可以缩小为原来的1/5~1/6左右。但是,对于大文件,tar zcvf命令又会消耗很大的相应内存。比如一个几百兆的文件,用tar zcvf命令也要消耗几百兆的内存,这又为备份、迁移增加难度。
现在越来越多人在用的MySQL物理备份,同样需要经过一番周折。

PHP多版本共存控制器(Shell+面板)的开发难度
涉及的因素很多,开发可以实现,但是比较复杂。只有需要的人多时,才会去开发这个功能。
其实比较好的管理方案是每个VPS只安装一个PHP版本,需要多个版本就用多个VPS。

0条评论:

发表评论:
名字: (*必填)
博客: (可省)

正文:

  记住信息?

王志勇:1980-09-26 (41周岁)
程序设计,前端设计。

版权声明:本博客所有文章,均符合原创的定义,禁止转载,违者将必究;正确的方法是贴原文的标题和网址即可。

与此相关的链接
自由勇专栏

Blog存档 Archives

2021年01月(30)
2020年12月(19)
2020年11月(18)
2020年10月(15)
2020年09月(14)
2020年08月(14)
2020年07月(14)
2020年06月(16)
2020年05月(13)
2020年04月(18)
2020年03月(14)
2020年02月(15)
2020年01月(16)
2019年12月(11)
2019年11月(26)
2019年10月(25)
2019年09月(30)
2019年08月(10)
2019年07月(29)
2019年06月(30)
2019年05月(26)
2019年04月(30)
2019年03月(30)
2019年02月(30)
2019年01月(30)
2018年12月(30)
2018年11月(30)
2018年10月(30)
2018年09月(17)
2016年-2017年(9)
2014年06月-09月(10)
2013年 +

2012年 +
2011年 +
2010年 +
2009年 +
2008年 +
2007年 +
2006年 +
2005年09月(4)

Copyright © 2006-2021 auiou.com All rights reserved.
此Blog程序由王志勇编写