從零開始架設 WordPress 網站:Linux Server、Docker、Nginx 與 HTTPS 實作紀錄

一、前言

這次的目標是在自己的 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 之間的關係。 當每一層都能正常運作時,網站才算真正能被穩定存取。

留言

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *