Ubuntu的PHP多版本实现之路

上次更新博客的wordpress用了一个全新的Ubuntu 18.04的操作系统,以前都从来没有好好玩过,不过在万能的谷歌指引下,基本上有惊无险的完成了所有的骚操作,看来还是很好用地。昨天打开wordpress的后台发现了一个安全隐患的提示,现在这个环境安全太重要了,绝对不能忽视,所以赶紧打开一看是说我的PHP的7.2.12的版本太老,要求我至少升级到7.3去,尼玛!7.2都太老,这种服务器环境怎么随便追新呢,不过7.x的构架都差不多,升级也还行吧,我搜索了一下Ubuntu怎么升级7.3,意外的发现7.3可以跟7.2并行安装,而且甚至可以安装7.4,而居然5.6也可以同时安装进来,哇塞,这是不是说我的墨色南风老坛子在5.6都支持下也有活过来的一天呢??激动之下赶紧实验一下吧,没想到这一实验就进了一个大坑!!

安装的文档网上搜了一下,其实是很简单的,直接用apt进行多个版本安装:

sudo add-apt-repository ppa:ondrej/php
sudo apt update
sudo apt install php7.3 php7.3-common php7.3-cli

不仅版本7.3可以,7.4也行,甚至可以把其他版本所带的库都在自己都新版本上装一遍:

sudo apt install $(apt list --installed | grep php7.2- | cut -d'/' -f1 | sed -e 's/7.2/7.3/g')

而且还可以删除某个特定的版本,例如删掉7.2

sudo apt purge $(apt list --installed | grep php7.2- | cut -d'/' -f1)

安装完当然要测试一下,看看都装了什么库之类的:

sudo apt-cache search php7.3 | grep php7.3

因为使用都是Nginx,所以还要装:

apt install php7.3-fpm

接下来就要在命令行下面看看PHP都版本了:

php -v
PHP 7.4.5 (cli) (built: Apr 19 2020 07:36:30) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
with Zend OPcache v7.4.5, Copyright (c), by Zend Technologies

好了,貌似大功告成哈,只是安装完成之后,到了网站都后台一看,仍然是7.2,为什么OS都显示PHP是7.4了,网站依然用7.2,估计应该是是网站都配置问题,查了一下发现貌似不是非常直接都改点就能搞定,有些麻烦,这个服务器用的Web服务器是Nginx,上面面跑了4个网站,只能一个网站一个网站的配置了,网上找了一个网站看conf配置文件,然后继续搜谷歌,谷歌上说只需要改

fastcgi_pass unix:/run/php/php7.4-fpm.sock; 

而我都配置文件里都貌似是这样的:

upstream php-handler-https {
       server 127.0.0.1:9000;
}

xxxxxx

        location ~ \.php(?:$|/) {
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param PATH_INFO $fastcgi_path_info;
                fastcgi_param HTTPS on;
                fastcgi_param PHP_VALUE "auto_prepend_file=/var/www/html/xhprof/external/header.php";
                fastcgi_pass php-handler-https;
                fastcgi_read_timeout 60s;
        }

这里用了一个php-handler-https的变量,当时不是特别明白这个127.0.0.1:9000的upstream是怎么设置的,也不是很清楚这个设置的含义,算了,直接改一下这个变量看看吧:

upstream php-handler-https {
       server unix:/run/php/php7.4-fpm.sock;
}

结果当然是悲剧了,这个网站完全无法显示,到了SSH看了一下error log,基本都是这个sock的权限错误,就是说当前用户没有权限去使用这个sock,然后又是一顿狂搜,发现大家也说的不是很清楚,有都说是这个php7.4-fpm.sock的权限有问题,有人说应该去这个fpm的配置文件www.conf里去配置listen都user和group,没办法只能一个一个继续实验里,先改这个sock的权限吧,改成755,还是不行,改成777然后就可以了,但777太危险了,不设防啊,不行,重新看看另一条路吧。

进入到www.conf里把原来跑网站都www-data用户都改成nginx,然后发现,网站居然跑起来里,不过我心里总觉得没底,就到处看里一下,跑去博客刷新了一下后台,发现后台有一个插件可以更新,当我试图更新的时候,突然间问我要什么FTP的信息,我当时很纳闷,用了这么多年的这个wordpress从来没有升级要过FTP啊,查了一下才发现这是因为跑这个网站的用户和跑PHP都用户不一直导致的,看来这个方法还有隐患,而且还不清楚怎么修复,如果俩用户一致,sock的权限肯定不够,不一致又产生其他都问题,试图折腾了很长时间也没啥好办法。

后来突然间想,这个sock的用户listen的方式有两种,一种是直接使用sock,这样的话会产生很多问题,如果是使用地址加端口的模式,就像之前的7.2的那个版本的方式会不会能解决问题呢?赶紧实验一下吧,然后就立刻动手把7.3和7.4的www.conf都改成以下的配置

; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
; user = nginx
; group = nginx

user = www-data
group = www-data

; The address on which to accept FastCGI requests.
; Valid syntaxes are:
;   'ip.add.re.ss:port'    - to listen on a TCP socket to a specific IPv4 address on
;                            a specific port;
;   '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on
;                            a specific port;
;   'port'                 - to listen on a TCP socket to all addresses
;                            (IPv6 and IPv4-mapped) on a specific port;
;   '/path/to/unix/socket' - to listen on a unix socket.
; Note: This value is mandatory.
; listen = /run/php/php7.4-fpm.sock
listen = 127.0.0.1:9074

然后重新启动fpm和Nginx服务,呜啦啦!!所有的网站都跑起来了,看来这就是真正都解决方案啊,虽然没搞清楚是为什么,但是已经解决了我的所有问题,然后尝试着设置了三个网站,用了三个不同的版本都PHP,都跑成功了,哈哈,这感觉太爽了,过两天准备用PHP 5.6的版本恢复一下之前的墨色南风的论坛,希望能够重新见到老论坛的样子!!!

相关的文章

Leave a Reply

will not be published

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据