2018/6/2

於Ubuntu 18.04安裝nginx與php-fpm與phpmyadmin

安裝的nginx為1.14.0版
安裝的phpmyadmin為4.8.1版
安裝的php-fpm為7.2版
先安裝nginx

在開始動作前先做一次更新:
$ sudo apt-get update -y && sudo apt-get upgrade -y

在/etc/apt/sources.list檔案的最後加入以下兩行:
deb http://nginx.org/packages/ubuntu/ xenial nginx
deb-src http://nginx.org/packages/ubuntu/ xenial nginx

將nginx的GPG key加入(此動作需切換到root):
$ curl -O https://nginx.org/keys/nginx_signing.key && apt-key add ./nginx_signing.key

再做一次更新:
$sudo apt-get update -y && sudo apt-get upgrade -y
應該會看到nginx相關的訊息,表示我們把最新的nginx版本加入了:

安裝nginx:
$ sudo apt-get install nginx -y

查看nginx版本,再次確認是否安裝成功:
$ nginx -v
nginx version: nginx/1.14.0

查看nginx目前狀態:
$ systemctl status nginx

去nginx的目錄:
$ cd /etc/nginx

查看目前有哪些檔案和目錄:
$ ll
total 48
drwxr-xr-x  3 root root 4096 May 31 16:07 ./
drwxr-xr-x 91 root root 4096 May 31 16:07 ../
drwxr-xr-x  2 root root 4096 May 31 16:07 conf.d/
-rw-r--r--  1 root root 1007 Apr 17 15:22 fastcgi_params
-rw-r--r--  1 root root 2837 Apr 17 15:22 koi-utf
-rw-r--r--  1 root root 2223 Apr 17 15:22 koi-win
-rw-r--r--  1 root root 5170 Apr 17 15:22 mime.types
lrwxrwxrwx  1 root root   22 Apr 17 16:00 modules -> /usr/lib/nginx/modules/
-rw-r--r--  1 root root  643 Apr 17 15:59 nginx.conf
-rw-r--r--  1 root root  636 Apr 17 15:22 scgi_params
-rw-r--r--  1 root root  664 Apr 17 15:22 uwsgi_params
-rw-r--r--  1 root root 3610 Apr 17 15:22 win-utf
nginx.conf是nginx主要設定檔,看一下此檔的內容:
user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}
重點是下方的include那行 include /etc/nginx/conf.d/*.conf;是指將/etc/nginx/conf.d底下的所有conf都包含進來,要include才會生效,如果你的網站放在其他位置,沒在nginx.conf include的話那nginx就看不到你的網站
網路上常見的做法是於/etc/nginx/底下再創一個sites-available和sites-enabled,前者是放你的網站的根目錄,後者是將前者的網站目錄使用ln連結過來,至於為何要這樣做很像跟apache的設定有點關係,但也不一定要照這樣的做法
而官方是建議放在/etc/nginx/conf.d/底下就可以了

啟動nginx:
$ sudo systemctl start nginx

將nginx設為開機自動起來:
$ sudo systemctl enable nginx
查看nginx狀態,確認是否啟動:
$ systemctl status nginx
查看nginx的行程:
$ ps -ef |grep nginx
root       760     1  0 16:11 ?        00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx      763   760  0 16:11 ?        00:00:00 nginx: worker process
xanxus    1154   981  0 16:41 pts/0    00:00:00 grep --color=auto nginx
可輸入http://127.0.0.1查看nginx歡迎的網頁:


接下來安裝php-fpm
安裝php-fpm和其他相關的模組:
$ sudo apt-get install php-fpm php-cgi php-mysql php-common php-pear php-mbstring -y

打開php.ini來更改cgi.fix_pathinfo為0:
sudo vim /etc/php/7.2/fpm/php.ini
找到cgi.fix_pathinfo取消註解並設為0:
cgi.fix_pathinfo=0

重啟php-fpm:
$ sudo systemctl restart php7.2-fpm


稍微查看php底下的東西:
$ ls /run/php/
php7.2-fpm.pid  php7.2-fpm.sock
查看php的行程:
$ ps aux | grep php
root     28256  0.0  0.4 288868 18732 ?        Ss   14:43   0:00 php-fpm: master process (/etc/php/7.2/fpm/php-fpm.conf)
www-data 28268  0.0  0.2 291168  9592 ?        S    14:43   0:00 php-fpm: pool www
www-data 28269  0.0  0.2 291168  9592 ?        S    14:43   0:00 php-fpm: pool www
lab401   28286  0.0  0.0  13136  1040 pts/0    S+   14:44   0:00 grep --color=auto php

設置php-fpm.conf 於/etc/nginx/conf.d/創造php-fpm.conf檔案,內容如下:
server {
 listen 80;
    root /usr/share/nginx/html;
    index index.php index.html index.htm index.nginx-debian.html;

    server_name _;
    location / {
  try_files $uri $uri/ /index.php?q=$uri&$args;
    }
  location ~* \.php$ {
    fastcgi_pass 127.0.0.1:9000;
    include         fastcgi_params;
    fastcgi_param   SCRIPT_FILENAME    $document_root$fastcgi_script_name;
    fastcgi_param   SCRIPT_NAME        $fastcgi_script_name;
  }
    location ~ /\.ht {
        deny all;
    }
}
重啟nginx:
$ sudo systemctl reload nginx
驗證設定檔格式是否有錯:
$ sudo nginx -t
於/usr/share/nginx/html底下創造info.php,以便等等驗證,info.php內容如下:
<?php
phpinfo();
?>
將nginx設成可以存取php-fpm,打開www.conf:
$ sudo vim /etc/php/7.2/fpm/pool.d/www.conf
找到listen.owner和listen.group的地方,原本應該是像下面這樣:
listen.owner = www-data
listen.group = www-data
請改成以下這樣:
listen.owner = nginx
listen.group = nginx
如此就可以解決nginx和php-fpm明明已經設定好了,但連線卻出現502 Bad Gateway
之後請重啟php-fpm:
$ sudo systemctl restart php7.2-fpm
參考:
https://www.yuzhi100.com/article/nginx-502-bad-gateway-debian
https://www.linode.com/docs/web-servers/nginx/serve-php-php-fpm-and-nginx/ 

現在可以驗證php網頁是否可以連了 網址輸入http://127.0.0.1/info.php 如果看到php安裝的資訊頁面就是成功了


接下來安裝phpmyadmin就簡單了
安裝phpMyAdmin,先去官網https://www.phpmyadmin.net/
於右邊的綠色按鈕"Download 4.8.1"點選滑鼠右鍵選"複製連結網址"
回到系統使用wget下載:
$ sudo wget https://files.phpmyadmin.net/phpMyAdmin/4.8.1/phpMyAdmin-4.8.1-all-languages.zip
解壓縮此zip檔

將解壓縮的目錄放到/usr/share/nginx/html底下

更改php-fpm.conf的設定
從/usr/share/nginx/html
改成/usr/share/nginx/phpMyAdmin-4.8.1-all-languages
改完後你的php-fpm.conf應該像下面這樣:
server {
    listen 7891;
    root /usr/share/nginx/phpMyAdmin-4.8.1-all-languages;
    index index.php index.html index.htm index.nginx-debian.html;

    server_name _ ;
    location / {
  try_files $uri $uri/ /index.php?q=$uri&$args;
    }
    location ~* \.php$ {
        fastcgi_pass 127.0.0.1:9000;
 include fastcgi_params;
 fastcgi_param   SCRIPT_FILENAME    $document_root$fastcgi_script_name;
        fastcgi_param   SCRIPT_NAME        $fastcgi_script_name;

    }
    location ~ /\.ht {
        deny all;
    }
}

然後重啟nginx:
$ sudo systemctl reload nginx

於網址輸入 http://127.0.0.1 就會看到phpMyAdmin的登入畫面了

延伸閱讀:


其他參考資料:
後續補充:
nginx將php檔案導給php-fpm的兩種方式:
  1. 使用unix sock
  2. 使用tcp
據說用第一種會比第二種還快,但當有大量請求時,第一種掉包的機率比較高,穩定度不如第二種方式
這篇文章是使用第二種方式,可以看到這裡的php-fpm.conf中fastcgi_pass是填127.0.0.1:9000
如果要換成第一種sock的方式要去/etc/php/7.2/fpm/pool.d/www.conf找到listen這個參數:
照上圖中的方式改成sock,並且用分號將舊的註解掉。

然後php-fpm.conf要改成對應的,像以下這樣:
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
改完記得重啟nginx和php-fpm

沒有留言:

張貼留言