本篇是將 WordPress 網站從舊的共享主機轉移至 Linode VPS LEMP 伺服器的過程紀錄。
前陣子因為舊網站空間的 MySQL 資料庫出問題,所以從 Linode 買了一個新的 VPS 主機空間,安裝並設定好 Ubuntu Linux 系統之後,架設了一個 LEMP 伺服器,接下來就是要將既有的 WordPress 網站搬到新的 VPS 主機空間了。
在更換主機空間的過程中,從一開始的 Linux 系統安裝到 LEMP 伺服器的各種設定等過程,都可以很輕鬆的來處理,這中間如果不小心出差錯,頂多只是把搞砸的虛擬主機刪掉,重新再裝一次就好了,不會影響到現行網站的運作,但在 LEMP 伺服器安裝好之後,開始轉移 WordPress 網站時,就要十分注意,這個部份如果一不小心沒處理好,就可能會讓網站斷線,直接影響網站的營運!
以下是 WordPress 網站遷移的步驟。
Step 1
首先確定 WordPress 的使用者都已經登出了,不會有人在網站遷移時還在線上編輯文章,或是做任何會更動網站內容的動作。
Step 2
將 WordPress 網站從舊的網頁空間中備份出來,因為只是更換網頁空間,網址並沒有更動,這種搬移方式非常單純,只要備份下列兩個部分:
- 所有 WordPress 的檔案。
- WordPress 所使用的 MySQL 資料庫。
MySQL 資料庫的備份可以使用主機商提供的 phpMyAdmin,或是使用 mysqldump,例如:
mysqldump --host localhost --opt --user=USERNAME --password='MYSQL_PASSWORD' DB_NAME | gzip > mysql_backup.sql.gz
而 WordPress 的檔案可以直接使用 FTP 抓取,或是使用 rsync 備份:
rsync -avz username@old.webhost.com:/path/to/www .
如果新舊主機都可以使用 SSH 登入的話,其實可以直接在新主機上使用 rsync,直接把檔案搬到新主機上,這樣子是最快的。
Step 3
設定新主機的 MySQL 資料庫與帳號,我們需要在新的 MySQL 伺服器上新增一個 WordPress 網站專用的 MySQL 資料庫與一個帳號,資料庫與帳號的名稱可以自己任意取,假設要新增一個 blogdb 資料庫與一個本機的 dbuser 使用者,首先用 MySQL 管理者的權限進入資料庫:
mysql -h localhost -u root -p
接著新增 blogdb 資料庫:
CREATE DATABASE blogdb;
新增本機的 dbuser 使用者,並且開啟其使用 blogdb 資料庫的權限:
CREATE USER 'dbuser'@'localhost' IDENTIFIED BY 'PASSWORD';
GRANT ALL PRIVILEGES ON blogdb.* TO 'dbuser'@'localhost';
由於這裡新增的 dbuser 使用者是專門給 WordPress 用的,平常我們不會用這個帳號登入,所以建議可以使用亂數的方式產生比較複雜的密碼,這樣安全性比較高。
Step 4
建立好 WordPress 用的 MySQL 資料庫與使用者之後,就可以將剛剛備份的 WordPress 資料庫倒進去了,我們可以使用 phpMyAdmin 將資料匯入剛剛新建的 blogdb 資料庫,或是使用 mysql 指令匯入:
zcat mysql_backup.sql.gz | mysql -h localhost -u dbuser -p blogdb
這樣資料庫的部分就完成了。
Step 5
將 WordPress 的檔案放置到適當的位置,在 Ubuntu Linux 中大家通常習慣會把網頁資料放在 /var/www 之下,所以我也就直接把 WordPress 的網頁檔案放在這裡,依照網站建立目錄:
sudo mkdir -p /var/www/blog.gtwang.org
接著就將剛剛從舊空間備份出來 WordPress 檔案放進來這個目錄,或是直接在這裡使用 rsync 將檔案搬過來。搬過來之後,先編輯 wp-config.php 這個設定檔,更新一下資料庫的設定:
define('DB_NAME', 'blogdb');
define('DB_USER', 'dbuser');
define('DB_PASSWORD', 'PASSWORD');
define('DB_HOST', 'localhost');
最後還要變更一下檔案的擁有者:
sudo chown -R www-data:www-data /var/www/blog.gtwang.org
Step 6
變更 nginx 設定,加入新的網站,這部分比較複雜,每一個網站的設定也會不同,基本上可以先從 /etc/nginx/sites-available/default 這個預設的設定檔著手,先複製 default 的設定檔:
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/blog
接著參考 WordPress 官方的 nginx 建議設定,將適用於自己網站的設定加進來。設定好之後,啟用新的設定檔:
sudo ln -s /etc/nginx/sites-available/blog /etc/nginx/sites-enabled/blog
Step 7
理論上來說,如果以上各個部分都有處理好的話,網站轉移就已經幾乎完成了,剩下的就是只要修改 DNS 的記錄,讓網址指向新的伺服器就可以了,但是因為轉移網站的過程有非常多小細節(我這裡也沒辦法說明的很詳細),一不小心可能就會疏忽掉,如果沒處理好的話,在 DNS 一修改之後,就有可能會讓網站停擺,尤其是對於那些不是非常熟悉網路與 Linux 技術的管理者。
為了保險起見,我個人是習慣在修改 DNS 記錄之前,先找一台身邊的 Linux 機器測試一下,將自己身邊 Linux 系統上的 /etc/hosts 加上一行:
12.34.56.78 blog.gtwang.org
請將其中的 12.34.56.78 以自己的新伺服器 IP 取代,這樣可以讓這台 Linux 在查找我們網站的 IP 時,會直接解析至新的伺服器,對於這一台 Linux 電腦來說,這樣做會跟直接修改 DNS 伺服器上的記錄有一樣的效果。
修改好 /etc/hosts 之後,接著在這台 Linux 上開啟瀏覽器,看看自己的網站是否可以正常運作,如果開啟網頁、登入等等都沒問題,那就可以放心去修改 DNS 惡記錄了。
Step 8
基本上只要細節都有注意到,也有透過修改 /etc/hosts 來測試,整個轉移過程是可以讓網站的營運完全不受影響的,以我這次的網站轉移來說,伺服器的 uptime 還是可以維持在 100%,網站上的訪客完全感受不到任何異樣,唯一的差異可能就是網站突然變快了。

這張 uptime 的圖是我用 pingdom 的網站監控工具所得到的,這裡的重點是右邊的 uptime 在網站轉移期間,還是可以維持在 100%。而這裡有一點您可能會感覺很奇怪,怎麼更換主機空間之後,伺服器的反應時間馬上增加一倍,效能反而變差?
這裡反應時間會上升是正常的,主要的原因在於我的舊主機位於美國,新的主機位置在新加坡,而 pingdom 的測試伺服器都位於歐美,因此 pingdom 在 ping 新主機時,會多了往返太平洋的時間。
很顯然新主機對於歐美的訪客而言,網站速度可能會比較慢,但由於我的網站是中文網站,主要的客群位於東南亞,所以選擇將主機放在新加坡,提升東南亞地區的網站速度,至於歐美的訪客,就暫時用免費的 CDN 來補償。
