Arch Linux ARM 安裝與設定 Nginx + MariaDB + PHP + phpMyAdmin

如何在 Arch Linux ARM 使用 Nginx、MariaDB 與 PHP(簡稱 LEMP)來架設 WEB 伺服器的環境,文章詳細解說安裝與設定的步驟,並使用 phpMyAdmin 這套資料庫管理工具,搭配 MariaDB 來管理資料庫。

raspberry-pi

以下流程將使用「一般使用者」而非 root 來操作系統,如無法使用 sudo 指令,請參考 安裝與設定 Arch Linux for Raspberry Pi 2
使用 pacman -S 指令安裝套件發生失敗或錯誤時,請先執行 pacman -Sy 更新套件列表資料

Nginx

Nginx(Ngin 發音同 Engine 在加 x,也就是 LEMP 的 E)。

安裝

使用以下指令安裝 Nginx 這套 WEB 伺服器:

[smalljacky@alarmpi ~]$ sudo pacman -S nginx

啟動 Nginx,並設定開機自動啟動:

[smalljacky@alarmpi ~]$ sudo systemctl start nginx.service
[smalljacky@alarmpi ~]$ sudo systemctl enable nginx.service

測試

先查詢 Arch Linux 主機的 IP:

[smalljacky@alarmpi ~]$ ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether b8:27:eb:86:49:0c brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.170/24 brd 192.168.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::ba27:ebff:fe86:490c/64 scope link
       valid_lft forever preferred_lft forever

使用瀏覽器連結測試,如顯示下圖的 Nginx 預設頁面,表示 WEB 伺服器己正確啟用:

http://127.0.0 的預設網頁檔案為 /usr/share/nginx/html/index.html
arch-linux-install-setup-nginx-mariadb-php-phpmyadmin_01

設定檔

說明

  • Nginx 所有設定檔:放置於 /etc/nginx 目錄下
  • Nginx 主要設定檔:/etc/nginx/nginx.conf
  • Nginx 程序設定檔:/usr/sbin/nginx
  • Nginx Log 檔:/var/log/nginx

Nginx 主要設定檔說明:

[smalljacky@alarmpi ~]$ sudo nano /etc/nginx/nginx.conf

# 啟動 Nginx 伺服器的使用者(預設為 nobody),可自訂使用者 
#user html;
# 開啟的程序數量(預設為 1),1.2.5/1.3.8 版本以後設定為自動 auto 
worker_processes  1;

# 取消三行中的其中一行註解,來啟用 Log,格式为 error_log Log 位置,第二個參數:
# 1.留空为警告
# 2.notice 和 info,更詳細
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

# ProcessID,也就是程序 ID 的存放路徑
#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}

# 設定 HTTP 伺服器
http {
    include       mime.types;
    default_type  application/octet-stream;

    # 自訂 Log 格式
    #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  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            # 網站的根目錄
            root   /usr/share/nginx/html;
            # 使用「瀏覽器」瀏覽根目錄時,未指定檔名時預設使用的檔案
            index  index.html index.htm;
            # [須手動新增] 在瀏覽器呈現目錄樹為 on;反之 off,正試上線最好設成 off(預設值 off)
            autoindex on;
        }

        # [須手動新增] 透過 php-fpm 讓 Nginx 與 PHP 之間交互連動
        location ~ \.php$ {
            fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
            fastcgi_index index.php;            
            # 網站的根目錄
            root /home/smalljacky;

            include fastcgi.conf;
        }

        # 404 檔案不存在時,要呈現的自訂頁面
        #error_page  404              /404.html;

        # 伺服器錯誤時,要呈現的自訂頁面
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # 傳送 PHP 程式到 FastCGI server,透過 127.0.0.1:9000 解析
        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # 拒絕訪問 .htacess 檔案
        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # 設定其它埠,成為另一個虛擬主機
    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # 設定 HTTPS 伺服器
    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

設定

考慮到後續撰寫網頁的效率,所以會使用 FTP 的方式來「上/下載」檔案,因此將根目錄更改為「使用者」目錄:

[smalljacky@alarmpi ~]$ sudo nano /etc/nginx/nginx.conf

...(前面省略)...

http {
    server {

...(中間省略)...

        location / {
            # 預設為 /usr/share/nginx/html;
            root   /home/smalljacky;
            index  index.php; index.html index.htm;
            autoindex on;
        }

...(後面省略)...

重新載入設定檔,這樣剛才的設定才能生效:

[smalljacky@alarmpi ~]$ sudo systemctl reload nginx.service

測試

使用「瀏覽器」連結測試,如下顯示 403 Forbidden,代表沒有訪問的權限:

arch-linux-install-setup-nginx-mariadb-php-phpmyadmin_02

查看使用者家目錄的權限,得知因為沒有「可讀(r)/執行(w)」的權限,而導無法沒有訪問的權限,因此將「群組/其它人」修改成具有「可讀(r)/執行(w)」的權限:

[smalljacky@alarmpi ~]$ ls -ald ../smalljacky/
drwx------ 2 smalljacky smalljacky 4096 Apr 12 06:34 ../smalljacky/

[smalljacky@alarmpi ~]$ chmod 755 ../smalljacky
[smalljacky@alarmpi ~]$ ls -ald ../smalljacky/
drwxr-xr-x 2 smalljacky smalljacky 4096 Apr 12 06:34 ../smalljacky/

再使用「瀏覽器」連結測試,即可正常顯示,因為設定 autoindex on; 在瀏覽器呈現目錄樹,因此就算沒有檔案,仍會顯示目錄樹,但如設定 autoindex off;,在沒有檔案時就會顯示 403 Forbidden,代表沒有訪問的權限:

arch-linux-install-setup-nginx-mariadb-php-phpmyadmin_03

PHP

安裝

使用以下指令安裝 PHP 與相關套件:

  • php:就是 PHP
  • php-fpm:也就是 FastCGI,透過它來讓 Nginx(WEB 伺服器)與 PHP(外部程式)之間交互連動
  • php-mcrypt:加密套件,許多 PHP 相關套件都必須使用到它,例如稍後會安裝的 phpMyAdmin
[smalljacky@alarmpi ~]$ sudo pacman -S php php-fpm php-mcrypt

啟動 php-fpm,並設定開機自動啟動:

[smalljacky@alarmpi ~]$ sudo systemctl start php-fpm
[smalljacky@alarmpi ~]$ sudo systemctl enable php-fpm

設定

PHP 的設定檔在 /etc/php/php.ini,設定如下:

[smalljacky@alarmpi ~]$ sudo nano /etc/php/php.ini

...(前面省略)...

# 將 PHP 所能存取的檔案限制在指定目錄下(含目錄本身),不受安全模式「打開/關閉」的影響
open_basedir = /srv/http/:/home/:/tmp/:/usr/share/pear/:/usr/share/webapps/:/etc/webapps/

# 顯示錯誤訊息在網頁上(Debug 過程中會開啟,但正式上線必須關閉)
display_errors = On

# 顯示的錯誤訊息,是否使用 HTML 標籤方式顯示 
html_errors = On

# 時區
date.timezone = Asia/Taipei

[擴展功能] 加密套件
extension=mcrypt.so
[擴展功能] mysqli
extension=mysqli.so
[擴展功能] pdo
extension=pdo_mysql.so

...(後面省略)...

Nginx 針對 PHP 的設定,這樣才可透過 php-fpm 讓 Nginx 與 PHP 之間交互連動:

[smalljacky@alarmpi ~]$ sudo nano /etc/nginx/nginx.conf

...(前面省略)...

http {
    server {

...(中間省略)...

        location / {
            root   /home/smalljacky;
            index  index.php index.html index.htm;
            autoindex on;
        }

        # 手動新增
        location ~ \.php$ {
            fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
            fastcgi_index index.php;            
            root /home/smalljacky;
            include fastcgi.conf;
        }

...(後面省略)...

重新啟動 Nginx,這樣剛才的設定才能生效:

[smalljacky@alarmpi ~]$ sudo systemctl restart nginx.service

測試

新增一檔案,並使用 PHP 的 phpinof() 內建函式,來顯示 PHP 的所有資訊:

[smalljacky@alarmpi ~]$ nano phpinfo.php

<?php
phpinfo();  // 顯示所有 PHP 資訊

使用瀏覽器連結測試,如顯示下圖的 PHP 資訊頁面,表示 Nginx 與 PHP 己正確連動:

arch-linux-install-setup-nginx-mariadb-php-phpmyadmin_04

MariaDB

MariaDB(完全相容 MySQL)是 MySQL 的一個分支,主要由開源社群在維護,原因為 Oracle 公司收購了 MySQL 後,有將 MySQL 閉源的潛在風險,因此社群採用分支的方式來避開這個風險。

安裝與初始化

使用以下指令安裝 MariaDB 這套「資料庫管理系統」:

[smalljacky@alarmpi ~]$ sudo pacman -S mariadb

初始化 MariaDB:

[smalljacky@alarmpi ~]$ sudo mysql_install_db --user=mysql --basedir=/usr --datadir=/var/lib/mysql
[smalljacky@alarmpi ~]$ sudo systemctl start mysqld.service
[smalljacky@alarmpi ~]$ sudo mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):  # 輸入目前 MariaDB 的 root 密碼(第一次設定應該是空的,所以直接「ENTER」即可)
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n]  # 是否要設定新的 MariaDB root 密碼,直接「ENTER」
New password:  # 設定新的密碼
Re-enter new password:  # 再次確認密碼
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n]  # 是否要移除 anonymous user 的資料,直接「ENTER」
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n]  # 是否只允許讓 root 從 localhost 登入,無法從其他的網路登入,直接「ENTER」
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] n  # 是否移除 test 的資料庫
 ... skipping.

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n]  # 是否要重新載入權限的 table 資訊,直接「ENTER」
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

重新啟動 MariaDB,並設定開機自動啟動:

[smalljacky@alarmpi ~]$ sudo systemctl restart mysqld.service
[smalljacky@alarmpi ~]$ sudo systemctl enable mysqld.service

測試

使用 mysql 指令,登入 MariaDB 介面:

[smalljacky@alarmpi ~]$ mysql -u root -p

Enter password:  # 輸入剛才建立 MariaDB 的 root 密碼
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 4
Server version: 10.1.13-MariaDB MariaDB Server

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show databases;  # 顯示目前所有已建立的資料庫
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               
+--------------------+
4 rows in set (0.00 sec)

MariaDB [(none)]> quit  # 離開
Bye

變更 root 密碼

使用 mysql 指令,登入 MariaDB 介面,在用 SQL 指令來變更 root 的密碼:

也適用 MySQL
[smalljacky@alarmpi ~]$ mysql -u root -p

Enter password:  # 輸入密碼
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 10.1.13-MariaDB MariaDB Server

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> USE mysql;  # 切換至 mysql 資料庫
Database changed
MariaDB [mysql]> UPDATE user SET password=PASSWORD("myPassword") WHERE user="root";  # 更新密碼,myPassword 為新的密碼
Query OK, 3 rows affected (0.00 sec)
Rows matched: 3  Changed: 3  Warnings: 0

MariaDB [mysql]> FLUSH PRIVILEGES;  # 權限更新,這樣修改才能立即生效
Query OK, 0 rows affected (0.00 sec)

MariaDB [mysql]> quit  # 離開
Bye

phpMyAdmin

phpMyAdmin 是一個以 PHP 為基礎,使用 Web-Base 方式架構在 WEB 伺服器上的資料庫管理工具,可讓管理者透過 WEB 介面管理資料庫。

適用 MariaDB 與 MySQL

安裝

使用以下指令安裝 phpMyAdmin:

phpMyAdmin 會使用到 php-mcrypt 這個加密套件,如未安裝須安裝
[smalljacky@alarmpi ~]$ sudo pacman -S phpmyadmin

設定

修改 phpMyAdmin 認證方式:

[smalljacky@alarmpi ~]$ sudo nano /usr/share/webapps/phpMyAdmin/config.inc.php

# 預設為 cookie
$cfg['Servers'][$i]['auth_type'] = 'http';

建立 Nginx 根目錄鏈結 phpMyAdmin 的根目錄路徑:

[smalljacky@alarmpi ~]$ ln -s /usr/share/webapps/phpMyAdmin /home/smalljacky

重啟 Nginx:

[smalljacky@alarmpi ~]$ sudo systemctl restart nginx.service

測試

phpMyAdmin 語系切換至中文,仍是顯示英文,也找不出是哪裡的問題…

使用瀏覽器連結測試,在網址列輸入 IP/phpMyAdmin,然後輸入帳密 > 點擊「登入」:

arch-linux-install-setup-nginx-mariadb-php-phpmyadmin_05

首次登入時,下方出現警示訊息說“phpMyAdmin 未完全配置,一些擴展功能已被停用”,請點擊「Find out why」:

arch-linux-install-setup-nginx-mariadb-php-phpmyadmin_06

點擊「Create」,即可自動建立並設置 phpMyAdmin 的設定:

arch-linux-install-setup-nginx-mariadb-php-phpmyadmin_07

自動配置完成:

arch-linux-install-setup-nginx-mariadb-php-phpmyadmin_08

1 則評論 to “Arch Linux ARM 安裝與設定 Nginx + MariaDB + PHP + phpMyAdmin”

  1. vincent 說道:

    您好,

    我們是支點雲端科技,由三民補習班成立的線上教學機構http://www.3study.com,朝著建立技術人群聚地的目標前進。

    我們的課程分為三大塊以及兩小實務區:

    i. CCNA + LINUX + MCSE 網管區
    ii. Java/ C#/C++ / Python 程式語言區
    iii. Web / javascript / node JS/ docker, Jenkins實務應用區
    iV. iOS/Android 平台開發區

    想要邀請您在 iii 實務應用JavaScript 區貢獻所學,期待您的回覆。


    支點雲端科技股份有限公司
    Vincent
    02-7725-5666 ext 13

發表迴響