建立 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”

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

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

設定 Azure Linux VM 的基本環境
選完 Create 後,映入眼簾的是一連串 Azure VM 的相關設定,本頁面需進行以下設定:
- 建立新的 Resource group 名稱
- VM名稱(Virtual Machine name)
- 選擇區域(Region)
- 選擇大小(Size)
- 設定管理帳號(Administrator account)

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

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

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

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

設定 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”儲存修改

設定 HTTP 與 HTTPS 連入規則
儲存後,可以發現上面的規則變了,接著再點選”Add an inbound rule”

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

儲存 Azure Linux vm 的 NSG 設定
確認設定都沒問題後,點選”OK”

確認並建立 Azure Linux VM
剩下的設定使用預設值即可,接著點選”Review + create”即可

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

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

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

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

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

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

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

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

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

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

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
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 資料庫使用字元(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 資料庫連線權限
編輯設定腳本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),接著點選”傳送”

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

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

再次回顧,本次建置尚未包含以下內容:
- 性能優化
- https 加密連線設置
- 高可用性(商用建議,但成本會增加)
不過已經可以發現,使用 Azure Linux VM 建置 WordPress 的話,只要花約莫每月五百快六百元,便可擁有如此不錯的效能,當然跟 Linode 同規格費用相較,費用多上不少,但能直接擁有高度擴充彈性的使用環境,勢必得多付出一點代價,對於公司行號應用上,相對比較適合。