取得一份 Nginx 設定檔,代表要產生一個可供審閱的文字檔,內容包含一個 server block,裡面有精確的網域、絕對路徑的 document root、缺失路徑的 fallback 規則、靜態資產的快取時間,以及(選擇性的)一組有完整註解的 gzip 設定行。這個檔案以純文字形式存放在磁碟上,會從一個已知的上下文被 include 進 nginx.conf,並且是你真正放到伺服器上、再重新載入之前的那個產物。大多數新手會直接複製教學裡的設定檔,然後才發現那段程式碼預設了不同的 root 路徑、listen 的連接埠根本無法綁定,或是漏掉了他們實際需要的 fallback 規則。一個有範圍限制的 Nginx 設定檔產生器能縮短這個循環:它拒絕模糊的輸入、只寫出能從你輸入的值合理推導出的指令,並且強制你在「靜態 404」與「SPA fallback」之間做明確的選擇,讓最終產生的檔案能對應到實際部署,而不是靠猜測。
從產生器得到的「檔案」是一個片段,而不是一份完整的 nginx.conf。它包含一個 HTTP server block,在 IPv4 與 IPv6 的 port 80 上 listen、只設定一個精確的 server_name、宣告一個絕對路徑的 root、定義 try_files 來處理「靜態 404」或「SPA 的 index.html fallback」、另外加入一個區分大小寫的資產 location 來處理固定的副檔名清單、套用你所選擇的 expires 值並加上 Cache-Control: public,且在需要時啟用標準的 gzip 過濾器,搭配 Vary: Accept-Encoding 以及一份有完整註解的 types 清單。其他所有東西都刻意不寫,這才是重點:一個小檔案比一份把各種職責混在一起、寫滿指令的長檔更容易審閱、更容易部署,也更容易回滾。

Nginx 設定檔放在哪裡,以及為什麼取得它並不簡單
Nginx 的設定通常不會只有一個檔案。在常見的 Linux 發行版中,nginx.conf 放在 /etc/nginx/,並透過 include 指令引入其他檔案,通常來自 /etc/nginx/conf.d/ 或 /etc/nginx/sites-enabled/。你真正在意的那個網站專屬 server block,通常是放在上述其中一個目錄下的獨立檔案,在 Debian 系列的系統中,則是從 sites-available/ 透過符號連結或複製過來。當有人問「要怎麼取得一份 Nginx 設定檔」時,他們通常是在問三件事中的其中一件:檔案放在哪裡、要怎麼從頭寫一份,或是怎麼得到一個可以調整、又不會弄壞現有安裝環境的起點。
這就是為什麼直接複製貼上的片段常常會失敗。那段程式碼預設了目標機器上根本不存在的 document root、省略了 fallback 指令導致缺失路徑只回應一般性的 404,或是啟用了 TLS 但憑證路徑是用範例值,與實際狀況完全對不上。Nginx 設定檔產生器把範圍縮限在靜態網站或 SPA 的情境,在設定形狀的輸入變成指令之前就先擋下,並且讓輸出全程留在瀏覽器內,因此任何憑證、路徑或內部主機名稱都不會離開這台機器。
產生器在寫檔之前會驗證的輸入
在任何一行設定檔內容被產生之前,會先驗證四個輸入。第一個是網域:一個單一、確切的主機名稱,不能有 scheme、不能用萬用字元、也不能使用正規表達式,因為萬用字元、regex 的 server name、以及額外的 www 主機會改變虛擬主機的路由與憑證涵蓋範圍,而這些是產生器無法推斷的。第二個是 document root:由限定範圍的安全路徑字元所組成的絕對 POSIX 路徑,分號、大括號、變數、空白字元以及類似 shell 的語法都會被拒絕,避免額外的設定被夾帶進檔案裡。
第三個是快取時間:一個介於 1 到 365 天之間的整數,會作為資產 location 中 expires 指令的值。已經版本化或帶有 fingerprint 的長效期資產,自然適合套用較長的時間;尚未版本化的資產則不應該被快取得太積極,因為訪客在部署之後可能會繼續看到舊的檔案。第四個是 fallback 模式:一般內容網站使用靜態 404,或是 SPA 使用的 /index.html,因為 SPA 的客戶端路由需要接收未知的應用程式路徑。在一般網站上選擇 SPA fallback 是文件明確指出應避免的錯誤,因為它會在缺失資源時回傳狀態碼 200 的首頁外殼,掩蓋掉壞掉的 URL,也破壞了錯誤語意。
如何取得一份經過審閱的 Nginx 設定檔
- 輸入一個精確的網域、一個安全的絕對 document root、以及介於 1 到 365 天的快取時間,然後明確選擇靜態 404 或 SPA fallback。Fallback 的選擇會改變產生檔案中的 try_files 行,所以在產生之前請先確認。
- 產生 server block,並對照已安裝的 Nginx 模組、部署路徑與快取策略,逐一審閱每一行指令。請把 listen 行、server_name、root、index 行、try_files 鏈、資產 location 的副檔名、expires 值,以及所有 gzip 行,拿來和 nginx -V 列出的模組一一比對。
- 備份目前正在使用的設定、記錄目前 nginx.conf 的 include 鏈,並註記 document root 的檔案擁有者與權限。把產生的片段放到正確的 include 位置,通常是 /etc/nginx/conf.d/ 或 /etc/nginx/sites-enabled/,並使用該發行版所要求的檔案權限。
- 對完整設定執行 nginx -t。通過語法測試只能代表 nginx 能解析這個檔案、並解析 include 引用,並不代表檔案權限、DNS 解析、應用程式路由或憑證行為都正確。
- 在重新載入之前,先對線上伺服器測試具代表性的請求:存在的路徑、應該回應 404 的路徑、靜態資產的 URL、若是啟用 SPA fallback 時的 SPA 路由,以及(另外測試)若 TLS 由產生器外部處理時的 HTTP-to-HTTPS 行為。當平台作業流程支援時,請用 reload 而不是直接強制停止服務,並保留一個可用的救援 shell,以便 reload 出狀況時能即時處理。
產生的檔案刻意排除的內容
產生器所寫出的片段刻意維持精簡。TLS——包括憑證路徑、續期工具、支援的協定、轉址、反向代理或 CDN 拓墣、以及 HSTS 政策——都被排除,因為憑空捏造憑證位置會產生危險的假信心。HTTPS 應該透過主機平台或經審閱的伺服器程序來設定,然後與 HTTP block 分開測試。PHP、FastCGI、反向代理、WebSocket、上傳、驗證、速率限制、自訂錯誤頁面、MIME include 路徑、記錄與安全標頭同樣也被排除。
| 產生器會包含的內容 | 產生器會排除的內容 |
|---|---|
| IPv4 與 IPv6 在 port 80 上的 listen | TLS、憑證路徑、HSTS、轉址 |
| 一個精確的 server_name | 萬用字元、regex 或額外的 www server name |
| 絕對的 POSIX document root | 變數、shell 語法、相對路徑 |
| 搭配靜態 404 或 SPA index.html fallback 的 try_files | 自訂錯誤頁面、rewrite 規則 |
| 針對固定副檔名、帶有 expires 與 Cache-Control: public 的資產 location | 個別檔案的標頭、immutable 快取提示、清除快取的指令 |
| 選擇性的 gzip 過濾器、Vary: Accept-Encoding,以及有完整註解的 gzip_types | 預先壓縮資產的服務、brotli、gzip_min_length 的微調 |
| index 行 | PHP-FastCGI、反向代理的上游區塊 |
文件中有說明,當秘密資訊被反映到壓縮回應中時,壓縮可能存在 side-channel 的疑慮,因此 gzip 的選擇應該對照實際網站與安全情境來決定。預先壓縮的資產需要不同的設定區塊,這裡並不會產生。被排除的內容屬於這個工具的合約的一部分:這個檔案是一個靜態網站的片段,而不是任何應用程式都能用的正式上線基準;實際架構所需要額外的指令,應該在參考過官方的 Nginx 核心模組文件 與 gzip 模組文件 之後再加上去。
放置位置、nginx -t 與實際請求測試
產生的檔案是設計成在更大的 Nginx 安裝中接受審閱,而不是作為一份獨立可用的設定。在正式環境做任何變更之前,請先儲存目前的設定、記錄目前使用的 include 鏈,並確認新片段會從哪裡被引入。把經過審閱的檔案放到正確的位置,然後對完整設定執行 nginx -t。如果語法測試失敗,請不要 reload。如果 reload 之後請求失敗,請還原備份並檢查錯誤紀錄。
nginx -t 通過是必要條件,但並不充分。它只驗證語法與引用,卻無法檢查目標伺服器上的檔案權限、所選 server_name 的 DNS 解析、應用程式對所選 fallback 的回應、重複造訪時的實際快取行為,或是 gzip 在正式環境中與資產組合互動的方式。可維護的成果,是一份對應目前部署證據的最小可審閱設定,而不是產生器所能寫出的最大設定。
什麼時候產生器不適合用來解決問題
如果部署環境是代管主機平台、容器、Kubernetes ingress 或 CDN,那麼正確的設定介面可能根本不在這裡,手寫的 nginx.conf 片段也可能根本不會被套用。如果工作負載不只有靜態檔案或單一 SPA——包含 PHP、FastCGI、反向代理、WebSocket、上傳、驗證、速率限制、複雜的 rewrite,或個別 location 的記錄——產生器就無法產出你需要的檔案,誠實的答案是依據官方模組文件與實際架構自行建立該設定。對於從 Apache 移轉過來的團隊,在信任轉譯後的檔案之前,值得先了解自動化轉換的限制;可以從 htaccess 轉換到 nginx 以及自動化轉換的限制 這份指南開始。
當真正的問題是小型靜態來源、且部署證據也很清楚時,請使用產生器。請把它的輸出視為一個小而可供審閱的檔案,而不是一份完成的正式上線基準,並且只加入實際架構真正需要的指令。
如需更深入的了解,請參閱 htaccess 轉 Nginx 的 API 替代方案:瀏覽器內轉換。