零、目標:
服務器當前PHP版本5.4,新項目中使用了Laravel,PHP版本最低要求5.6。希望保持現有應用同時使用PHP5.6.*。也就是說需要兩個版本的PHP同時存在,供nginx根據需要調用不同版本。
一、原理:
Nginx是通過PHP-FastCGI與PHP交互的。而PHP-FastCGI運行后會通過文件、或本地端口兩種方式進行監聽,在Nginx中配置相應的FastCGI監聽端口或文件即實現Nginx請求對PHP的解釋。
既然PHP-FastCGI是監聽端口和文件的,那就可以讓不同版本的PHP-FastCGI同時運行,監聽不同的端口或文件,Nginx中根據需求配置調用不同的PHP-FastCGI端口或文件,即可實現不同版本PHP共存了。
二、方法:
原理很簡單,操作方法其實也很簡單。
1.php-fpm監聽不同端口,如9000(默認)、9001
2.Nginx配置調用端口,(9000,9001)
第一步,PHP編譯安裝的話,php-fpm配置文件路徑一般是 /PHP_INSTALLED_PATH/etc/php-fpm.conf (php剛編譯安裝完時配置文件名為php-fpm.default.conf,直接改名為php-fpm.conf即可),當然這個路徑是編譯時配置的,上面這個路徑算是最佳實踐吧。
下面這里即是配置監聽端口的地方,此處端口9000改為9001,其他配置參考舊版本php-fpm.conf的配置即可。
listen = 127.0.0.1:9000 #fpm監聽端口,即nginx中php處理的地址,一般默認值即可。可用格式為: 'ip:port', 'port', '/path/to/unix/socket'. 每個進程池都需要設置.
注意,如果是要安裝5.2及以前版本需要打php-fpm補丁,下載fpm補丁包並執行命令 gzip
-
cd
php-5.2.14-fpm-0.5.14.
diff
.gz | patch -d php-5.2.14 -p1
第二步,修改Nginx vhost.conf配置文件,添加如下部分:
1 server { 2 listen 80; 3 server_name a.b.com; 4 index index.html index.htm index.php; 5 root /MY_PROJECT_PATH; 6 7 location / { 8 try_files $uri $uri/ /index.php?$query_string; 9 } 10 location ~ .*\.(php|php5)?$ { 11 #fastcgi_pass unix:/tmp/php-cgi.sock; 12 fastcgi_pass 127.0.0.1:9001; 13 fastcgi_index index.php; 14 include fastcgi.conf; 15 } 16 }
上面9001部分即是將所有.php和.php5文件請求都轉發到9001端口。
第三步、啟動新版php-fpm,重啟nginx。
php-fpm支持的操作:
- start,啟動PHP的FastCGI進程。
- stop,強制終止PHP的FastCGI進程。
- quit,平滑終止PHP的FastCGI進程。
- restart, 重啟PHP的FastCGI進程。
- reload, 重新加載PHP的php.ini。
- logrotate, 重新啟用log文件。
常見錯誤1:php-fpm start啟動后通過瀏覽器訪問項目出現502BAD GATEWAY,查看netstat -ano發現並沒有監聽到9001端口的程序,應該是php-fpm啟動出錯。
查資料發現可以通過指定配置文件來啟動php-fpm,命令如下:
#測試php-fpm配置
/usr/local/php/sbin/php-fpm -t /usr/local/php/sbin/php-fpm -c /usr/local/php/etc/php.ini -y /usr/local/php/etc/php-fpm.conf -t #啟動php-fpm /usr/local/php/sbin/php-fpm /usr/local/php/sbin/php-fpm -c /usr/local/php/etc/php.ini -y /usr/local/php/etc/php-fpm.conf
指定配置文件后啟動正常,正確監聽9001端口
常見錯誤2:
- ERROR: [pool www] cannot get uid for user '@php_fpm@
- ERROR: FPM initialization failed
解決辦法是修改php-fpm.conf中user和group部分為系統用戶的名字,如root或www(應用這個,root千萬別用,權限太大)
通過以上三步便實現了Linux上多版本PHP共存,不過這個前提是服務器上已經安裝了兩個版本的PHP。
如果對PHP編譯安裝不清楚或者遇到了問題,可以看這篇文章: