把 WordPress 架在 DigitalOcean 上,等於拿一台只屬於自己的雲端伺服器來跑網站。沒有共享主機那種「鄰居流量爆掉拖垮你」的問題,月費可以壓在幾美元,效能卻是同價位虛擬主機的好幾倍。代價是你得自己動手:開機器、設防火牆、裝環境、上 SSL。
問題是,多數教學把這條路切得很碎。官方文件假設你已經建好 Droplet、做完使用者強化、設好 Nginx server block 才開始講 WordPress;其他文章則直接推一鍵安裝或代管平台,跳過真正在 Linux 上手動架站會遇到的坑。
這篇用 DigitalOcean 從零把 WordPress 架到上線,走的是手動 LEMP 路線:建立 Droplet、SSH 連線與安全強化、安裝 Nginx 加 MySQL 加 PHP、部署 WordPress、設定 Nginx 站台、用 Let’s Encrypt 上 HTTPS、把網域指過來,最後補上備份與維運。全程指令照抄就能跑,並標出新手最常踩的設定地雷。
DigitalOcean 架 WordPress 適合誰,又該選一鍵還是手動
DigitalOcean 是純雲端伺服器供應商,給你的是一台叫做 Droplet 的虛擬私有伺服器,作業系統、網站環境、安全設定全部自理。它適合願意碰指令列、想要完整掌控權、又想把成本壓低的人。如果你只想要點幾下就有後台、完全不想碰 Linux,那代管型 WordPress 主機會更省心,這篇的手動路線不一定適合你。
決定動手之前,先搞清楚三條路的差別:
- 一鍵安裝(1-Click App):在 Marketplace 選「WordPress on Ubuntu」映像檔,開機就附好 LEMP、WordPress、UFW 防火牆與 fail2ban,幾分鐘能用。優點是快,缺點是環境長什麼樣你不清楚,出問題時不知道從哪查起,學不到底層。
- 手動 LEMP:開一台乾淨的 Ubuntu,自己一步步裝 Nginx、MySQL、PHP 再放 WordPress。花的時間最多,但每個設定檔的位置、每個服務的角色你都摸過一遍,日後排錯、調效能、搬站都有底。
- 第三方代管平台:由外部服務商接手 DigitalOcean 的機器,幫你包好控制台、快取、備份。費用比裸機高,換來不用碰伺服器,但你也失去了直接操作的自由度。
這篇選手動 LEMP,因為它最能把整套運作邏輯講清楚。學會手動之後,回頭看一鍵安裝會發現裡面的東西你全都認得。
LEMP 是什麼,為什麼配 WordPress 用 Nginx 不用 Apache
LEMP 指的是四個元件的組合,分別是 Linux 作業系統、Nginx 網頁伺服器、MySQL(或相容的 MariaDB)資料庫、PHP 直譯器。名字裡的 E 來自 Nginx 的發音「Engine-X」。WordPress 本身是 PHP 程式,文章與設定存在 MySQL,網頁伺服器負責把請求轉給 PHP 處理再回傳給瀏覽器。
跟傳統的 LAMP(用 Apache)相比,Nginx 在處理大量同時連線與靜態檔案時記憶體吃得更省、回應更快,這對只有 1GB 記憶體的入門 Droplet 特別重要。代價是 Nginx 不像 Apache 吃 .htaccess,所有改寫規則得寫進站台設定檔,這也是手動架站時新手最常卡住的一段,後面會專門處理。
建立 Droplet 前,先把規格與機房選對
開機器這一步看似簡單,但規格、機房、驗證方式選錯,輕則之後要重設,重則花了錢效能還是不夠。先把這幾個決定想清楚再按下建立。
規格怎麼挑。 WordPress 是吃記憶體的程式,PHP 與 MySQL 同時跑,再加上外掛,1GB 記憶體很容易吃緊。以目前 DigitalOcean 的基本型 Droplet 來說,常見的起步配置與適用情境大致如下:
| 月費(美元) | 記憶體 / vCPU | 適合情境 |
|---|---|---|
| 約 4 至 6 | 512MB 至 1GB / 1 | 個人部落格、測試站、流量很低 |
| 約 12 | 2GB / 1 | 小型企業站、有少量外掛與圖片 |
| 約 24 | 4GB / 2 | 一般正式營運站、流量穩定成長 |
新手常見的誤判是選最便宜的 512MB 方案,結果裝幾個外掛就記憶體不足、頁面開始白屏。建議至少從 1GB 起跳,並務必在後面步驟加開 swap 交換空間當緩衝。價格會隨時間調整,實際數字以建立畫面顯示為準。
機房選哪裡。 Droplet 要選離目標讀者最近的資料中心,延遲才低。台灣讀者對應的最近節點是新加坡(Singapore)機房,這是目前實務上台灣網站的首選。選錯到歐美機房,台灣使用者每次連線都多繞半個地球,速度差很有感。
驗證方式用 SSH 金鑰,不要用密碼。 建立 Droplet 時會問你要用 SSH 金鑰還是密碼登入。一律選 SSH 金鑰。對外開放的伺服器,密碼登入會被全球的自動掃描程式不斷暴力嘗試,金鑰則幾乎無法被猜出來。
在你自己的電腦(macOS 或 Linux 終端機、Windows 用 PowerShell 或 PuTTY)先產生金鑰:
ssh-keygen -t ed25519 -C "你的備註"
一路按 Enter 採用預設路徑即可,建議設一組通關密語多一層保護。產生後把公鑰內容(~/.ssh/id_ed25519.pub)整段複製,貼到 DigitalOcean 建立 Droplet 時的 SSH 金鑰欄位。私鑰留在自己電腦,永遠不要外流。
剩下的選項裡,備份(Backups)建議勾起來,雖然會多一點費用,但這是最省事的整機還原保險;監控(Monitoring)免費,一併開啟。主機名稱取個看得懂的名字方便日後管理。確認後就按下建立,等個一兩分鐘機器就好了。
第一次 SSH 連進去,先做安全強化再裝任何東西
Droplet 開好後別急著裝 WordPress。剛開機的伺服器是用 root 帳號對外的,這是高風險狀態,第一件事是連進去、建立一個有 sudo 權限的一般使用者,並把防火牆架起來。
從你的電腦用 SSH 連入,把下面的 IP 換成 Droplet 面板上顯示的公開 IP:
ssh root@你的伺服器IP
第一次連會問你是否信任這台主機,輸入 yes。進去後先更新套件清單,確保系統是最新狀態:
apt update && apt upgrade -y
接著建立一個一般使用者,這裡用 webadmin 當例子,名稱可自訂:
adduser webadmin
usermod -aG sudo webadmin
adduser 會要你設密碼並填幾個選填欄位,密碼設強一點。usermod -aG sudo 把這個帳號加進 sudo 群組,之後它就能用 sudo 執行管理指令。
為了讓新帳號也能用金鑰登入,把 root 的授權金鑰複製過去:
rsync --archive --chown=webadmin:webadmin ~/.ssh /home/webadmin
接下來設定防火牆。Ubuntu 內建的 UFW 很好用,先放行 SSH,再放行網頁流量:
ufw allow OpenSSH
ufw allow 'Nginx Full'
ufw enable
Nginx Full 同時放行 80(HTTP)與 443(HTTPS)兩個埠。輸入 ufw enable 時會警告可能中斷現有連線,因為已經先放行了 OpenSSH,安心輸入 y。
驗證完成後,登出 root,改用新帳號重新連進來:
ssh webadmin@你的伺服器IP
確認能用金鑰順利登入、sudo 也能用之後,後續所有操作都用這個帳號。更進階的做法是直接停用 root 的 SSH 登入與密碼登入,但對第一次架站的人,做到上面這幾步已經擋掉絕大多數自動攻擊。
安裝 LEMP:Nginx、MySQL 與 PHP 一個個架起來
環境準備好就開始裝三大元件。順序是 Nginx 先、MySQL 次之、PHP 最後,這樣每裝完一個都能單獨驗證有沒有起來。
先裝 Nginx。
sudo apt install nginx -y
裝完 Nginx 會自動啟動。這時在瀏覽器輸入 http://你的伺服器IP,看到 Nginx 的歡迎頁,就代表網頁伺服器與防火牆都正常。
再裝 MySQL,裝完一定要跑安全設定。
sudo apt install mysql-server -y
sudo mysql_secure_installation
mysql_secure_installation 是一連串問答,它會幫你移除測試資料庫、停用遠端 root 登入、清掉匿名帳號。沿途問是否啟用密碼強度驗證、是否移除匿名使用者等,全部選 y 即可,這些都是該關的後門。
最後裝 PHP,連同 WordPress 常用的擴充套件。 WordPress 與多數外掛需要額外的 PHP 擴充功能,一次裝齊省得之後缺東缺西:
sudo apt install php-fpm php-mysql php-curl php-gd php-intl php-mbstring php-soap php-xml php-xmlrpc php-zip -y
這裡有個新手大坑:PHP-FPM 的服務名稱帶版本號,例如 php8.3-fpm,不同 Ubuntu 版本裝到的 PHP 版本不同。先用下面指令查清楚自己裝到哪一版:
php -v
記住主版本號(例如 8.3),後面設定 Nginx 與重啟服務時都會用到。對應的 PHP-FPM socket 檔位置通常在 /run/php/php8.3-fpm.sock,版本號要跟你查到的一致,填錯 Nginx 就會回 502 錯誤。
設定 MySQL 資料庫與 WordPress 檔案
LEMP 起來後,先幫 WordPress 開一個專屬的資料庫和帳號,再把 WordPress 程式碼放到伺服器上。
建立資料庫與專屬使用者。 給 WordPress 一個獨立的資料庫和只能操作這個庫的帳號,是基本的權限隔離,比讓它直接用 root 安全得多。登入 MySQL:
sudo mysql
進到 MySQL 提示字元後,依序執行(每行結尾的分號不能漏):
CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'wpuser'@'localhost' IDENTIFIED BY '換成你的強密碼';
GRANT ALL ON wordpress.* TO 'wpuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;
這幾行分別建立名為 wordpress 的資料庫、建立 wpuser 帳號並設密碼、把這個庫的權限授給它、刷新權限後離開。字元集用 utf8mb4 才能正確存中文與表情符號,這點官方範例有時還停在舊的 utf8,建議直接用 utf8mb4。資料庫名、帳號、密碼這三個值記下來,等下要填進設定檔。
下載並放置 WordPress 檔案。 從官方網站抓最新版,確保是乾淨無竄改的程式碼:
cd /tmp
curl -LO https://wordpress.org/latest.tar.gz
tar xzvf latest.tar.gz
把檔案複製到網站根目錄。這裡用 /var/www/wordpress 當站台目錄:
sudo cp -a /tmp/wordpress/. /var/www/wordpress
-a 參數會保留權限,結尾的那個點代表連同隱藏檔一起複製。接著把整個目錄的擁有者改成 Nginx 執行身分 www-data,伺服器才有權讀寫,自動更新與上傳媒體也才會正常:
sudo chown -R www-data:www-data /var/www/wordpress
編輯 wp-config.php,把資料庫與安全金鑰填好
WordPress 靠 wp-config.php 連資料庫,這個檔案要從範本複製出來再手動填值。先複製範本:
sudo cp /var/www/wordpress/wp-config-sample.php /var/www/wordpress/wp-config.php
先抓一組安全金鑰。 WordPress 用一組隨機鹽值(salt keys)來加密登入資訊,官方提供線上產生器,直接抓一份:
curl -s https://api.wordpress.org/secret-key/1.1/salt/
它會回傳八行 define(...),整段複製起來備用。每次都要重抓,不要沿用任何別人貼出來的範例值。
接著編輯設定檔:
sudo nano /var/www/wordpress/wp-config.php
要改的地方有三處。第一、把資料庫連線資訊換成剛才建立的值:
define( 'DB_NAME', 'wordpress' );
define( 'DB_USER', 'wpuser' );
define( 'DB_PASSWORD', '換成你的強密碼' );
第二、找到那一段預設的 put your unique phrase here 鹽值,整段刪掉,貼上剛才用 curl 抓回來的八行。
第三、在檔案裡補上一行檔案系統設定:
define( 'FS_METHOD', 'direct' );
這一行很關鍵。因為前面已經把目錄擁有者設成 www-data,明確指定 direct 後,WordPress 安裝外掛、更新時就能直接寫檔。漏掉這行的話,後台每次更新都會跳出要你輸入 FTP 帳密的視窗,是新手常被卡住又查不到原因的經典問題。改完按 Ctrl + O 存檔、Ctrl + X 離開。
設定 Nginx 站台,讓網址正確指到 WordPress
這一段是手動架站最容易出錯、也最該細看的地方。Nginx 不吃 WordPress 預設的 .htaccess,固定網址(permalink)的改寫規則必須寫進站台設定檔,沒設好就會發生首頁正常、但點進文章一律 404 的狀況。
先建立一個專屬的站台設定檔:
sudo nano /etc/nginx/sites-available/wordpress
貼進以下內容,記得把 php8.3-fpm.sock 換成你前面用 php -v 查到的實際版本,把 your_domain 換成你的網域(還沒有網域可先填伺服器 IP):
server {
listen 80;
server_name your_domain www.your_domain;
root /var/www/wordpress;
index index.php;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ .php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
location = /favicon.ico { log_not_found off; access_log off; }
location = /robots.txt { log_not_found off; access_log off; allow all; }
location ~* .(css|gif|ico|jpeg|jpg|js|png)$ {
expires max;
log_not_found off;
}
}
幾個重點。try_files ... /index.php$is_args$args 這行就是讓固定網址生效的關鍵,它把找不到的路徑交給 index.php 處理,文章頁面才不會 404。location ~ .php$ 區塊負責把 PHP 請求轉給 PHP-FPM,socket 路徑版本號填錯就會 502。最後針對靜態檔案關掉記錄、設定長快取,能省下伺服器開銷。
存檔後啟用這個站台,並停用預設站台避免衝突:
sudo ln -s /etc/nginx/sites-available/wordpress /etc/nginx/sites-enabled/
sudo unlink /etc/nginx/sites-enabled/default
每次改完設定,務必先測語法再重新載入,不要直接重啟,語法有錯時測試會直接告訴你錯在哪:
sudo nginx -t
sudo systemctl reload nginx
看到 syntax is ok 與 test is successful 就成功了。這時用瀏覽器開 http://你的網域或IP,會看到 WordPress 的安裝精靈。選語言、設站名、建立管理員帳號(別用 admin 當帳號名),密碼設強一點,完成後就能登入後台。網站的雛形到這裡已經跑起來了。
用 Let’s Encrypt 上 HTTPS,讓網站變成加密連線
網站能開不代表能用。沒有 HTTPS 的網站,瀏覽器會標示「不安全」,搜尋引擎也會扣分,後台登入帳密更是以明文在網路上裸奔。Let’s Encrypt 提供免費且受信任的 SSL 憑證,搭配 Certbot 工具可以自動申請、自動把 Nginx 設定改成走 HTTPS。
上憑證的前提是網域已經正確指向這台 Droplet(DNS 設定見下一段),憑證機構需要能透過網域驗證你真的擁有這台伺服器。網域生效後,安裝 Certbot:
sudo apt install certbot python3-certbot-nginx -y
接著一行指令完成申請與設定,把網域換成你的:
sudo certbot --nginx -d your_domain -d www.your_domain
Certbot 會問你的電子郵件(用於到期提醒)、是否同意條款,並自動改寫 Nginx 設定,把 HTTP 流量導向 HTTPS。跑完之後重新整理網站,網址列就會出現鎖頭。
Let’s Encrypt 憑證有效期是 90 天,但 Certbot 安裝時已經設好自動續期的排程,你不用每三個月手動跑一次。想確認續期機制正常,可以模擬跑一次:
sudo certbot renew --dry-run
沒有報錯就代表自動續期會正常運作。記得回到 WordPress 後台的「設定」裡,把網站網址改成 https:// 開頭,避免混合內容警告。
把網域指向 Droplet,讓使用者用網址連進來
DigitalOcean 本身不賣網域,網域要另外向註冊商購買,再把它指向你的 Droplet。整個過程分兩段:在註冊商那邊改名稱伺服器(NS),在 DigitalOcean 這邊建立 DNS 紀錄。
第一段,在註冊商把 NS 指過來。 登入你買網域的註冊商後台,找到網域的名稱伺服器設定,改成 DigitalOcean 的三組:
ns1.digitalocean.comns2.digitalocean.comns3.digitalocean.com
第二段,在 DigitalOcean 建立紀錄。 回到 DigitalOcean 面板,進入 Networking 的 Domains 分頁,輸入你的網域並關聯到剛才建立的 Droplet。系統會幫你帶出基本紀錄,你主要要確認兩筆 A 紀錄:一筆是 @(代表主網域)指向 Droplet 的 IP,一筆是 www 也指向同一個 IP。
DNS 變更需要時間在全球生效,業界稱為傳播(propagation),可能幾分鐘到幾小時不等。傳播完成前,網域可能時通時不通,這是正常現象,等就好。確認網域能開出網站之後,再回頭做上一段的 SSL 申請,順序不要顛倒。
網站上線之後,備份、更新與基本維運不能省
WordPress 跑起來只是開始,伺服器是你自己的,維護責任也在你身上。手動架站省了月費,但安全與穩定得靠自己顧。上線後這幾件事要養成習慣。
加開 swap 交換空間,給小記憶體機器一個緩衝。 如果你用的是 1GB 或更小的 Droplet,強烈建議加開一塊 swap,當實體記憶體吃滿時拿硬碟頂著,避免 MySQL 或 PHP 因記憶體不足被系統強制關閉。建立一塊 1GB 的 swap:
sudo fallocate -l 1G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
要讓它開機後自動掛載,把這行加進 /etc/fstab:
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
做好備份,最好雙保險。 DigitalOcean 的自動快照備份(建立 Droplet 時勾的那個)是整機層級的還原保險,但通常一週才一次。建議再裝一個 WordPress 備份外掛,把網站檔案與資料庫定期匯出到雲端空間,這樣即使整台機器出狀況,內容也能單獨救回來。兩道防線各補各的缺口。
定期更新,但更新前先備份。 WordPress 核心、外掛、佈景主題的更新多半含安全修補,該更就更。系統層面也要定期跑 sudo apt update && sudo apt upgrade。唯一原則是任何更新前先確認剛備份過,萬一更新後相容性出問題,能立刻退回。
裝個安全外掛盯著登入。 對外開放的 WordPress 後台是攻擊熱點,裝一個信譽良好的安全外掛限制登入嘗試次數、隱藏登入頁,能擋掉大量自動化的暴力破解。
從開一台空機器到網站掛上 HTTPS 正式對外,這條手動 LEMP 路線你已經完整走過一遍。比起一鍵安裝,你多花的時間換來的是對整套環境的掌控:哪個設定檔在哪、哪個服務出錯該查哪、要調效能從哪下手,心裡都有譜。接下來把備份排程和更新習慣固定下來,再依流量成長隨時升級 Droplet 規格,這台屬於你自己的 WordPress 伺服器就能長久穩定地跑下去。