之前文章 [教學] 在ubuntu安裝多版本PHP (Apache) 中已經教學如何安裝多版本PHP再同一台伺服器上,使Apache可以在多個版本中切換,不過Apache預設運作方式是只能同時執行一個PHP版本,如果開發多個網頁project一直切換又很麻煩,而且現在不少伺服器都是使用Nginx來當作PHP伺服器,本篇教學如何使用Nginx執行多版本的PHP
Nginx與Apache運作的方式不太相同,Nginx本身是不執行PHP腳本的,而是將執行腳本
這件事情交給php-fpm來處理,而因為nginx與php-fpm是分開的,所以可以只開啟一個nginx並且啟動多個不同版本的php-fpm,依據設定檔的來決定要將腳本丟給哪一個版本的php執行
安裝Nginx
首先輸入指令安裝nginx
sudo apt-get update sudo apt-get install nginx
此時輸入網址便會成功看到Nginx版本安裝完成
接下來就是安裝PHP-fpm與PHP相關套件了
安裝PHP與相關套件
首先add-apt-repository
sudo apt install python-software-properties software-properties-common sudo add-apt-repository ppa:ondrej/php sudo apt-get update
之後依自己需求安裝不同版本的php-fpm與對應版本的PHP套件
sudo apt install php5.6-fpm php5.6-cli php5.6-xml php5.6-mysql sudo apt install php7.1-fpm php7.1-cli php7.1-xml php7.1-mysql
接著先設定php.ini的fix_pathinfo設定 (每個版本的PHP都需要修改,路徑根據安裝的PHP版本不同)
sudo nano /etc/php/5.6/fpm/php.ini sudo nano /etc/php/7.1/fpm/php.ini
找到其中一行:
;cgi.fix_pathinfo=1
將其改成
cgi.fix_pathinfo=0
然後要設定nginx可以把任務丟給php-fpm
開啟nginx設定檔:
sudo nano /etc/nginx/sites-available/default
預設會看到如下的設定
server { listen 80 default_server; listen [::]:80 default_server; root /var/www/html; index index.html index.htm index.nginx-debian.html; server_name _; location / { try_files $uri $uri/ =404; } }
將其改成如下的設定 (紅色表示變動部分)
server { listen 80 default_server; listen [::]:80 default_server; root /var/www/html; index index.php index.html index.htm index.nginx-debian.html; server_name _; location / { try_files $uri $uri/ =404; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php7.1-fpm.sock; } location ~ /\.ht { deny all; } }
其中最關鍵的是location ~ \.php$ 中 fastcgi_pass 這個設定
表示把副檔名為.php的腳本 丟給php7.1-fpm來執行
這樣就能依據自己使用情境來設定哪些腳本要丟給哪個版本的PHP-fpm
以下的範例便是不同domain丟給不同版本的php-fpm (注意default_server只能有一個):
server { listen 80 default_server; listen [::]:80 default_server; root /var/www/html/php71; index index.php index.html index.htm index.nginx-debian.html; server_name php71.domain; location / { try_files $uri $uri/ =404; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php7.1-fpm.sock; } location ~ /\.ht { deny all; } } server { listen 80; root /var/www/html/php56; index index.php index.html index.htm index.nginx-debian.html; server_name php56.domain; location / { try_files $uri $uri/ =404; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php5.6-fpm.sock; } location ~ /\.ht { deny all; } }