如何搬移 cPanel WordPress 網站到 Bitnami Google Cloud Platform

cpanel wordpress bitnami gcp logos

如果覺得文長的話這裡有精簡版

「如非必要,勿增實體」是這篇文章的重點,也是最終挑選 Bitnami 做為網站主機的原因。

Bitnami 是針對網頁應用在各種不同平台部署的解決方案,專責在網頁應用,針對網站,網頁伺服器最佳化,不用花太多心思調整設定與網頁無關的的應用,以穩定可靠聞名的 Debian Linux 為核心,用佔用資源少效能高的 Nginx 做為網頁伺服器,背後還有 VMware 靠山。

雖然自行安裝 Linux 再啟用 Apache、MySQL 、PHP 也一樣 ,但重點不在要安裝的東西,而是「不需要安裝的東西」。個別安裝除了要做一堆設定外,還會安裝啟用太多不相關的套件或服務,想停用或移除又怕影響相依性,使得資源被無效佔用。

但也要提醒一下,自有主機維護除錯都要靠自己,如果興趣或專業跟這行不相關,網站最好還是交給有技術支援的主機商代管,出問題才有人可以處理。畢竟主機商是靠解決你的問題在賺錢,而你是賠賤(時間)在維護主機,省不了多少錢卻賠上更多時間跟精力,未必划算。


建立 GCP VM 主機(執行個體/Instance)

💡後續操作建議使用 Chrome 瀏覽器,除了比較快,其它瀏覽器可能會有跑版的問題,或是功能位置略有不同,但大至上也沒什麼太大問題。

GCP 的架構階層為:

Google 帳號 / GCP / 專案(Project) / 服務


新增主機的步驟基本上就是一路往架構階層內設定。

進入 Google Cloud Platform (以下簡稱 GCP)

點擊免費試用並登入 Google 帳號。

如果平時有在使用 Google 服務(如 Gmail),有很大的可能己經是在登入狀態。

右上角顯示大寫字母代表己登入 Google 帳號狀態。

如果不想與私人帳號混淆使用,或單純只想測試,可先登出註一個新的 Google 帳號,再用新帳號登入。

之後照步驟提示啟用 GCP 服務

最後一個步驟 [驗證付帳資訊]會要求輸入信用卡資訊,這部份單純只做真人誠意驗證,除非開啟計費功能,不會收取任何費用。

💡不想用信用卡又想免費使用的話,也許可以用 VISA 簽帳金融卡(印有 VISA 的提款卡)來代替信用卡。

啟用 GCP 後,上方藍色列顯示 My First Project ▾ 的地方代表目前所在專案。My First Project 只是預設的空白專案,可以直接使用,建立新的亦可。

這裡選擇建立新專案

  • 專案名稱僅供識別,可隨時更改。
  • 專案 ID 必需是平台上獨一無二的 ID,有人使用就不能再命名相同的專案 ID,且只接受小寫英數加連字號(-),決定好就不能變更,視情況更改,沒特別需要更改就直接按建立就好。

啟用 Compute Engine API,建立好就會直接切換到該專案上了。

在搜尋列輸入 bitnami wordpress,點選 [ WordPress Certified by Bitnami and Automattic ]並按啟動

啟用相依的 API

建立 Bitnami VPS 主機

這個步驟簡單的講,就是在組裝一台電腦,配置的高底決定每月收取的費用,也是付費與免費的關鍵。

主機的費用取決於資料中心所在地,同樣規格在不同地區費用就不一樣,比如日本或香港費用都比台灣再略高一些;再來才是硬體規格(平台、記憶體大小、儲存裝置種類及容量),

不同需求會有不同配置考量,內容網站就要考量把主機放在最靠近受眾位置的資料中心,反應快 SEO 才會漂亮。

以我自己舉例,主要流量來源加上自己本身都在台灣,主要受眾是亞洲中文世界,台灣又是東亞的樞紐,就選擇 asia-east1 台灣彰化機房。因為網站流量不高,選最低階的 CPU 及最小的 RAM,儲存裝置則是選用 SSD 再進一步提高反應時間。

如果無論如何就是要免費,可以參考 Google Cloud 免費計畫,只要建立的主機符合表格裡的條件,主機 (執行個體 / VM主機)就可以一直免費使用。

Zone
  • us-west1 (奧勒岡州)
  • us-central1 (愛荷華州)
  • us-east1 (南卡羅來納州)
這幾個資料中心都免費,每個資料中心都再細分abc三個主機,僅供識別。任一主機都免費,含 IP。
Machine Type系列: E2
機器類型: e2-micro
 
Boot Disktype: Standard Persistent Disk
size in GB: 10
30G以下都免費。

⚠️輸出流量 1G/月 免費有個但書是不包含中國及澳洲,也就是說,只要有往澳洲或中國的流量會直接計費,且比其他國家貴一些。

💡

1. 每月 1G 的流量說實在真的很少,我有二個網站,一個微米站一個奈米站,都以文字為主,圖少且都寄存 wp.com 分流。奈米站約150 pageview/月,流量約 500MB/月 左右;微米站約 100 pageview/月,流量約 1.2GB/月 左右,只要預期會超過以上的訪問量,很容易就收流量費用,但主機與與儲存空間仍是免費,總費用仍是很低。

2. 如果目標訪客在台灣或東亞,以地理位置來說我會建議 us-west1,除了地理位置最近外,同時又是最靠近資訊最發達的美國西岸及東亞。

右側的預估費是沒有折扣的牌價,等試用期結束轉正式帳單,只要沒超過使用量就不會扣款。

決定好配置後,按部署建立主機。

部署環境

完成後右方會顯示如下登入資訊,可以先複製備份起來。

此頁隨時可以到 導覽選單 > Deployment Manager > [名稱] 回來查看

其中 Admin Password,除了是 WordPress 預設登入密碼,也是 phpMyAdmin root 密碼。這裡先不用急著改 wordpress 密碼,後續網站移轉過來就會覆蓋掉,目前還不需要登入。

先開啟 site address 連結測試一下,一切正常就會看到 WordPress 的 Hello World 預設頁面。

打開左側導覽選單 > 虛擬私有雲網路(VPC Network) > 外部 IP 位址(External IP) > 按保留,取個名字先把 IP 固定下來

IP 類型就會從 [臨時] 變成 [靜態](Static IP)。

GCP 設定的部分先到這邊告一段落。


遷移、調整與設定

就實測,只要從 cPanel 下載以下二個資料就能完美搬家。

  •  public_html  (wordpress 網頁根目錄)
  • MySQL 資料庫

備份下載 cPanel 端資料

先到 WordPress 控制台更新頁面,把該更新的都更新一遍,確保網站在最新狀態。

更新完成後,開啟 cPanel > 檔案管理員(File Manager) > 滑鼠右鍵點右邊 public_html目錄 > Compress > 格式選 [GZiped Tar 封存] > Compress Files

開啟 cPanel > 檔案管理員(File Manager) > 滑鼠右鍵點右邊 public_html > Compress
格式選 [GZiped Tar 封存] > Compress Files

 

打包壓縮好後,檔案會放在同一個目錄,滑鼠右鍵點選 public_html.tar.gzDownload

下載資料庫

到 cPanel > 備份 > 下載 [MySQL] 資料庫

直接右鍵點選下載連姞檔案

💡如果網站的互動頻繁,建議網站先切換到維護模式再下載,免得網站遷移後內容不同步。

回到 GCP 控制台登入訊息頁面,點擊下方 SSH ,開啟 GCP 的 SSH 連線,進入 Bitnami 主機

瀏覽器模擬終端機(SSH-IN-BROWSER)登入

點擊⬆︎上傳檔案 ,選擇剛從 cPanel 下載的 [public_html.tar.gz],把檔案上傳到 Bitnami 主機。

在終端機輸入tar -zxvf ~/public_html.tar.gz解壓上傳的檔案

💡

  1. 如果瀏覽器有開啟阻擋彈出視窗,瀏覽器模擬終端機會被擋住打不開。
  2. 如果主機與使用者之間的地理位置比較遠,終端機指令操作會感覺到些許延遲。(台灣到 us-west1機房約 130ms)

備份、取代 Bitnami 預設資料及修改檔案權限

這部分看似操作指令比較多,但實際主要是針對以下二個資料夾做備份及權限屬性修改。
/opt/bitnami/wordpress : wordpress根目錄(等於原網站的 /public_html)
/bitnami/wordpress : 存放 wp-config.php 及 wp-content/

💡後來去了解一下,wp-config.php 及 wp-content/ 與 wordpress 根目錄分開的用意是為避免直接曝露在網路。


#把 Bitnami 預設的 wordpress 目錄用改名的方式備份
sudo mv /opt/bitnami/wordpress /opt/bitnami/wordpress.bak
sudo mv /bitnami/wordpress/wp-config.php /bitnami/wordpress/wp-config.php.bak
sudo mv /bitnami/wordpress/wp-content/ /bitnami/wordpress/wp-content.bak/
#
#原主機 wordpress 目錄(public_html)移到 Bitnami 對應的目錄結構
sudo cp -pnr ~/public_html /opt/bitnami/wordpress
sudo mv /opt/bitnami/wordpress/wp-content /bitnami/wordpress/wp-content
sudo mv /opt/bitnami/wordpress/wp-config.php /bitnami/wordpress/wp-config.php
#
#修正權限屬性
cd /opt/bitnami
sudo find wordpress/ -type d -exec chmod 775 {} \; #底下所有目錄權限都改 775
sudo find wordpress/ -type f -exec chmod 664 {} \; #底下所有檔案權限都改 664
sudo chown -R bitnami:daemon wordpress/ #底下所有帳號群組都改 bitnami:daemon
#
sudo cp -pnr /opt/bitnami/wordpress.bak/wp-config.php /opt/bitnami/wordpress/wp-config.php
sudo cp -pnr /opt/bitnami/wordpress.bak/wp-content /opt/bitnami/wordpress/wp-content
#
cd /bitnami/wordpress
sudo chmod 640 wp-config.php
sudo find wp-content/ -type d -exec chmod 775 {} \;
sudo find wp-content/ -type f -exec chmod 664 {} \;
sudo chown -R bitnami:daemon wp-config.php wp-content/

匯入 MySQL 資料庫

在匯入之前,先取得 DB NAME、DB USER、DB PASSWORD 三個資訊,並把紅字的部分記下來。

sudo grep -E 'DB_NAME|DB_USER|DB_PASSWORD' /bitnami/wordpress/wp-config.php
define('DB_NAME', 'cpaneldbname_wp1');
define('DB_USER', 'dbusername_wp1');
define('DB_PASSWORD', 'M&pma;)6Xr9xOH48[]2');

💡亦或直接查看編輯 wp-config.php 檔,看裡面有沒有 cPanel 殘留路徑

/home/帳號/public_html/,有的話把它改成 /opt/bitnami/wordpress/

用 SSH 建立 localhost tunnel 登入 phpMyAdmin

由於 phpMyAdmin 只能透過本機存取,必需利用 SSH 先建立模擬本機連線的 localhost tunnel,才能進入 phpMyAdmin 管理頁面。

# 建立 SSH 連線用的公鑰及私鑰
ssh-keygen -t rsa -f ~/.ssh/mysite -C gcpuser -b 2048
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): #直接 enter 不設密碼
Enter same passphrase again: #再按一次 enter 確認
Your identification has been saved in /Users/david/.ssh/mysite.
Your public key has been saved in /Users/david/.ssh/mysite.pub.
The key fingerprint is:
SHA256:AzZujBfi0QWERZipPOGeazTxJKYSTv6thUjjhieW9ug gcpusername
The key's randomart image is:
+---[RSA 2048]----+
|.=#=o            |
|=&.*             |
|*o@ o +          |
|.D.B P p         |
|o+O + C T        |
|o=o  =   .       |
| . ..            |
|.                |
| F               |
+----[SHA256]-----+
  • 綠色字為公鑰(public key)及私鑰(private key)的主檔名,可任意命名,建議可以用主機名或網站名方便識別。
  • 紅色字為登入帳號,忘記 SSH 帳號可回頭用 SSH-IN-BROWSER 登入查看
  • 標記的地方是密鑰存放位置。

回到 GCP console,打開導覽選單 > Compute Engine > VM 執行個體 (VM Instance) > 左側下方[中繼資料/Metadata] > 安全殻層金鑰 (ssh keys) > [編輯] > 新增項目

密鑰存放位置,用純文字編輯器開啟剛建立的公鑰檔mysite.pub,全選複製貼上裡面的密文儲存起來。

這時開啟本機的終端機,輸入以下指令,並把紅字的地方改為上面登入資訊的 site address IP

ssh -N -L 8888:127.0.0.1:80 -i ~/.ssh/mysite gcpuser@site address IP

就會與遠端的 GCP Bitnami 主機建立 localhost tunnel,終端機沒反應就代表連線中,按 Ctrl+C 或關閉終端機就可以結束連線,先保持開啟。

💡網站搬移成功後,未來如果還有需要登入 phpMyAdmin,port 80 要改為 443 才能登入。

建立資料庫與帳號

開啟網址http://localhost:8888/phpmyadmin 進入 phpmyAdmin 登入頁面,帳號填 root,密碼填 wordpress 的 admin password。

匯入原網站的 mysql.sql 資料庫檔

資料庫新增資料庫,資料庫名稱輸入從 DB_NAME 撈出的名稱
選 [匯入] 上傳剛下載的 MySQL 資料庫檔案,選好後按執行
點選上方 使用者帳號 > 新增使用者帳號
  • 使用者名稱輸入 DB_USER 紅字的部分
  • 使用者密碼輸入 DB_PASSWORD 紅字的部分

把以下幾個權限打勾,再到最下面按 執行

ALTER
CREATE
CREATE TEMPORARY TABLES
DELETE
EVENT
INDEX
LOCK TABLES
SELECT
TRIGGER
ALTER ROUTINE
CREATE ROUTINE
CREATE VIEW
DROP
EXECUTE
INSERT
REFERENCES
SHOW VIEW
UPDATE

變更 DNS

回到 cPanel > 網域 > Zone Editor > [管理/Management]

編輯主網域類型A(type A / A record)那一行,把 IP 改為 GCP 主機的 IP

套用後很快就生效。(修改之前先把原本的 IP 記下來,以防有需要連回舊主機)

💡如果有需要臨時連回舊主機,可以修改本機的 hosts 檔,參考別行的格式,新增一行DNS修改前的IP,儲存後立即生效。

hosts 檔存放位置:

macOS:/private/etc/hosts
Windows:C:WINDOWSsystem32driversetchosts

更新申請網站 Let’s Encrypt 免費 SSL 憑證並自動更新

在 Bitnami 主機執行sudo /opt/bitnami/bncert-tool

整個操作過程及說明:

sudo /opt/bitnami/bncert-tool
# 有出現這段訊息的話代表有新版,按[Y]更新,沒出現這段訊息代表已是最新版
An updated version is available. Would you like to download it?
You would need to run it manually later. [Y/n]: Y

The tool will exit now. To run the updated version run the
following command:

/opt/bitnami/bncert-tool

# 再執行一次
sudo /opt/bitnami/bncert-tool
-----------------------------------------------------------
Welcome to the Bitnami HTTPS Configuration tool.

-----------------------------------------------------------
Domains

Please provide a valid space-separated list of domains for which
you wish to configure your web server.

# 把使用中的主域名、子網域、未來可能會再新增的
# 子網域及轉址過來的寄存網域(parking domain)都
# 給它填上,www 也把它填上,域名之間用空白隔開。
Domain list []: example.com www.example.com blog.example.com
parkingdomain.com www.parkingdomain.com

-----------------------------------------------------------
Enable/disable redirections

Please select the redirections you wish to enable or disable on
your Bitnami installation.

# 是否啟用強制 https 連線,[Y]就對了
Enable HTTP to HTTPS redirection [Y/n]: Y

# 是否要讓網址自動加上 www.
# 除非原本網址預設就是 www.,個人使用建議選[n]
Enable non-www to www redirection [Y/n]: n

# 網址是否自動去掉 www.
# 如果上面選[n],這裡應該就是選 [Y]
Enable www to non-www redirection [y/N]: Y


-----------------------------------------------------------
Changes to perform

The following changes will be performed to your Bitnami
installation:

# 系統變更設定前再次確認,並設定排程每月自動更新憑證
1. Stop web server
2. Configure web server to use a free Let's Encrypt certificate for the domains:
example.com www.example.com blog.example.com parkingdomain.com www.parkingdomain.com
3. Configure a cron job to automatically renew the certificate each month
4. Configure web server name to: example.com
5. Enable HTTP to HTTPS redirection (example: redirect http://example.com to https://example.com)
6. Enable www to non-www redirection (example: redirect www.example.com to example.com)
7. Start web server once all changes have been performed

# 無誤後按 [Y] 或 [Enter]
Do you agree to these changes? [Y/n]: Y


-----------------------------------------------------------
Create a free HTTPS certificate with Let's Encrypt

Please provide a valid e-mail address for which to associate your Let's Encrypt certificate.

Domain list: example.com www.example.com parkingdomain.com blog.example.com parkingdomain.com www.parkingdomain.com

Server name: example.com

# 如果憑證快過期還沒更新,會收到 email 通知提醒,不會顯
# 示在憑證任何地方,這裡輸入有效的 email。
E-mail address []: david@gmail.com

The Let's Encrypt Subscriber Agreement can be found at:

https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf # 用戶協議按 [Y] 同意才能繼續 Do you agree to the Let's Encrypt Subscriber Agreement? [Y/n]: Y ---------------------------------------------------------------------------- Performing changes to your installation The Bitnami HTTPS Configuration Tool will perform any necessary actions to your Bitnami installation. This may take some time, please be patient. ---------------------------------------------------------------------------- Success The Bitnami HTTPS Configuration Tool succeeded in modifying your installation. The configuration report is shown below. # 更名備份變動之前的檔案 Backup files: * /opt/bitnami/apache/conf/httpd.conf.back.202203200404 * /opt/bitnami/apache/conf/bitnami/bitnami.conf.back.202203200404 * /opt/bitnami/apache/conf/bitnami/bitnami-ssl.conf.back.202203200404 * /opt/bitnami/apache/conf/vhosts/wordpress-https-vhost.conf.back.202203200404 * /opt/bitnami/apache/conf/vhosts/wordpress-vhost.conf.back.202203200404 Find more details in the log file: # 背景處理過程紀錄檔 /tmp/bncert-202203200404.log If you find any issues, please check Bitnami Support forums at: https://community.bitnami.com Press [Enter] to continue:

哇啦,大功告成!!

這時再開啟瀏覽器,手動輸入 http://www.example.com (不加S),如果網址自動去掉 www 並出現鎖頭,也沒跳出警告訊息就成功了。

💡Let’s Encrypt 憑證本身支援萬用字元(wildcard,如: *.example.com)一次囊括所有子網域,但除了 bncert-tool 不支援,要改用 Let’s Encrypt 自己的更新工具 Lego Client + crontab 單獨設定外,還取決於 DNS 供應商支不支援。

參考資料:

  1. Learn about the Bitnami HTTPS Configuration Tool
  2. Generate and Install a Let’s Encrypt SSL Certificate for a Bitnami Application
  3. Connect to phpMyAdmin
  4. 管理 Windows 的 OpenSSH 金鑰 | Microsoft Docs