從命令列執行的 Nginx 設定產生器可賦予完整的檔案系統存取權、支援已編譯進你 Nginx 二進位檔中的所有模組,並讓你透過版本控管的樣板撰寫可重複執行的伺服器區塊;而線上 Nginx 設定產生器則完全在瀏覽器中執行,產生範圍有限且可稽核的片段,在你碰觸正式伺服器之前就會拒絕任何形似設定的輸入。權衡的關鍵並非原始功能強大與否,而是你要親自負責每一條指令,還是讓工具承諾在狹窄範圍內並產出可供檢閱的輸出。當你已經熟悉指令、部署路徑以及主機的憑證拓樸時,選擇命令列。當真正的問題只是想讓一個靜態網站的伺服器區塊在上線前多一雙眼睛檢視時,選擇線上產生器。兩條路徑最終都會通過同一道安全閘門:備份現行設定、執行 nginx -t 語法檢查,並在重新載入前對正式主機送出幾個具代表性的請求。
實際差異從你開始輸入的那一刻就顯現。在命令列中,少一個分號或 server_name 打錯字,會在 nginx -t 捕捉到之前靜悄悄存在,每一條指令都取決於操作者本身。在瀏覽器中,Nginx Config Generator 會在區塊組裝前驗證一組小而固定的輸入,這代表最常見的失敗模式(網域含協定前置、根目錄中帶分號、大括號字元、變數、類 shell 語法)永遠不會進入輸出內容。

「命令列」對 Nginx 設定而言代表什麼
命令列路徑涵蓋數種不同的工作流程。最直接的一種是在伺服器上以你慣用的編輯器手動編輯 nginx.conf 及其包含檔,然後執行 nginx -t 進行驗證。第二種工作流程使用 CLI 工具,例如 nginxconf Go 專案,接收一個設定檔或少量旗標,並輸出靜態、proxy 或重新導向的設定檔供操作者安裝。第三種工作流程則是在前兩者之外再加上一層樣板引擎(Ansible、Helm、純 sed),以便從共用樣板重新產生多個虛擬主機。
這三種 CLI 變體有三項共通特性。首先,輸出就是操作者所撰寫或產生的內容;工具鏈中沒有任何環節會拒絕看起來像設定的輸入。其次,工具鏈預設操作者知道執行中的 Nginx 二進位檔實際編譯了哪些模組,因為二進位檔不認識的指令會在啟動時失敗,而非在產生階段失敗。第三,CLI 路徑通常預設操作者擁有正式主機的 shell 存取權,或至少是擁有相同二進位檔的暫存主機存取權。
對於已經在維護版本控管樣板庫的工程師而言,這項預設是受歡迎的;對其他人來說,它正是大多數正式環境意外事件的根源:吞錯主機的 regex server_name、因缺少尾端斜線而讓 try_files 變成重新導向迴圈、gzip_types 清單漏掉 SVG,以及 expires 標頭被套用在每次部署都會變動的 HTML 檔案上。
線上產生器額外提供以及刻意排除的範圍
Nginx Config Generator 在瀏覽器中執行,並刻意承諾一個狹窄的範圍。輸出是單一 HTTP 伺服器區塊,於 port 80 透過 IPv4 與 IPv6 監聽,恰有一個 server_name、絕對路徑的 POSIX 文件根目錄、固定清單的資產副檔名(CSS、JavaScript、常見影像、圖示、WOFF2 字型)、可選的 SPA fallback、可選的 gzip 區塊,以及介於 1 到 365 天的 expires 期間。該區塊不包含 TLS、PHP、FastCGI、反向代理、WebSockets、上傳、驗證、速率限制、自訂錯誤頁面、MIME 包含路徑、記錄或安全性標頭。
這份排除清單正是產品的核心價值。以最明顯的 TLS 為例,每一項排除項目都涉及憑證路徑、續期工具、支援的協定、重新導向、proxy 或 CDN 拓樸,以及 HSTS 政策。在瀏覽器中憑空捏造這些值會製造出危險的假信心,因此這份合約將責任交還給代管平台或經過檢閱的伺服器程序。同樣的邏輯也說明了為何文件根目錄僅限於範圍有限的安全路徑字元,以及為何分號、大括號、變數與空白字元會在組裝前就被拒絕:使用者輸入絕對不能用來產生額外的指令。
| 面向 | 命令列工作流程 | 線上 Nginx Config Generator |
|---|---|---|
| 執行位置 | 在主機上或具備 shell 存取的建置伺服器上 | 在瀏覽器內部;輸出內容從不離開頁面 |
| 輸入驗證 | 無,因為編輯器僅能捕捉 nginx -t 抓得到的錯誤 | 在輸出前拒絕網域協定、根目錄路徑、快取期間及注入式格式 |
| 輸出範圍 | 操作者所撰寫或樣板產生的所有內容 | 單一範圍有限的 HTTP 伺服器區塊;TLS、PHP、proxy 與標頭皆排除 |
| 模組感知 | 操作者必須知道二進位檔支援哪些功能 | 輸出僅使用核心與 gzip 模組中有記載的指令 |
| 最佳適用情境 | 多 vhost 機群、TLS、反向代理、自訂錯誤頁 | 在現有主機上新增一個靜態來源或 SPA |
這張表格刻意呈現單向對比:線上路徑以觸及範圍換取可預測性。如果你的專案需要超出靜態檔案加上選擇性 SPA 外殼的任何功能,正確答案就是命令列、一層樣板引擎,或是你平台既有的設定介面。
使用線上工具產生靜態網站區塊
- 輸入一個確切的網域,不要含協定前置也不要使用萬用字元;輸入由範圍有限的安全路徑字元組成的絕對 POSIX 文件根目錄;並為雜湊資產設定介於 1 到 365 天的快取期間。檔名有版本編號時,較長的期間是安全的;若檔名沒有版本,部署後可能會提供過時內容。
- 謹慎選擇 static 404 或 SPA fallback。針對一般內容網站保留 static 404,讓找不到的網址回傳真正的 404,使失效連結保持可見。唯有當客戶端路由應接收未知的應用程式路徑時,才切換到 SPA fallback,這會讓 location / try_files 最終落到 /index.html。
- 選擇性啟用 gzip。產生器會加入標準的 gzip 篩選器、Vary: Accept-Encoding 回應標頭,以及 gzip_types 中的 CSS、JavaScript、JSON 與 SVG。HTML 則交由 Nginx 的預設行為處理。在依賴壓縮處理會反映機密內容的資料之前,請先衡量你自己的流量與安全情境。
- 產生區塊,並逐一比對輸出中的每條指令與你 Nginx 二進位檔實際編譯的模組。核心指令(listen、server_name、root、try_files、expires、location 配對器)記載於 Nginx 核心模組參考手冊,而篩選器相關指令則來自 Nginx gzip 模組參考手冊。
- 將區塊複製到本機的檢閱介面。尚未完成 nginx -t 與正式請求測試前,請勿貼入正式環境。請把輸出視為草稿,直到上述兩項皆通過為止。
將產生的區塊放入你的 Nginx 設定樹
- 備份目前的有效設定檔,並記錄執行中 Nginx 實際載入的 include 鏈。了解實際載入了哪些檔案,才能精準判斷新片段該放在何處。
- 將已檢閱的片段放入正確的 include 脈絡(通常是在 sites-available 並從 sites-enabled 建立符號連結,或在偏好此作法的發行版的 sites.d 資料夾中)。確認 nginx.conf 中的 include 指令指向你剛剛建立的檔案。
- 對完整設定執行 nginx -t。通過測試僅代表語法與模組引用無誤,並不證明檔案擁有權、DNS、應用程式路由或憑證行為也正確,這正是下一步不可或缺的原因。
- 測試具代表性的請求:根網址、一個不存在的路徑(靜態網站預期 404;SPA 則預期 200 並回傳 index 外殼)、以及一個雜湊資產的網址(預期帶有 public 的長 Cache-Control 標頭)。
- 當你的平台程序支援時,請以重新載入取代直接停止,並在執行期間保留一個可供復原的 shell。若 nginx -t 失敗,切勿重新載入。若重新載入後請求失敗,請先還原備份並檢查錯誤記錄後再重試。
無論走命令列路徑還是線上路徑,上述流程(備份、放置、驗證、測試、重新載入)都一模一樣。唯一差別在於序列開始之前設定檔中的內容。
CLI 工作流程仍勝出的情境
當你需要以版本管制維護單一樣板來管理多個虛擬主機、需要搭配特定憑證路徑、ACME 續期勾點、HSTS 或協定限制的 TLS、需要代理到多個應用程式後端並使用 websocket 升級、自訂標頭或速率限制、你身處容器或 Kubernetes ingress 之中而設定介面並非 /etc/nginx,或需要自訂錯誤頁面、結構化記錄、MIME 包含路徑或安全性標頭政策時,CLI 路徑才是正確選擇。對於這些情境,Nginx Config Generator 刻意設計得過於狹窄,任何嘗試猜測數值的工具都會對你的部署猜錯。同樣的權衡也出現在 htaccess-to-nginx 領域,而命令列與線上並列比較逐步解析一文已詳述本機腳本與瀏覽器式產生的差異。
在這個較窄的範圍內,CLI 的正確做法是維護一份與當前部署證據相符、經過檢閱的小型樣板,將 nginx -t 作為關卡,並透過平台正式記錄的程序執行重新載入。請將每次重新載入視為值得稽核的變更,並將前一版檔案保留在版本管制中,以便在數秒內還原錯誤的部署。
依專案需求在 CLI 與瀏覽器之間抉擇
如果正式網站已經上線,而你只是要新增一個靜態來源,瀏覽器路徑能省下一個來回,並在一分鐘內產出可供檢閱的片段。如果正式網站是 PHP 應用程式、反向代理叢集或 TLS 前置的 CDN 邊緣節點,CLI 路徑(或平台自身的設定介面)是唯一誠實的答案。當你想教學或自學時,線上產生器也是絕佳選擇:合約很小、拒絕規則清楚可見,而產生器以八份官方文件 fixtures 進行測試,使得輸出範圍成為可稽核的內容。當你想要撰寫可重複執行的正式環境建置腳本並自行掌控樣板時,CLI 路徑較為合適。
無論走哪條路,設定只是起點。真正的安全來自備份、語法測試,以及你在重新載入前所執行的具代表性請求。任何隱藏這些步驟的產生器,也等於隱藏了最重要的部分。