Azure Linux VM 建置 WordPress 完全攻略

為什麼要用 Azure Linux VM 建置 WordPress

Azure Linux VM 為 Azure 中的 IaaS 服務,而會使用 Azure Linux VM 建置 WordPress 主要原因如下:

  • 省錢,當然也有其他更省錢的非雲端方案選擇
  • 有高度使用彈性與客製化的空間(充份享受 DIY 的樂趣)
  • 與自家公司雲端整合成單一平台管理

想像一下如果今天要開餐廳,使用 Azure App Service 的服務,會提供店面、廚房、基本裝潢、結帳系統,店主只要專心做菜跟出餐就好,而 Azure Linux VM 則是只有給一間店面,剩下的裝潢擺設、廚房規劃、結帳系統…等,都要自己搞定,才能開張營業,但相對也比較能依照需求,客製化做出自己風格的餐廳。

下圖為使用 Azure App Service 與 Azure Linux VM 的比較圖,黃框為 Azure 所提供的服務,使用 Azure Linux VM 架 WrodPress 的話,系統管理、服務管理都要自己來,而 Azure App Service 則是只要專心使用 WordPress 的服務即可。用術語來說,Azure App Service 為 PaaS 服務,而 Azure Linux VM 為 IaaS 服務。

Azure App Service 與 Azure Linux VM 比較

與 Azure App Service 相比,使用 Azure Linux VM 的優點有二,一為節省成本,二為可擁有自行客製調整空間,相對應外面的服務則是 VPS ,同樣都是透過虛擬化達到資源隔離的效果。但 VPS 少了許多雲端服務可供利用。

如果用積木來做比喻,使用 Azure 的服務,他有100個零件做排列組合,Azure 這類的雲端服務,可以搭配的工具會很多,做出來成品會比較細緻,而一般 VPS 服務,大概只有10個零件作排列組合,成品相對會粗糙一點,使用情境整體來說無絕對好壞,畢竟兩個使用情境不太相同。

言歸正傳,Azure Linux VM 安裝 WordPress 需要做好以下六大事項:

  1. 選擇合適的系統映像(VM image),這邊用 CentOS 8 作為範例,原因後面提
  2. 設定並建立 Azure VM 環境,這邊只做基本設定、網路設定即可
  3. 開好 Azure Linux VM 後,先更新、設定一下系統環境
  4. 安裝資料庫軟體(MariaDB)、PHP、網頁伺服器軟體(Nginx)這三大主要服務
  5. 安裝並設定 WordPress
  6. 開始使用 WordPress 寫文章

看起來好像很複雜,不過魔鬼都在這細節裡面,要用最低成本,榨出最高效能,關鍵在第4.步驟中的調校,如 Cloudway 表示有針對 各CMS 平台調教相關參數,只要使用他們的服務,就能輕鬆擁有這些功能。
另外,本篇教學暫時不會教到效能調教與 https 憑證安裝,雖然他們很重要,讓大家先體會一下怎麼把一個 WordPress 從無到有,徒手架好的感覺抓到再說。

本次 WordPress on Azure Linux 使用的架構

如前所述,使用 Azure 這類雲端服務,可規劃出的架構有許多種類,這邊舉三個常見的例子,本次使用的架構為 A 架構,也是一般在外常見 VPS 使用的做法,下面將針對各類架構進行說明:

A: All-in-one 的做法,將所有服務集中於單一 VM 上
B:將資料庫獨立出來,降低單一主機負擔,使用 Azure 原生的資料庫服務(Azure Database for MariaDB),或自己開一台 Azure Linux VM 安裝 MariaDB 服務也是一種做法
C:使用 B 的做法外,另外加上一台 WordPress 的服務主機,總共三台 VM,不過要處理兩台 WordPress 間資料同步問題,此種架構較能平均分散掉主機負擔

看起來好像很難理解,還是用開店比喻,A 方案是在開餐廳的初期,餐廳不大,但麻雀雖小,五臟俱全,要出餐、要接待送餐等工作,一個人要扛所有客人,會很辛苦。而 B 方案則是把工作分成內場跟外場,內場專心出餐,外場專心點餐與結帳,而 C 方案則是再多找一個外場員工來幫忙接待客人與結帳,萬一有一個人生病感冒,還可以繼續營業

這三種方案,相對而言,預期流量不會太高情況下,A 方案適合用於架站初期,而 B 則為流量變有點大了,且資料庫出現效能瓶頸,因此將資料庫服務,與 WordPress 網站服務分離,C 則為有一定數量的使用者,需要多開一台網站服務 VM 來分攤流量,並可降低單一 VM 在維護期間、意外無法正常使用其況下,造成服務中斷的成本。

當然還有一些進階的作法,如將上傳的圖片,統一放到 Azure Blob Storage 服務中,藉此降低主機的負擔,且又能節省硬碟使用空間…等許多玩法。

建立 Azure Linux VM – 以 CentOS 8 為例

如果有看過 Azure App Service 建置 WordPress 完全攻略的話,有經驗的網站建置或管理人員,可以發現 Azure App Service 幫我們做掉很多事情,只要透過滑鼠點一點,一套乾淨的 WordPress 網站就這樣架好了。接下來要實作的,是更進階的 Azure VM 建置 WordPress 教學,此外,再次說明,本教學尚不包含效能調校與 https 功能,本篇目的為體驗徒手打造 WordPress 網站,至於效能調校將是另一個領域了。

這邊將使用 Azure Linux VM 進行建置,為什麼要用 Linux 呢?前面有提過一些因素,其實最主要原因只有一個,省錢。使用 Windows 的 VM 環境,會需要額外支付一筆授權費用,因此這邊選擇使用 Linux 中的 CentOS 8 作為 WordPress 的家。

Azure 平台選擇 CentOS 8 VM image

登入 Azure 後一樣也是選擇 “Create a resource”

選擇 “Create a resource”

在搜尋列中輸入”CentOS-based”後 enter 搜尋

搜尋 CentOS 8 的系統 image

找到之後,確認一下是最新的 CentOS 8.2 版,接著點選”Create”即可,這個版本可能隨著時間推進,可能會變成 8.3、8.4…依此類推,只要選最新版就對了。

確認 CentOS 8 的 Plan 是最新版的以後,再 Create

設定 Azure Linux VM 的基本環境

選完 Create 後,映入眼簾的是一連串 Azure VM 的相關設定,本頁面需進行以下設定:

  • 建立新的 Resource group 名稱
  • VM名稱(Virtual Machine name)
  • 選擇區域(Region)
  • 選擇大小(Size)
  • 設定管理帳號(Administrator account)
建立 Azure Linux VM 基本設定 1

點選”Create new”後,接著輸入名稱(Name),這邊以asper-rg為例,可輸入自己方便識別的名字,完成後點選”OK”。

建立 Resource group 並取名
  • 確認 Resource group 出現的名稱是否正確
  • 輸入 Virtual machine name,這邊輸入 asper-wordpress 做為示範,一樣也是挑選自己方便識別的名稱即可
  • Region 選擇 Southeast Asia (新加坡機房),如果要更省錢,可以選 East US 機房,只是連線可能就會因距離關係,會比較慢一些
  • 確認 image 是否為 CentOS-based 8.2 (如有新版,請選最新版本)
  • Size 部分,選擇 Standard_B1ms 即可,想要小一點,或大一點,都可以嘗試看看
  • 管理帳號驗證方式,這邊使用 Password 即可,再輸入帳號密碼
  • Public inbound port 先選擇 None,等後面再設定

以上都沒問題後,點選”Next:Disks”

建立 Azure Linux VM 基本設定 2

設定 Azure Linux VM 的磁碟

Azure Linux VM 預設會給 30G 的磁碟空間,這邊先使用預設值,不額外增加資料碟,點選”Next:Networking”進行下一步,如果有需要,價格與規格可以參考這邊,如何掛載可以參考這邊。當然額外使用資料碟,會是比較有保障與彈性的作法。

Azure Linux VM 磁碟設定

設定 Azure Linux VM 的網路

這邊預設值都不改動,只改”NIC network security group”,選擇”Advanced”後,再點選”Create new”即可。可以想成這是在修改防火牆的規則設定。

Azure Linux VM 網路設定

Network security group (NSG) 可以想成防火牆的規則,這邊要修改 ssh 的規則,與新增一條規則,先點選 “1000:default-allow-ssh”進行設定,ssh 是連接 Linux VM 重要的協定,原則上不可以給除了自己以外的電腦連接,不然被拿去做壞事可就不好玩了。

修改 Network security group 的 ssh 規則

設定 SSH 連入規則

  1. Source 先選擇成”IP Addresses”後
  2. 再輸入你電腦連出去上網的 IP 位址,要查詢可以點我取得,將查到的 IP 位址輸入到”Source IP addresses/CIDR ranges”內,並於最後面加上”/32″,表示僅這個 IP 位址可以連線,有多組可以使用”,”隔開
    e.g.:1.2.3.4/32, 2.3.4.5/32
  3. 修改”Priority”數字,可改為”1001″,否則會因衝突而無法儲存
  4. 點選”Save”儲存修改
設定 SSH 連入規則

設定 HTTP 與 HTTPS 連入規則

儲存後,可以發現上面的規則變了,接著再點選”Add an inbound rule”

新增 NSG 規則

依照下圖輸入相關資訊後,點選”add”即可
80 為 http 的 port,而 443 則是 https 的 port
簡單說,就是要讓你家的警衛室放人,不然大家都連不到你的網站

設定 web server 規則

儲存 Azure Linux vm 的 NSG 設定

確認設定都沒問題後,點選”OK”

儲存 NSG 的設定

確認並建立 Azure Linux VM

剩下的設定使用預設值即可,接著點選”Review + create”即可

選擇” Review + create”

確認都沒問題,再點選”Create”

建立 VM 確認

開始建立 VM ,可以先休息一下,等個五分鐘回來。

Azure VM 部署中

Azure Linux VM 部署完成可點選 Resource group 後面的名稱直接轉跳過去。

Azure Linux VM 部署完成

設定 Azure Linux VM DNS

Azure 有提供它內建免費自訂 DNS 名稱,先於 Resource group 中選擇”Public IP address”這個資源

選擇 resource group public IP address 資源

Azure 提供的 public 服務,可使用其 DNS 標籤服務,依照下圖設定,可使用以”southeastasia.cloudapp.azure.com”作結尾的 Azure 內建網域名稱,點選”Configuration”後,這邊使用”asper”,如果沒有人跟你使用到重複的名稱,請點選”Save”存檔

設定 Azure DNS

設重後,點選”Overview”,再檢查”DNS name”欄位,便可使用”asper.southeastasia.cloudapp.azure.com”進行連線

確認 DNS 設定成功

連線到建立好的 Azure Linux VM

與 Windows 系統不太一樣,要連線到建立好的 Azure Linux VM 需透過 ssh 的通信協定連入,這邊使用一套叫做 putty 的工具來連線。先點我進到 putty 下載頁面,依自身電腦版本選擇 64-bit 或 32-bit 版,或直接點我下載 64 位元版即可。

putty 下載頁面

下載完成後,打開出現如下畫面,輸入剛剛的連線資訊,再點選”Open”

putty 連線

第一次連線會出現提示視窗,這邊點選”是”即可,會將相關連線資訊存放至電腦中的登錄檔

putty 第一次連線告警

接著輸入帳號密碼,登入終端介面

Azure Linux VM 系統初始化

登入後,先切換到 root 最高權限使用者,使用以下 init.sh 腳本,安裝必要套件,執行完後會自動重開機,這邊安裝的是一些個人常用的套件工具

切換至 root 需輸入以下指令即可,之後登入後,均需輸入下面指令後按 enter

sudo su -

輸入完指令後,別忘了記得 enter 確保順利執行

cat  >> init.sh << EOF
#!/bin/bash
# Install essential package & update
yum install epel-release -y
yum install mailx postfix openssh-clients rsync xinetd ftp man vim-enhanced screen telnet net-tools wget mlocate bind-utils glances lsof tmux zip unzip p7zip nload iotop yum-utils -y
yum update -y
chmod +x /etc/rc.d/rc.local
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/sysconfig/selinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
systemctl disable firewalld
timedatectl set-timezone Asia/Taipei
reboot
EOF

sh init.sh

執行之後,會重開機斷線,斷線後等候 5 分鐘後重新連線即可

安裝 Nginx 網頁伺服器

這邊我們要安裝最新版的 Nginx 網頁伺服器,請輸入以下指令

cat >> /etc/yum.repos.d/nginx.repo << EOF

[nginx-stable]

name=nginx stable repo baseurl=http://nginx.org/packages/centos/\$releasever/\$basearch/ gpgcheck=0 enabled=1 module_hotfixes=true EOF yum-config-manager –enable nginx-stable dnf install -y nginx

Nginx 安裝成功後會出現以下畫面

Nginx 安裝成功

設定 Nginx

cd /etc/nginx/conf.d/
mv default.conf default.conf.bak

在執行之前,如果不知道 vi 這個指令如何使用,請點我參考。
簡單說明作法,輸入 vi /etc/nginx/conf.d/wordpress.conf 後,要按一下鍵盤上的 i 進入輸入模式,再把下面那一段設定貼上後,再按 esc 鍵,再按住 shift 後,按兩次 z 鍵存檔離開。
還是不懂的話,可以參考這個 youtube 影片教學。

使用 vi /etc/nginx/conf.d/wordpress.conf 編輯設定

server {
    listen 80;
    listen [::]:80;
    server_name _;
    root /var/www/wordpress;
    index index.php;

location ~ \.php$ {
    try_files $uri =404;
    fastcgi_intercept_errors on;
    fastcgi_index  index.php;
    include        fastcgi_params;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    fastcgi_pass   php-fpm;

    }

}

安裝 MariaDB 資料庫

這邊我們要安裝最新版的 MariaDB 資料庫,請輸入以下指令

cat >> /etc/yum.repos.d/mariadb.repo << EOF
# MariaDB 10.5 CentOS repository list - created 2020-07-24 13:32 UTC
# http://downloads.mariadb.org/mariadb/repositories/

[mariadb]

name = MariaDB baseurl = http://yum.mariadb.org/10.5/centos8-amd64 module_hotfixes=1 gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck=1 EOF dnf install -y MariaDB-server MariaDB-client systemctl stop mariadb

MariaDB 安裝成功後會出現以下畫面

MariaDB 安裝成功

設定 MariaDB 資料庫使用字元(character set)

輸入以下指令進行設定使用 utf8mb4 編碼,為什麼要這樣設定呢?使用這個資料庫編碼,便可使用特殊字而不容易出現亂碼。
參考資料1參考資料2

cat >> /etc/my.cnf.d/utf8mb4.cnf << EOF

[client]

default-character-set=utf8mb4

[mysql]

default-character-set=utf8mb4

[mysqld]

character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci init_connect = ‘SET NAMES utf8mb4’ character-set-client-handshake = false EOF systemctl restart mariadb mysql -uroot -e ‘status’

MariaDB 資料庫設定成功會出現 utf8mb4 如下

MariaDB 資料庫設定成功

設定 MariaDB 資料庫連線權限

編輯設定腳本cd ~ && vi db_config.sh ,可以修改 DB_PASSWPRD 中的密碼成為自己的密碼

#!/bin/sh
HOSTNAME=`hostname`
# enter your root password here
DB_PASSWORD=root

systemctl start mariadb
# delete unuse User
mysql -uroot -e "DROP USER 'root'@'${HOSTNAME}';"
mysql -uroot -e "DROP USER ''@'${HOSTNAME}';"
mysql -uroot -e "DROP USER ''@'localhost';"
mysql -uroot -e "DROP USER 'root'@'::1';"

# create WordPress DB
mysql -uroot -e "CREATE DATABASE wordpress CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;"

# create remote user
mysql -uroot -e "CREATE USER 'root'@'%' IDENTIFIED BY '${DB_PASSWORD}';"
mysql -uroot -e "GRANT ALL privileges ON *.* TO 'root'@'%';"

# create password for root
mysql -uroot -e "FLUSH PRIVILEGES;"
mysql -uroot -e "SET PASSWORD FOR 'root'@'127.0.0.1' = PASSWORD('${DB_PASSWORD}');"
mysql -uroot -e "SET PASSWORD FOR 'root'@'localhost' = PASSWORD('${DB_PASSWORD}');"

執行腳本,輸入sh db_config.sh,接著再輸入以下指令啟動服務

systemctl restart mariadb.service
systemctl enable mariadb.service

安裝 PHP 套件

輸入以下指令進行安裝最新版之 php 套件

dnf install -y dnf-utils http://rpms.remirepo.net/enterprise/remi-release-8.rpm
dnf module reset php
dnf module enable -y php:remi-7.4
dnf install -y php php-mysqlnd php-mbstring php-json php-pecl-zip php-json php-gd

設定 php-fpm 相關設定

備份原始設定

cp /etc/php-fpm.d/www.conf /etc/php-fpm.d/www.conf.bak

修改 php-fpm 使用者為 nginx vi /etc/php-fpm.d/www.conf 將原本的 apache 改為 nginx

; RPM: apache user chosen to provide access to the same directories as httpd
user = nginx
; RPM: Keep a group allowed to write in log dir.
group = nginx

設定 php 時區

修改設定檔,調整 date.timezone 為 "Asia/Taipei"

vi /etc/php.ini
[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = "Asia/Taipei"

完成後輸入以下指令重啟服務

systemctl restart php-fpm nginx

下載 WordPress 並設定安裝

wget https://wordpress.org/latest.tar.gz
tar zxvf latest.tar.gz
mv wordpress /var/www/
find /var/www/ -type d -exec chmod 2775 {} \;
find /var/www/ -type f -exec chmod 664 {} \;
chown nginx. -R /var/www/wordpress

接著就可以開啟瀏覽器,輸入http://OOO.southeastasia.cloudapp.azure.com
網址便可開始安裝 WordPress 了,這邊輸入之前腳本中設定的資料庫密碼(DB_PASSWPRD),接著點選”傳送”

WordPress 資料庫設定

接著會檢查填寫的設定有無錯誤,如無錯誤,便可點選”執行安裝程式”

WordPress 確認安裝

這樣便已經都安裝完成了,趕緊來測試一下 Page Speed 看看結果如何,在無任何優化的情況下,還有 93 分

Page Speed 測試結果

再次回顧,本次建置尚未包含以下內容:

  • 性能優化
  • https 加密連線設置
  • 高可用性(商用建議,但成本會增加)

不過已經可以發現,使用 Azure Linux VM 建置 WordPress 的話,只要花約莫每月五百快六百元,便可擁有如此不錯的效能,當然跟 Linode 同規格費用相較,費用多上不少,但能直接擁有高度擴充彈性的使用環境,勢必得多付出一點代價,對於公司行號應用上,相對比較適合。


© 2023