CentOS7 多版本 PHP 部署,php-fpm 及 nginx 配置

前言

公司有些 Yii2 项目的验证码组件不显示图片了,经排查后发现原来是由于前阵子测试环境上 PHP 版本升级导致的。原来 Yii 2.0.13 版本之前都会使用 \yii\base\Object 类,而 Object 在 PHP 7.2 之后变作保留关键字,作为类名会报错。具体消息可参考文档:《Yii 2.0 的 API 文档》。好了,找到问题之后,就该着手解决啦。

安装多个版本的 PHP

目前公司服务器上使用的是 CentOS7,已使用 yarn 安装了 PHP 7.2.30,因此我只需要再安装一个较低版本的 PHP。使用 yarn 安装 PHP 可参考我的上篇文章:《Laravel 项目部署,php-fpm 及 nginx 配置》,这里就不再赘述。注意安装的时候不要影响到之前的 PHP,必要的时候可以备份一下 PHP 和 Nginx 的相关配置。

让PHP-FPM 使用 Unix 套接字

默认情况下,php-fpm.conflisten 的默认配置是 127.0.0.1:9000。因为我这里想要使用多个版本的 PHP,因此需要改为使用 Unix 套接字。
首先找到 php-fpm 的配置文件:

ps -ef | grep php

可以看到我这里已经开启了两个版本的 php-fpm:

root     13124     1  0 18:33 ?        00:00:00 php-fpm: master process (/etc/opt/remi/php70/php-fpm.conf)
root     28862     1  0 11:31 ?        00:00:00 php-fpm: master process (/etc/opt/remi/php72/php-fpm.conf)

进入到 /etc/opt/remi/php70 文件夹中,可以找到该版本 PHP 的相关配置:

drwxr-xr-x. 2 root root     6 Feb 20  2019 opt
drwxr-xr-x. 2 root root  4096 Apr 26 16:39 php.d
-rw-r--r--. 1 root root  4103 Apr 14 16:23 php-fpm.conf
drwxr-xr-x. 2 root root    40 Apr 26 18:29 php-fpm.d
-rw-r--r--. 1 root root 60621 Apr 26 18:32 php.ini
drwxr-xr-x. 2 root root     6 Feb 20  2019 pki
drwxr-xr-x. 5 root root    49 Apr 26 16:19 pm
drwxr-xr-x. 2 root root     6 Feb 20  2019 skel
drwxr-xr-x. 2 root root    20 Apr 26 18:04 sysconfig
drwxr-xr-x. 4 root root    36 Apr 26 16:19 X11
drwxr-xr-x. 3 root root    22 Apr 26 16:19 xdg
drwxr-xr-x. 2 root root     6 Feb 20  2019 xinetd.d

其中 php-fpm 的配置就在 php-fpm.d 文件夹下的 www.conf 中,内容如下:

listen = 127.0.0.1:9000
···
;listen.owner = nobody
;listen.group = nobody
;listen.mode = 0660

listen 改为 sock 文件名,更改后结果如下:(我这里起名叫做 /tmp/php70-php-fpm.sock

listen = /tmp/php70-php-fpm.sock
···
listen.owner = www
listen.group = www
listen.mode = 0666

更改 Nginx 配置

首先找到 Nginx 的配置文件:

ps -ef | grep nginx

显示结果为:

root     13114     1  0 18:32 ?        00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

查看文件 /usr/local/nginx/conf/nginx.conf 后,发现我们服务器上每个项目的配置文件为 /usr/local/nginx/conf/vhost/xxx.conf,打开后更改配置,将fastcgi_pass 设置的端口改为我们之前设置的套接字,如下所示:

location ~ [^/]\.php(/|$)
{
    try_files $uri =404;
    fastcgi_pass  unix:/tmp/php70-php-fpm.sock;(更改这里)
    fastcgi_index index.php;
    include fastcgi.conf;
}

接下来只需要重启 PHP-FPM 和 Nginx 即可:

systemctl restart php70-php-fpm.service
systemctl restart nginx.service

PHP-FPM 没有生成 socket 文件

打开网页,发现报错 502,查看 nginx 日志后,发现报了这么一行错误:

connect() to unix:/tmp/php70-php-fpm.sock failed (2: No such file or directory) while connecting to upstream

查看 /tmp 文件夹,发现并没有 php70-php-fpm.sock 文件。
查找 php70-php-fpm.service 配置:

find / -name "php70-php-fpm.service"

打开 php70-php-fpm.service,发现其中 PrivateTmp 项设置为 true,改为 false 即可:

[Unit]
Description=The PHP FastCGI Process Manager
After=syslog.target network.target

[Service]
Type=notify
EnvironmentFile=/etc/opt/remi/php70/sysconfig/php-fpm
ExecStart=/opt/remi/php70/root/usr/sbin/php-fpm --nodaemonize
ExecReload=/bin/kill -USR2 $MAINPID
PrivateTmp=false

[Install]
WantedBy=multi-user.target

然后记得再重启一下 PHP-FPM,再去看发现已经生成了 /tmp/php70-php-fpm.sock 文件。如果没有生成,可以参考一下 《PHP-FPM 没有生成 socket 文件》这篇文章,看看是哪里的问题。

如果发现报错:

connect() to unix:/tmp/php70-php-fpm.sock failed (13: Permission denied) while connecting to upstream

可能是因为用户/用户组权限的问题,可尝试更改 PHP-FPM 配置文件中的 listen.ownerlisten.group

你可能感兴趣的:(php,php-fpm,nginx)