一個可靠的小型靜態網站 nginx server block,取決於四個可稽核的選擇:一個精確的網域、一個絕對路徑的 document root、一個快取窗口,以及一個明確的 fallback。 Nginx Config Generator 透過拒絕任何看起來像 directive、萬用字元,或混合空白、分號、大括號、shell 風格變數的路徑,來強制落實這些選擇。輸出會在 IPv4 與 IPv6 的 80 port 進行監聽,選擇單一 server_name,並全程在瀏覽器本地端執行。由於這個 block 小而有界,大多數部署時的失敗與語法無關,而是出在輸入與假設上:伺服器上不存在的路徑、expires header 比內容變動更久、在一般內容網站上啟用了 SPA fallback,或是在從未帶憑證細節的 block 中塞入 HTTPS。請將這個產生器視為一個起始片段,然後在重新載入前,依據已安裝的 nginx 模組與實際部署路徑,逐條檢視每個 directive。

nginx config generator tips and common mistakes
Nginx Config Generator 技巧與常見錯誤

產生器實際會驗證的輸入

這個工具會從四個必填欄位與一組小型選用控制項,建立一個有界的 HTTP server block。與其猜測行為,不如直接看產品契約,這些檢查都是明確的。

  • 網域。 一個精確的主機。不會加入 scheme、萬用字元前綴、額外的 www 項目或 regex 形式,因為每一項都會改變哪個 virtual host 回應、以及哪張憑證適用。
  • Document root。 一個由有界安全字元構成的絕對 POSIX 路徑。分號、大括號、空白與 shell 風格的語法都會被拒絕,避免使用者輸入產生額外的 directive。
  • 快取持續時間。 一個介於 1 到 365 天的整數。超出範圍或非數值輸入都會被拒絕。
  • Fallback。 在靜態 404 與結尾為 /index.html 的 SPA fallback 之間,明確擇一。

選用輸入會以標準 filter 切換 gzip 並加上 Vary: Accept-Encoding,列出 CSS、JavaScript、JSON 與 SVG 類型,並依賴一個小型固定的副檔名清單來定位資產,涵蓋 CSS、JavaScript、常見影像、icon 與 WOFF2 字型。產生的輸出全程在瀏覽器本地端運作,不會對目標伺服器發出請求,因此路徑、擁有權與讀取權限仍須在主機上自行驗證。

會破壞部署的常見錯誤

當產生器交回檔案後,小型靜態網站會以可預測的方式失敗。模式幾乎總是下列其中之一。

  • 把 SPA fallback 當成預設。 對找不到的資源回傳狀態碼 200 的 home shell,會隱藏損壞的 URL、混淆監控,並破壞錯誤語意。只有在客戶端路由確實需要接收未知的應用程式路徑時,才啟用 SPA fallback。
  • 對未加上版本控管的資產設定過長的快取時間。 訪客會在部署後繼續持有舊檔。在挑選較高的 expires 值前,請先對長期存在的 CSS、JavaScript、影像、icon 與 WOFF2 字型加上 fingerprint 或版本。
  • 把 nginx -t 當成網站能運作的證明。 通過語法測試只涵蓋 directive 與檔案參考。它無法說明權限、DNS、應用程式路由、憑證行為或回應形狀。仍須另外針對具代表性的請求進行檢視。
  • 向產生器要求 HTTPS。 憑證路徑、續期工具、支援的協定、redirect、proxy 或 CDN 拓樸,以及 HSTS 政策,全都取決於實際部署。這個 block 刻意排除 TLS,避免它捏造危險的憑證位置。請透過代管平台或經過檢視的伺服器流程來設定 HTTPS,然後另外測試 HTTP 到 HTTPS 的行為。
  • 在 server_name 中塞入多個替代名稱。 超過一個精確名稱,或隱含的 www redirect,都會改變哪個 virtual host 被解析。若有多個名稱應該提供服務或重新導向,請明確設計該行為,不要期待產生器去推論歸屬。
  • 貼上帶有 shell token 或尾端標點的路徑。 任何看起來像 injection 的內容都會被拒絕,但一個技術上合法、但在主機上仍是錯誤的路徑,會通過驗證,然後在請求時失敗。

這些錯誤大多在產生的文字中看不出來,只有在真實請求下才會浮現。對於構成一個能在真實流量下存活的產生 block 的更深入探討,取得一個真正能運作的 nginx 設定 的逐步說明,會從不同角度涵蓋同一條部署管線。

如何產生一個可部署的 block

這個產生器在依循固定的檢視循環時最為有用。請每次都使用這些步驟,特別是在動到正式環境之前。

  1. 輸入一個精確的網域、一個絕對路徑的 document root、一個介於 1 到 365 天的快取持續時間,並依網站是否使用客戶端路由,明確選擇靜態 404 或 SPA fallback。
  2. 產生 block,並依據已安裝的 nginx 模組、實際的部署路徑,以及對加上 fingerprint 資產的快取策略,逐條檢視每個 directive。
  3. 備份目前的設定,記錄目前生效的 include 鏈,並將檢視過的檔案放到 nginx 安裝中正確的 context 內。
  4. 對完整設定執行 nginx -t。將通過測試僅視為對語法與參考的確認。
  5. 請求具代表性的路徑:首頁、一個深層靜態資產、一個非 SPA 網站上的不存在 URL、一個在 fallback 啟用網站上的 SPA 路徑,以及至少一個符合 gzip 資格的資產,以確認 header。
  6. 在平台流程支援的情況下,請以 reload 取代突然停止服務,保持一個 recovery shell 開啟,並在 reload 後確認 error log。
  7. 若語法測試失敗,請勿 reload。若 reload 後請求失敗,請還原備份並檢查 error log 後再試。

產生器刻意省略的 directive

產生的片段刻意保持精簡。它不包含 PHP、FastCGI、反向代理、WebSocket、上傳、驗證、rate limit、自訂錯誤頁、MIME include 路徑、記錄或安全相關 header。這些全都取決於特定的應用程式拓樸,無法僅從網域名稱推論。若您需要其中任何一項,請只加入實際架構所要求的行,並對照 core module documentation 與相關模組頁面進行驗證。補上產生器未輸出的 directive 是正常的;補上您不了解的 directive,則是造成 reload 失敗的最常見途徑。

情境Fallback 選擇真實請求應該呈現的內容
一般靜態內容網站靜態 404 fallback不存在的 URL 回傳真正的 404 並顯示文件化的頁面,而非 home shell
使用客戶端路由的單頁應用程式SPA fallback 至 /index.html未知的應用程式路徑以狀態 200 進入 SPA bootstrap,深層連結在 hydration 後解析
僅含 fingerprint 資產的靜態網站靜態 404 fallback,較長的 expires經過 hash 的 CSS 與 JS 在選定窗口內快取,一般 HTML 則不會,重新部署後內容即更新
透過 CDN 或 ingress 服務的靜態網站非產生器的適用情境請改為設定 CDN 或 ingress;產生器是針對小型靜態 origin 設計的

關於 gzip,標準 filter 已啟用,並為 CSS、JavaScript、JSON 與 SVG 加上 Vary: Accept-Encoding。HTML 由 nginx 的 gzip 行為處理,無需列入 gzip_types。壓縮仍可能對反映在壓縮回應中的秘密造成側通道疑慮,而預先壓縮的資產則需要不同的設定。當預設清單不足以涵蓋您實際服務的資產組合時,nginx.org 上的 gzip 模組文件就是參考依據。

部署前檢查清單

在任何 reload 之前,請執行一份對應產生器限制的簡短檢查清單。儲存目前的設定,並記錄目前生效的 include 鏈。將檢視過的檔案放到正確的 context,然後對完整設定執行 nginx -t。成功的輸出只能證明 parser 沒問題。請確認 document root 在主機上存在且擁有權與讀取權限正確、所選 server_name 的 DNS 解析到正確的介面,並且至少有一個靜態資產回傳預期的 expires 與 Cache-Control header。透過平台或經過檢視的流程加入伺服器端 HTTPS 設定,然後單獨測試 HTTP 到 HTTPS 的行為。

若語法測試失敗,請勿 reload。若 reload 成功但具代表性的請求失敗,請還原備份並檢查 error log。永久性的快取與路由錯誤,即使 nginx 仍維持上線,仍會影響訪客。請僅在問題確實是小型靜態 origin 時才使用這個產生器;對於代管環境、容器、Kubernetes ingress 或 CDN,正確的設定介面通常在別處。最易於維護的成果,就是一份符合發佈當天部署證據的最小、經過檢視的設定。