[教學] 在ubuntu安裝多版本PHP (Nginx)

之前文章 [教學] 在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;
    }
}