緊湊輸出 HTML、CSS 和 JavaScript
緊湊輸出會在閘道器壓縮併發送響應之前,移除 HTML、CSS 和 JavaScript 響應體中的註釋和多餘空白,響應的實際內容保持不變。
此功能在 OpenResty Edge 26.12.1-1 中首次引入。
開啟緊湊輸出
在頁面規則(應用 > HTTP 應用 > 頁面規則 > 動作)、全域性改寫規則或全域性自定義動作中新增 開啟緊湊輸出 (Minify) 動作。該動作有三個開關:HTML、CSS 和 JavaScript。當響應的 Content-Type 匹配某個已啟用的開關時,該響應會以緊湊形式輸出:
| 開關 | 內容型別 |
|---|---|
| HTML | text/html |
| CSS | text/css |
| JavaScript | application/javascript、text/javascript、application/x-javascript、application/ecmascript、text/ecmascript |
當同一請求匹配多條設定該動作的規則時,以最後一條規則為準;如果後面的規則將三個開關都設為關閉,則會關閉緊湊輸出。
緊湊輸出對響應的影響
- 閘道器會向源站請求未壓縮的響應體,因此該請求不會使用源站自身的壓縮;閘道器壓縮(Gzip、Brotli、Zstandard)仍會在之後生效,但只對其自身設定中列出的內容型別生效——對 CSS 或 JavaScript 開啟緊湊輸出時,需要在閘道器壓縮的設定中加入
text/css及 JavaScript 相關型別,否則這些響應會以未壓縮的形式到達客戶端。 - 響應中的
Content-Length和Accept-Ranges會被移除;強ETag會變為弱ETag;Last-Modified保持不變。 - 這些 URL 不再支援按位元組範圍請求。對該 URL 開啟快取後,無論是否命中快取,
Range請求都會返回完整的緊湊處理後的響應體,狀態碼為200,且不帶Content-Range,而不是206部分響應:閘道器不會把Range轉發給源站,而在處理範圍請求時又無法知道緊湊處理後響應體的長度。未對該 URL 開啟快取時,Range請求會轉發到源站,源站以206應答,該部分響應會原樣發給客戶端,不做緊湊處理。 - 以下響應不做緊湊處理:源站已經壓縮過的響應體、
206、204和304響應、空響應體、HEAD請求、charset不是 UTF-8、US-ASCII 或 ISO-8859 的響應,以及響應中超出緊湊輸出緩衝區的部分(見下文)。 - 快取中儲存的是未經緊湊處理的響應,每次命中快取都會重新做緊湊處理。
緊湊輸出緩衝區大小
全域性配置 > 通用配置 > Minify > 緊湊輸出緩衝區大小(預設 64 KByte,取值範圍 8 KByte 至 1 MByte)。閘道器會為每個緊湊輸出的響應預留這麼多記憶體。單個超出緩衝區大小的內容塊(例如一段很長的內聯 <script>),會原樣透傳、不做緊湊處理,響應的其餘部分仍會以緊湊形式輸出。
前提條件
閘道器節點軟體包依賴 OpenResty Edge 緊湊輸出軟體包,因此執行包含該功能的版本的節點都已經安裝了它。如果某個節點上缺少該軟體包,節點仍可正常啟動,只是會忽略該動作,並在錯誤日誌中記錄緊湊輸出程式未載入。節點會在下一次配置檢查時自動獲取該軟體包,無需人工重啟。尚未升級到包含該功能版本的節點同樣會忽略該動作,在升級之前照常返回未經緊湊處理的響應。
在節點上安裝、升級或解除安裝該軟體包,都會改變該節點為自己生成的配置,節點會像處理其他全域性配置變更一樣,在下一次配置檢查時對 nginx 程序做一次二進位制升級來應用它,客戶端連線不會中斷。如果一次軟體包升級先刪除檔案、再重新安裝,可能會連續觸發兩次這樣的二進位制升級。
如果某個緊湊輸出程式檔案損壞、被截斷,或者是為其他 CPU 架構編譯的,節點在載入該檔案時配置測試會失敗。此時節點會繼續用之前的配置對外提供服務,並拒絕之後的所有全域性配置更新;節點的錯誤日誌中會寫明無法載入的檔名。在該節點上重新安裝緊湊輸出軟體包,或者先解除安裝再重新安裝,節點都會在下一次配置檢查時重試。無需重啟該節點。