一個可靠的小型靜態網站 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。

產生器實際會驗證的輸入
這個工具會從四個必填欄位與一組小型選用控制項,建立一個有界的 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
這個產生器在依循固定的檢視循環時最為有用。請每次都使用這些步驟,特別是在動到正式環境之前。
- 輸入一個精確的網域、一個絕對路徑的 document root、一個介於 1 到 365 天的快取持續時間,並依網站是否使用客戶端路由,明確選擇靜態 404 或 SPA fallback。
- 產生 block,並依據已安裝的 nginx 模組、實際的部署路徑,以及對加上 fingerprint 資產的快取策略,逐條檢視每個 directive。
- 備份目前的設定,記錄目前生效的 include 鏈,並將檢視過的檔案放到 nginx 安裝中正確的 context 內。
- 對完整設定執行 nginx -t。將通過測試僅視為對語法與參考的確認。
- 請求具代表性的路徑:首頁、一個深層靜態資產、一個非 SPA 網站上的不存在 URL、一個在 fallback 啟用網站上的 SPA 路徑,以及至少一個符合 gzip 資格的資產,以確認 header。
- 在平台流程支援的情況下,請以 reload 取代突然停止服務,保持一個 recovery shell 開啟,並在 reload 後確認 error log。
- 若語法測試失敗,請勿 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,正確的設定介面通常在別處。最易於維護的成果,就是一份符合發佈當天部署證據的最小、經過檢視的設定。