Nginx 設定產生器是一個範圍明確的工具,它會把一組經過驗證的輸入(包括一個精確的網域、一個安全的絕對文件根目錄、以天數表示的快取期限,以及一個靜態 404 或 SPA fallback 的決定)轉換成單一個 HTTP server 區塊,目的是放在較大的 Nginx 安裝環境中進行審閱。本文所描述的產生器有明確的邊界:它在連接埠 80 上同時監聽 IPv4 與 IPv6、選用一個 server_name,並拒絕萬用字元、替代的 www 主機與正規表示式名稱,因為這些選擇會影響虛擬主機的路由與憑證涵蓋範圍。它不會自行產生 TLS、憑證路徑、重新導向或反向代理拓樸,因為每一項都需要瀏覽器無法檢視的部署特定證據。輸出會保留在本機瀏覽器中,目的是在被放進實際的 include 鏈之前,能逐行對照官方模組文件閱讀,接著以 nginx -t 測試,並用具有代表性的請求加以驗證。請試用 Nginx Config Generator 在你的瀏覽器中完成這件事。

nginx config generator explained
Nginx Config Generator Explained: Scope, Inputs, and Limits

產生器實際輸出的內容

這個工具會建立一個 server 區塊,而且只會建立一個 server 區塊。該區塊只包含一個純靜態網站或單頁應用程式所需要的指令:一個在 IPv4 與 IPv6 上監聽連接埠 80 的 listen 指令、一個精確的 server_name、一個絕對的 root、一行 index、一個 try_files fallback、一個帶有 expires 期限的 asset location,以及可選的 gzip 行。它不會新增 server 等級的 access_log、error_log 或 include 指令,因為這些路徑取決於主機的日誌政策與發行版的 snippet 配置。它不會插入 PHP、FastCGI、WebSocket 或反向代理規則,因為這些功能指向的是應用程式後端,而產生器無法看到這些。契約刻意保持精簡:它是一個供你審閱的片段,而不是適用於所有應用程式類型的正式上線基準。

輸入如何被驗證與限制

這個表單只接受它能保證安全使用的內容。網域欄位接受純主機名稱,並拒絕通訊協定前綴;文件根目錄必須是由受限安全字元構成的絕對 POSIX 路徑,並拒絕分號、大括號、變數、空白字元與類似 shell 的語法,以免使用者輸入把額外的指令偷渡進區塊中。快取期限必須是介於 1 到 365 之間的整數天數。每個選擇都會在組裝前以反向案例進行測試,而最終的區塊會以精確的邊界進行斷言,使重複的 server 區塊無法通過。瀏覽器無法確認該路徑在目標伺服器上是否以正確的擁有權與讀取權限存在;這仍是表單外部需要做的部署檢查。

輸入欄位接受的格式拒絕的內容
網域一個純主機名稱通訊協定前綴、連接埠後綴、萬用字元、正規表示式
文件根目錄絕對 POSIX 路徑、安全字元分號、大括號、變數、空白字元
快取期限1-365 的整數零、負數、非整數、小數
Fallback 選擇靜態 404 或 SPA(/index.html)從網域推斷、混合式預設

這些規則之所以重要,是因為 server 區塊中的每一行都會被 Nginx 解讀。一個多餘的分號或一個多餘的變數,就可能把一個靜態片段變成一條作者從未預期的指令。把剖析器的介面維持在最小範圍,是讓輸出能在單一畫面內被稽核的關鍵。

靜態 404 與 SPA fallback 的比較

Fallback 的選擇是表單中影響最深遠的一個決定。對於一般靜態網站,location / 會使用帶有所請求 URI、目錄形式以及明確 404 fallback 的 try_files,因此缺少的檔案會回傳真正的 404 狀態,讓訪客看到一個誠實的錯誤頁面。對於單頁應用程式,最終的 fallback 會變成 /index.html,讓用戶端的路由器能接收未知的應用程式路徑,並在 JavaScript 中解析它們。契約有明確警告:不要為一般的內容網站啟用 SPA fallback,因為對缺少的資源回傳狀態 200 並附上首頁外殼,會掩蓋損壞的 URL 並扭曲錯誤語意。這個選擇必須是刻意為之,而不是產生器能從網域名稱推斷出來的預設。

如何逐步建立並測試這個區塊

  1. 輸入一個精確的網域、一個安全的絕對文件根目錄、以天數表示的快取期限,並刻意選擇靜態 404 或 SPA fallback。請在產生之前決定 fallback,而不是之後。
  2. 產生區塊,並對照已安裝的 Nginx 模組、你發行版的部署路徑以及你的快取策略,逐行檢視每一條指令。如果打算設定較長的期限,請為生命週期長的資產加上版本或指紋。
  3. 備份目前的正式設定,記錄實際的 include 鏈,並把審閱過的片段放到該鏈中的正確位置。以完整的設定執行 nginx -t。
  4. 在重新載入之前,對運行中的服務測試具有代表性的請求(首頁、一個靜態資產、一個刻意缺少的路徑,以及啟用時的 SPA 路由)。當平台程序支援時,請以重新載入而非突然停止服務的方式進行,並保持一個可復原的 shell 連線。

每個步驟在被略過時都有特定的失敗模式。略過 fallback 的決定,會留下一個對應該回傳 404 的路徑卻回傳 200 的網站。略過指令檢視,會留下一個雖然通過編譯、但與未載入的模組發生衝突的區塊。略過備份,則在重新載入錯誤地路由流量時,沒有任何回退機制。

快取期限與 gzip 的選擇

asset location 不分大小寫,並涵蓋一小組固定的副檔名:CSS、JavaScript、常見影像、圖示與 WOFF2 字型。expires 指令會使用所選 1 到 365 天的期限,並加上 Cache-Control public。在選擇較長的期限之前,這正是思考對生命週期長的資產進行版本控管或指紋化的合適位置;否則訪客在部署後可能會繼續保留舊檔案。可選的 gzip 會開啟標準的 filter,加入 Vary: Accept-Encoding,並列出 CSS、JavaScript、JSON 與 SVG 等類型,符合 Nginx gzip 模組文件。HTML 由 Nginx 自身的 gzip 行為處理,不需要出現在 gzip_types 中。產生器也提醒,壓縮可能會對反映在壓縮回應中的秘密產生側通道疑慮,而預先壓縮的資產則需要不同的設定。對正式網站與安全情境進行實際量測,屬於你審閱工作中的一部分。

這個工具刻意停下之處

輸出同樣省略了 TLS、PHP、FastCGI、反向代理、WebSocket、上傳、驗證、速率限制、自訂錯誤、MIME include 路徑、日誌與安全標頭。這不是一個能用猜測來填補的缺口。HTTPS 取決於憑證路徑、續期工具、支援的通訊協定、重新導向、代理或 CDN 拓樸,以及 HSTS 政策。自行臆造憑證位置會產生危險的假信心。請透過主機平台或經過審閱的伺服器程序設定 HTTPS,然後另外測試 HTTP 到 HTTPS 的行為。當問題確實只是一個小型靜態來源時,請使用這個產生器。對於代管主機、容器、Kubernetes ingress 或 CDN,正確的設定介面可能在別處,強行把一個靜態網站片段套進這些環境,可能會掩蓋實際請求路由方式的真正差異。從 Apache 移轉過來的讀者,可以把這個產生器與另一個同樣刻意精簡的 htaccess 轉 nginx 轉換 工具搭配使用,而不是要求同一個表單同時完成兩件事。

nginx -t 能證明什麼、不能證明什麼

nginx -t 會驗證語法,並檢查所引用的檔案、include 與模組是否可被存取。它無法證明文件根目錄的檔案權限、網域的 DNS 解析、SPA 內部的應用層路由、憑證行為,或是訪客實際會看到的回應標頭。這就是為什麼工作流程會把語法測試與具有代表性的請求測試搭配在一起:一個測試首頁、一個測試已快取的資產、一個測試缺少的路徑,以及在啟用 fallback 時的一個 SPA 路由測試。如果語法測試失敗,就不要重新載入。如果重新載入後請求失敗,請還原備份並檢查錯誤日誌。即使 Nginx 本身持續在線,永久性的快取與路由錯誤仍可能影響訪客,所以最符合當前部署證據、且經過最少審閱的設定,就是最容易維護的成果。

如果你正在權衡選項,QR Code Generator Cheat Sheet: Levels, Limits, and Tips 對此有詳細說明。