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

前言

公司有些 Yii2 項目的驗證碼組件不顯示圖片了,經排查後發現原來是因爲前陣子測試環境上 PHP 版本升級致使的。原來 Yii 2.0.13 版本以前都會使用 \yii\base\Object 類,而 Object 在 PHP 7.2 以後變做保留關鍵字,做爲類名會報錯。具體消息可參考文檔:《Yii 2.0 的 API 文檔》。好了,找到問題以後,就該着手解決啦。php

安裝多個版本的 PHP

目前公司服務器上使用的是 CentOS7,已使用 yarn 安裝了 PHP 7.2.30,所以我只須要再安裝一個較低版本的 PHP。使用 yarn 安裝 PHP 可參考個人上篇文章:《Laravel 項目部署,php-fpm 及 nginx 配置》,這裏就再也不贅述。注意安裝的時候不要影響到以前的 PHP,必要的時候能夠備份一下 PHP 和 Nginx 的相關配置。html

讓PHP-FPM 使用 Unix 套接字

默認狀況下,php-fpm.conflisten 的默認配置是 127.0.0.1:9000。由於我這裏想要使用多個版本的 PHP,所以須要改成使用 Unix 套接字。
首先找到 php-fpm 的配置文件:nginx

ps -ef | grep php

能夠看到我這裏已經開啓了兩個版本的 php-fpm:segmentfault

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 的相關配置:api

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.sockphp7

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

更改 Nginx 配置

首先找到 Nginx 的配置文件:yii

ps -ef | grep nginx

顯示結果爲:socket

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 設置的端口改成咱們以前設置的套接字,以下所示:php-fpm

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

相關文章
相關標籤/搜索