位元詩人 經營[部落格]:從頭建立 WordPress 運行環境

Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email

說明

我們先前提過,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 對網站的搜尋引擎優化 (SEO, search engine optimization) 也會加分。

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

  • 共享主機 (shared host) 或 PaaS
  • 虛機主機 (VPS, virtual private server) 或 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

網頁伺服器 (web server) 是實際和外界互動的軟體,一般多用 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,這部分將於後文說明。

關於作者

身為資訊領域碩士,位元詩人 (ByteBard) 認為開發應用程式的目的是為社會帶來價值。如果在這個過程中該軟體能成為永續經營的項目,那就是開發者和使用者雙贏的局面。

位元詩人喜歡用開源技術來解決各式各樣的問題,但必要時對專有技術也不排斥。閒暇之餘,位元詩人將所學寫成文章,放在這個網站上和大家分享。