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 (44周岁)
程序设计,前端设计。

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

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

Blog存档 Archives

2022年07月
2022年06月(15)
2022年05月(20)
2022年04月(16)
2022年03月(9)
2022年02月(9)
2022年01月(10)
2021年 +

2020年 +
2019年 +
2018年 +
2016年-2017年(9)
2014年06月-09月(10)
2013年 +
2012年 +
2011年 +
2010年 +
2009年 +
2008年 +
2007年 +
2006年 +
2005年09月(4)

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