Nginx 路徑重導向與 Gzip 壓縮:壓縮等級為什麼設 6 不設 9,圖片、音訊檔案為什麼壓不動
前面寫過 Nginx 虛擬伺服器設定的
location區塊,這一節要在同一個地方多做兩件事:加入路徑重導向,以及認識 Gzip 壓縮的運作原理與適用場景。
在 Nginx 裡設定路徑重導向
Nginx 的虛擬伺服器設定可以加入重導向規則,把特定路徑導向到別的地方。例如可以設定當使用者連到 jemstack.lol/help 這個路徑時,直接重導向到 Mozilla 開發者文件(MDN)。這只是示範用途,不是必須執行的操作,主要用來說明 Nginx 怎麼處理這類重導向設定。
什麼是 Gzip
Gzip 是一種壓縮演算法,會在 Nginx 端運作。HTML 頁面等內容經常會先經過 Gzip 壓縮再傳送出去,這樣傳輸的就不是原始的龐大檔案,而是壓縮後、體積小得多的版本;瀏覽器則具備解壓縮的能力,收到壓縮過的內容後會自動還原,這正是瀏覽器少數內建、卻極其實用的能力之一。
調整 Gzip 壓縮等級:為什麼慣例是 6 而不是 9
Gzip 相關的設定可以在 /etc/nginx/nginx.conf 裡找到並調整,其中一項是壓縮等級。預設值通常是 6,很容易讓人有種「乾脆直接調到最高的 9」的衝動,但這麼做其實有代價:等級愈高,代表每一次連線都需要耗費更多 CPU 資源去做壓縮與解壓縮的運算。等級 6 一般被視為速度與壓縮效果之間比較理想的平衡點;如果確定伺服器上跑的流量不多、想榨出最大壓縮效果,才會考慮往上調到 9,但正式環境的伺服器通常不會這麼做。想實際調整可以用 vi /etc/nginx/nginx.conf 打開設定檔修改,不是必要操作,但知道它存在總是有幫助。
壓縮演算法的運作原理
用最簡化的方式理解壓縮演算法:任何一個檔案,核心終究都是由一長串 0 與 1 組成,這正是所有資料在電腦裡最底層的樣貌。與其把這一長串 0 與 1 原封不動地儲存下來,壓縮演算法會改用更精簡的方式描述同樣的內容,例如把「連續 4 個 0,接著 3 個 1,接著 1 個 0,接著 1 個 1,接著 5 個 0」這種重複出現的規律,改寫成更短的描述方式。只要這種重新描述的規則不斷套用下去,原本高達幾個 GB 的檔案,就有機會被壓縮到只剩幾 MB。
壓縮與雜湊的差異
壓縮和前面提過的雜湊,聽起來有點類似,但本質完全不同:壓縮追求的是盡可能縮小輸出的體積,而且一定要能夠被還原回原始內容,否則壓縮這件事就失去意義;雜湊則完全不在乎輸出的大小,而且原則上不是設計來被反向還原的。
為什麼圖片檔案沒辦法再被 Gzip 壓縮
一個有趣的冷知識:圖片檔案沒辦法透過 Gzip 有效壓縮,原因是圖片本身早就已經被壓縮過了。以點陣圖(bitmap)為例,同一張圖片如果存成點陣圖可能高達 5MB,但存成 PNG 格式,檔案大小可能只剩 30KB 左右,因為 PNG 這類格式本身就內建了自己的壓縮演算法;JPEG 則是另一種常見的圖片壓縮格式,只是它屬於有損壓縮(lossy),而 PNG 通常不是。
同樣的邏輯也適用於音訊格式:MP3 本質上就是把 WAV 檔案壓縮過的結果。JPEG 得名自 Joint Picture Experts Group,MP3 則源自 MPEG(Motion Picture Experts Group)制定的標準,兩者都是各自領域裡極具影響力的壓縮演算法。既然這些檔案格式本身早就已經被壓縮過了,再對它們套用一次 Gzip,實際上不會再帶來多少效果。
複習
Gzip 在網頁技術中是什麼,它的作用是什麼?
Gzip 是一種在 Nginx 上運作的壓縮演算法,會在檔案傳送出去之前先把體積壓縮縮小,瀏覽器則能自動解壓縮這些內容,藉此減少資料傳輸量、提升效能。
正式環境中,建議的 Gzip 壓縮等級是多少?
正式環境通常會把 Gzip 壓縮等級設在 6,這被視為速度與壓縮效果之間比較理想的平衡點;設成最高的 9 需要耗費更多 CPU 資源,一般不建議這麼做。
基本的壓縮演算法是怎麼運作的?
壓縮演算法會用更有效率的方式重新描述檔案的二進位內容,例如把一長串 0 與 1 改寫成「連續 4 個 0、接著 3 個 1、接著 1 個 0、接著 1 個 1、接著 5 個 0」這種精簡描述,藉此大幅縮小檔案體積。
壓縮與雜湊之間最關鍵的差異是什麼?
壓縮的目標是縮小檔案體積,並且必須能夠被還原(解壓縮)回原始內容;雜湊則不以縮小體積為主要目的,也不是設計來被還原回原始輸入的。
為什麼 Gzip 沒辦法有效壓縮圖片檔案?
因為圖片檔案本身早就已經用 PNG、JPEG 等自己的壓縮演算法處理過,這些格式已經把檔案體積縮小過一次,再套用 Gzip 壓縮不會再帶來明顯的效果。
小測驗
Gzip 在網頁技術中主要用來做什麼?
壓縮檔案以減少資料傳輸量Nginx 建議的預設 Gzip 壓縮等級是多少?
等級 6壓縮演算法基本上是怎麼運作的?
用更有效率的方式描述檔案內容的重複規律為什麼預設的 Gzip 壓縮等級通常設定為 6,而不是最高的 9?
更高的壓縮等級需要每次連線耗費明顯更多的 CPU 資源此文章是 FrontendMasters 上的 Full Stack Fundamentals, v3 課程筆記
