為什麼要用 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 服務。
![](/static/57ed55983ff8708bf1c70a0eea1c5fbb/image-105.webp)
與 Azure App Service 相比,使用 Azure Linux VM 的優點有二,一為節省成本,二為可擁有自行客製調整空間,相對應外面的服務則是 VPS ,同樣都是透過虛擬化達到資源隔離的效果。但 VPS 少了許多雲端服務可供利用。
如果用積木來做比喻,使用 Azure 的服務,他有100個零件做排列組合,Azure 這類的雲端服務,可以搭配的工具會很多,做出來成品會比較細緻,而一般 VPS 服務,大概只有10個零件作排列組合,成品相對會粗糙一點,使用情境整體來說無絕對好壞,畢竟兩個使用情境不太相同。
言歸正傳,Azure Linux VM 安裝 WordPress 需要做好以下六大事項:
- 選擇合適的系統映像(VM image),這邊用 CentOS 8 作為範例,原因後面提
- 設定並建立 Azure VM 環境,這邊只做基本設定、網路設定即可
- 開好 Azure Linux VM 後,先更新、設定一下系統環境
- 安裝資料庫軟體(MariaDB)、PHP、網頁伺服器軟體(Nginx)這三大主要服務
- 安裝並設定 WordPress
- 開始使用 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 方案則是再多找一個外場員工來幫忙接待客人與結帳,萬一有一個人生病感冒,還可以繼續營業
![](/static/6c5c53a8987efea3ebdb2953774b93d9/crop-0-0-1030-837-0-image-107.webp)
這三種方案,相對而言,預期流量不會太高情況下,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”
![](/static/d190125683e3eaa1c9f0112f224c3681/image-70.webp)
在搜尋列中輸入”CentOS-based”後 enter 搜尋
![](/static/0eab82e3229ae0e8fd226b422164a954/image-71.webp)
找到之後,確認一下是最新的 CentOS 8.2 版,接著點選”Create”即可,這個版本可能隨著時間推進,可能會變成 8.3、8.4…依此類推,只要選最新版就對了。
![](/static/1991203f55f37e70029dc7434c297704/image-72.webp)
設定 Azure Linux VM 的基本環境
選完 Create 後,映入眼簾的是一連串 Azure VM 的相關設定,本頁面需進行以下設定:
- 建立新的 Resource group 名稱
- VM名稱(Virtual Machine name)
- 選擇區域(Region)
- 選擇大小(Size)
- 設定管理帳號(Administrator account)
![](/static/4d782101e21bbdf5a058877feaffc788/image-73.webp)
點選”Create new”後,接著輸入名稱(Name),這邊以asper-rg為例,可輸入自己方便識別的名字,完成後點選”OK”。
![](/static/0afc32b4653a2c5b29b6294d720c2c60/image-74.webp)
- 確認 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”
![](/static/4798099e047f4167b4559ce4c459235f/image-75.webp)
設定 Azure Linux VM 的磁碟
Azure Linux VM 預設會給 30G 的磁碟空間,這邊先使用預設值,不額外增加資料碟,點選”Next:Networking”進行下一步,如果有需要,價格與規格可以參考這邊,如何掛載可以參考這邊。當然額外使用資料碟,會是比較有保障與彈性的作法。
![](/static/b2064fd729cfc491de0655ff268cfef6/image-76.webp)
設定 Azure Linux VM 的網路
這邊預設值都不改動,只改”NIC network security group”,選擇”Advanced”後,再點選”Create new”即可。可以想成這是在修改防火牆的規則設定。
![](/static/9f98fdbd40fbcc92af7af8952394fb43/image-77.webp)
Network security group (NSG) 可以想成防火牆的規則,這邊要修改 ssh 的規則,與新增一條規則,先點選 “1000:default-allow-ssh”進行設定,ssh 是連接 Linux VM 重要的協定,原則上不可以給除了自己以外的電腦連接,不然被拿去做壞事可就不好玩了。
![](/static/7293be47b701aec59abf08ef3b800f3f/image-78.webp)
設定 SSH 連入規則
- Source 先選擇成”IP Addresses”後
- 再輸入你電腦連出去上網的 IP 位址,要查詢可以點我取得,將查到的 IP 位址輸入到”Source IP addresses/CIDR ranges”內,並於最後面加上”/32″,表示僅這個 IP 位址可以連線,有多組可以使用”,”隔開
e.g.:1.2.3.4/32, 2.3.4.5/32 - 修改”Priority”數字,可改為”1001″,否則會因衝突而無法儲存
- 點選”Save”儲存修改
![](/static/6077f8c3746aee35d7035be3baf62a68/image-80.webp)
設定 HTTP 與 HTTPS 連入規則
儲存後,可以發現上面的規則變了,接著再點選”Add an inbound rule”
![](/static/45038384997cebffb6eee5b2f8cd0bd9/image-81.webp)
依照下圖輸入相關資訊後,點選”add”即可
80 為 http 的 port,而 443 則是 https 的 port
簡單說,就是要讓你家的警衛室放人,不然大家都連不到你的網站
![](/static/2705962e8e484c344ea152a07ac18819/image-82.webp)
儲存 Azure Linux vm 的 NSG 設定
確認設定都沒問題後,點選”OK”
![](/static/c8010026d5b828158efbc4eae0f896e6/image-83.webp)
確認並建立 Azure Linux VM
剩下的設定使用預設值即可,接著點選”Review + create”即可
![](/static/3d32205f2e14549f62a94f36e9548cda/image-84.webp)
確認都沒問題,再點選”Create”
![](/static/a6857eefd4fa47a2c652e9f0ac8f7d7c/image-85.webp)
開始建立 VM ,可以先休息一下,等個五分鐘回來。
![](/static/a7c8f42716ce78b76ae22fa9909619e0/image-86.webp)
Azure Linux VM 部署完成可點選 Resource group 後面的名稱直接轉跳過去。
![](/static/498a6729fd9eebcb6188f9f29c44a70e/image-87.webp)
設定 Azure Linux VM DNS
Azure 有提供它內 建免費自訂 DNS 名稱,先於 Resource group 中選擇”Public IP address”這個資源
![](/static/3edb348c19cc469987c4bd1473ad3eb7/image-89.webp)
Azure 提供的 public 服務,可使用其 DNS 標籤服務,依照下圖設定,可使用以”southeastasia.cloudapp.azure.com”作結尾的 Azure 內建網域名稱,點選”Configuration”後,這邊使用”asper”,如果沒有人跟你使用到重複的名稱,請點選”Save”存檔
![](/static/46724c3f8977710ae45cb7aace8ee015/image-90.webp)
設重後,點選”Overview”,再檢查”DNS name”欄位,便可使用”asper.southeastasia.cloudapp.azure.com”進行連線
![](/static/b36106098732832461425f01f5012905/image-91.webp)
連線 到建立好的 Azure Linux VM
與 Windows 系統不太一樣,要連線到建立好的 Azure Linux VM 需透過 ssh 的通信協定連入,這邊使用一套叫做 putty 的工具來連線。先點我進到 putty 下載頁面,依自身電腦版本選擇 64-bit 或 32-bit 版,或直接點我下載 64 位元版即可。
![](/static/43ed12cacf1c0384db488bfcc5085660/image-92.webp)
下載完成後,打開出現如下畫面,輸入剛剛的連線資訊,再點選”Open”
![](/static/3ddafb849e1188d89a404cf3dd69622f/image-95.webp)
第一次連線會出現提示視窗,這邊點選”是”即可,會將相關連線資訊存放至電腦中的登錄檔
![](/static/1108ee48b64d46e08dfd0ad07d181dd4/image-96.webp)
接著輸入帳號密碼,登入終端介面
![](/static/2d6e8ad73f79bb7755decbb5422cc1be/image-97.webp)
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 安裝成功後會出現以下畫面
![](/static/fb1fa3c199e597043fac23f9b78deec2/image-98.webp)
設定 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 安裝成功後會出現以下畫面
![](/static/7e23978aab409b5482f9da8d5281d83e/image-100.webp)
設定 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 如下
![](/static/75353c4a002ae1eaa9b2d79908917191/image-101.webp)
設定 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),接著點選”傳送”
![](/static/5dd6ef0fcc524683a26306060233ffd3/image-102.webp)
接著會檢查填寫的設定有無錯誤,如無錯誤,便可點選”執行安裝程式”
![](/static/24754fd48d6ad046c4fd0b314c6e4daa/image-103.webp)
這樣便已經都安裝完成了,趕緊來測試一下 Page Speed 看看結果如何,在無任何優化的情況下,還有 93 分
![](/static/fbfff626c8fd525271767c5cbb85b25f/image-104.webp)
再次回顧,本次建置尚未包含以下內容:
- 性能優化
- https 加密連線設置
- 高可用性(商用建議,但成本會增加)
不過已經可以發現,使用 Azure Linux VM 建置 WordPress 的話,只要花約莫每月五百快六百元,便可擁有如此不錯的效能,當然跟 Linode 同規格費用相較,費用多上不少,但能直接擁有高度擴充彈性的使用環境,勢必得多付出一點代價,對於公司行號應用上,相對比較適合。