技術部落格寫作:建立 WordPress 運行環境

PUBLISHED ON APR 29, 2018 — BLOGGING

    我們先前提過,WordPress 是 LAMP 架構風行時應運而生的產物,而 LAMP 包括以下四項軟體:

    • Linux:使用 GNU/Linux 除了著眼於其免授權費的特性,GNU/Linux 本身也是相當穩定的系統
    • Apache:市占率最高的網頁伺服器,但設定方式較複雜;近年來 Nginx 興起,可用來取代 Apache
    • MySQL:快速而免費的資料庫軟體
    • PHP:WordPress 本身是以 PHP 寫成

    目前 WordPress 的需求為

    • PHP:至少 5.2.4,建議 7.2 以上
    • MySQL:至少 5.0,建議 5.6 以上
    • 儘可能使用 HTTPS 連線

    現在很少主機的 PHP 和 MySQL 版本會這麼舊,也就是說,大部分主機的 PHP 和 MySQL 版本都能滿足 WordPress 的需求;另外,WordPress 沒有限定網頁伺服器,大多數使用者會用 Apache 或 Nginx 兩者之一。

    原先的 HTTP 傳輸是以明文傳遞,對網站使用者來說完全沒有任何隱私;使用 HTTPS 可將訊息加密,主要是著眼於安全性需求。此外,使用 HTTPS 對網站的搜尋引擎優化也會加分。

    根據安裝 WordPress 方式的不同,分為兩個情境:

    • 共享主機或 PaaS
    • VPS 或 IaaS

    在第一種情境下,LAMP 環境已經建置完成,部落客只要將 WordPress 程式碼傳到該主機即可。在第二種情形下,則需自行安裝相關軟體。本文會假設讀者使用某個 VPS,並且會安裝 LEMP (Linux-Nginx-MySQL-PHP),但其他情境也可據此來變通。

    選擇 GNU/Linux 版本

    VPS 或 IaaS 建主機時要選主機的系統,通常會是某種 GNU/Linux 發行版。根據軟體套件格式,常見的 GNU/Linux 發行版可分為以下數種:

    • DEB 系:Ubuntu、Debian
    • RPM 系:又可分為兩種
      • Red Hat 系列:CentOS、RHEL
      • SUSE 系列:openSUSE、SUSE Linux 企業版

    實際上比較常見的 VPS 系統是 Ubuntu、Debian、CentOS;筆者自己使用的經驗,DEB 系的預設軟體庫的軟體會比 RPM 系來得多,但讀者可自行選喜好的版本。RHEL 需要另繳授權費,除了需要 Red Hat 的企業支援,直接選 CentOS 即可。而 SUSE 系則是近年來使用者基數較少,有些主機商不會提供。

    筆者在本文中會用 Ubuntu 16.04 來展示軟體安裝過程,讀者可用本地端的虛擬機或開一個最便宜的遠端主機來練習。

    安裝 Nginx

    網頁伺服器是實際和外界互動的軟體,一般多用 Apache 或 Nginx 兩者之一。這裡我們安裝 Nginx:

    $ sudo apt-get install nginx
    

    安裝 MySQL

    WordPress 網站是動態網站,需要資料庫來存資料;WordPress 需搭配 MySQL (或 MariaDB)。在這裡我們安裝 MySQL:

    $ sudo apt-get install mysql-server
    

    通常會建議在安裝 MySQL 後立即執行 mysql_secure_installation 以增加資料庫的安全性:

    $ sudo mysql_secure_installation
    

    系統會詢問是否要驗證 MySQL 的密碼,如果選是的話會加入相關的 plugin:

    VALIDATE PASSWORD PLUGIN can be used to test passwords
    and improve security. It checks the strength of password
    and allows the users to set only those passwords which are
    secure enough. Would you like to setup VALIDATE PASSWORD plugin?
    
    Press y|Y for Yes, any other key for No:
    

    驗證方式由弱至強有三個等級,讀者可依自己需求來選擇:

    There are three levels of password validation policy:
    
    LOW    Length >= 8
    MEDIUM Length >= 8, numeric, mixed case, and special characters
    STRONG Length >= 8, numeric, mixed case, special characters and dictionary
    file
    
    Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 1
    

    是否要去除匿名使用者,通常都選是 y

    Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
    

    是否要禁止 root 遠端登入系統,通常都選是 y

    Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
    

    是否要移除測試用資料庫,通常都選是 y

    Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
    

    之後就可以繼續使用 MySQL 資料庫。

    安裝 PHP

    由於 Nginx 本身無法處理 PHP,還要另外安裝 PHP FastCGI Process Manager (FPM),將 PHP 程式碼交由 CGI 程式來處理;另外,我們也安裝 PHP 所用的 MySQL 模組:

    $ sudo apt-get install php-fpm php-mysql
    

    安裝好後,我們稍微調整一下 php.ini 設定檔:

    $ sudo nano /etc/php/7.0/fpm/php.ini
    

    找出這個項目,將其設為 0,對系統來說較安全:

    cgi.fix_pathinfo=0
    

    接著,重新啟動 PHP FPM 模組:

    $ sudo systemctl restart php7.0-fpm
    

    調整 Nginx 設定,將 PHP 命令稿導向 PHP FPM 模組:

    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.0-fpm.sock;
        }
    
        location ~ /\.ht {
            deny all;
        }
    }
    

    接著,重新啟動 Nginx 伺服器:

    $ sudo systemctl restart nginx
    

    測試 PHP

    我們撰寫一個簡單的 PHP 命令稿來測試系統是否正常運作:

    $ sudo nano /var/www/html/info.php
    

    在此命令稿中,我們呼叫 phpinfo() 函式來顯示系統上的 PHP 相關設定:

    <?php
    phpinfo();
    

    如果系統正常運作,打開網址可以看到以下內容:

    PHP info 示例

    我們當然不希望駭客也看到這麼清楚的系統訊息,測試完後記得將命令稿刪除:

    $ sudo rm /var/www/html/info.php
    

    當系統設置成功後,就可以安裝 WordPress,這部分將於後文說明。