一、前言
這次的目標是在自己的 Linux Server 上架設 WordPress 網站,並讓網站能夠透過正式網址與 HTTPS 對外存取。 原本以為只是安裝 WordPress,但實際做起來才發現,完整架站會牽涉到 Docker、資料庫、Nginx 反向代理、DDNS、SSL 憑證與防火牆設定。
這篇文章會記錄整個架設流程,以及過程中遇到的問題與解決方式,作為之後維護網站或重新部署時的參考。
二、整體架構
這次採用的方式是讓 WordPress 與資料庫在 Docker 容器中執行,外部連線則由 Nginx 負責接收與轉發。
Internet
↓
Cloudflare / No-IP DNS
↓
Router Port Forwarding
↓
Linux Server
↓
Nginx Reverse Proxy
↓
Docker WordPress + MariaDB
這樣做的好處是每一層職責清楚。WordPress 不直接暴露在外部網路,而是只開在本機的 127.0.0.1,再由 Nginx 對外提供服務。
三、使用 Docker Compose 建立 WordPress
WordPress 需要 PHP 執行環境與資料庫。為了避免直接在主機上安裝一堆套件,這次使用 Docker Compose 來建立 WordPress 與 MariaDB。
WordPress 容器使用 127.0.0.1 綁定,例如:
127.0.0.1:8081
127.0.0.1:8082
這代表外部不能直接連到 WordPress 容器,必須透過 Nginx 反向代理。這樣可以降低服務直接暴露的風險,也方便日後管理多個網站。
四、Nginx 反向代理
Nginx 會根據使用者輸入的網域名稱,將請求轉發到不同的內部服務。 例如:
wp.xiaoziqi.com → 127.0.0.1:8081
wp.sihhao.com → 127.0.0.1:8082
透過這種方式,即使多個網站都在同一台伺服器上,也可以使用不同網域分流到不同網站。
Nginx 設定完成後,可以使用以下指令檢查設定是否正確:
sudo nginx -t
確認沒有錯誤後,再重新載入 Nginx:
sudo systemctl reload nginx
五、動態 IP 與 DDNS
家用網路通常不是固定 IP,公網 IP 可能會變動。如果 DNS 只手動填一次 IP,之後 IP 改變時網站就會失效。
因此這次使用 DDNS 的方式,讓網域可以自動更新到目前的公網 IP。若使用 Cloudflare,可以透過 API Token 撰寫更新腳本;若使用 No-IP,也能透過 hostname 綁定動態 IP。
六、HTTPS 憑證設定
網站若只有 HTTP,瀏覽器會顯示不安全,因此這次使用 Certbot 申請 Let’s Encrypt 憑證。
sudo certbot --nginx -d wp.xiaoziqi.com
申請完成後,再使用以下指令測試自動續期:
sudo certbot renew --dry-run
如果 dry-run 成功,代表之後憑證可以自動續期,不需要每三個月手動處理。
七、遇到的問題
1. WordPress 回傳 500 Internal Server Error
一開始在 Docker Compose 中加入額外設定時,因為 PHP 的 $_SERVER 被 Docker Compose 誤判為環境變數,導致產生錯誤的 wp-config.php。
解法是將 Compose 裡的 $_SERVER 寫成 $$_SERVER,避免 Docker Compose 提前展開變數。
2. 靜態首頁與 WordPress 首頁衝突
曾經為了快速展示作品集,將 index.html 放進 WordPress 根目錄。這樣雖然能快速顯示靜態頁面,但會影響 WordPress 原本的首頁路由。
後來比較合理的方式是讓 WordPress 作為主網站,靜態作品集改放在其他路徑,例如:
https://wp.xiaoziqi.com/portfolio/
八、成果與心得
完成後,網站可以透過 HTTPS 正常存取,也能進入 WordPress 後台發佈文章。文章網址則使用自訂永久連結,整理在 /knowledge/ 路徑下。
這次最大的收穫是,架站不是只有安裝 WordPress,而是要理解 DNS、Router、Nginx、Docker、資料庫與 HTTPS 之間的關係。 當每一層都能正常運作時,網站才算真正能被穩定存取。
發佈留言