Nginx 之七 伺服器的Gzip壓縮
文章目錄
Gzip壓縮可以在http塊,server塊和location塊中配置
Nginx伺服器是通過ngx_http_gzip_module模組、ngx_http_gzip_static_module模組、ngx_http_gunzip_module模組對這些指令進行解析和處理。
1.ngx_http_gzip_module模組(壓縮)處理的指令
這個模組主要是負責Gzip功能的開啟和設定,對響應資料進行線上實時壓縮。指令如下:
語法 | 說明 |
---|---|
是否開啟壓縮 gzip on | off |
該指令用於開啟或者關閉Gzip功能, 預設情況下該指令設定為off,只有為on時,下面指令才有效 |
壓縮需要申請的空間 gzip_buffers number size |
number:指定Nginx伺服器需要向系統申請快取空間的個數 size 根據該配置,nginx在對響應輸出資料經壓縮時需要向系統申請number*size 大小的空間用來儲存壓縮資料. 預設大小是128,其中size的值是取系統記憶體頁一頁的大小,為4kb或者8kb 即: gzip_buffers 32 4k | 16 8k |
壓縮等級 gzip_comp_level level |
該指令用於設定Gzip壓縮程度,包括級別1-9, 級別1表示壓縮程度最低效率最高, 級別9表示 壓縮程度最高,效率最低 。 預設值是1 |
根據客戶端型別動態開啟壓縮 gzip_disabel regex… | 針對不同的客戶端的請求,可以選擇性的開啟和關閉Gzip的功能 ,Nginx伺服器在響應這種種類的客戶端請求時,不使用Gzip功能快取響應輸出資料。regex根據客戶端的瀏覽器標誌(User-Agent,UA)設定,支援正則表示式。 例如 gzip_disable MSIE [4-6] 表示MSIE4、MSIE5、MSIE6、這些客戶端請求後,nginx不進行Gzip壓縮返回 |
根據瀏覽器版本是否開啟壓縮 gzip_http_version version |
早期的瀏覽器也許不支援Gzip的自解壓,因此客戶端有可能會看到亂碼,所以針對不同的HTTP協議版本,需要選擇性地開啟或者關閉Gzip功能。 預設設定為1.1版本,即只有客戶端1.1及以上版本的HTTP協議,才使用Gzip壓縮功能,目前來看大部分瀏覽器都支援Gzip自解壓,所以使用預設值即可。 |
根據響應資料大小是否開啟壓縮 gzip_min_length length |
Gzip壓縮功能對大資料的壓縮效果明顯,但是如果壓縮的資料很小,就可能資料越壓縮越大,因此我們也應該有選擇的壓縮。當響應頁面的大小大於該值才開啟Gzip壓縮功能。響應頁面的大小通過HTTP響應頭部中的Content-Length指令獲取,如果我們使用了Chunk編碼壓縮,Content-Length或不存在或被忽略,這條指令這不起作用。 預設值是20,設定為0表示不管頁面多大都要壓縮。建議大於1kb的壓縮;比如:gzip_min_length 1024 |
根據響應頭部是否開啟壓縮 gzip_proxied off|expired |no-cache | no-store | private | no_last_modified | no_etag | auth | any …; |
off:表示關閉Nginx伺服器對後端伺服器返回結果的壓縮,這是預設設定 expired:表示當後端伺服器響應頁頭部包含用於指示響應資料過期時間的expired頭域時,啟用對響應資料的Gzip壓縮 no-cache:表示當後端伺服器響應頁頭部包含用於通知快取機制是否快取的Cache-Control頭域,且其指令值為no-cache時,啟用對響應資料的Gzip壓縮 no-store:表示當後端伺服器響應頁頭部包含用於通知快取機制是否快取的Cache-Control頭域,且其指令值為no-store時,啟用對響應資料的Gzip壓縮 private:表示當後端伺服器響應頁頭部包含用於通知快取機制是否快取的Cache-Control頭域,且其指令值為private時,啟用對響應資料的Gzip壓縮 no_last_modified:表示當後端伺服器響應頁頭部不包含用於指明獲取資料最後修改時間的Last-Modified頭域時,啟動對響應資料的Gzip壓縮 no_etag:表示當後端伺服器響應頁頭部不包含用於標示被請求變數的實體值的ETag頭域時,啟動對響應資料的Gzip壓縮 auth:表示當後端伺服器響應頁頭部包含用於標示HTTP授權證書的Authorization頭域時時,啟動對響應資料的Gzip壓縮 any:無條件啟動對響應資料的Gzip壓縮 |
根據響應頁的MIME型別開啟是否壓縮 gzip_types mime-type …; |
這個mime-type的預設值是text/html,實際上當gzip設定為on的時候,Nginx伺服器會對所有的text/html型別的頁面進行Gzip壓縮,該變數還可以取值“*”,表示對所有的MIME型別頁面進行壓縮,一般我們如下設定: gzip_types text/plain application/x-javascript text/css text/html application/html; |
用與設定Gzip功能是否傳送帶有“Vary:Accept-Encoding”頭域的響應頭部 gzip_vary on | off |
該頭域的主要功能主要是告訴接收方傳送的資料時通過壓縮處理,開啟後的效果是在響應頭部新增Accept-Encoding:gzip.這對於本身不止Gzip壓縮的客戶端瀏覽器是很有用的。 預設是off的,當然我也可以通過nginx配置的add_header指令強制Nginx伺服器在響應頭部新增“Vary:Accept-Encoding”頭域: add_header Vary Accept-Encoding gzip; |
2.ngx_http_gzip_static_module模組 -(預壓縮) 處理的指令
使用前提: 如果要使用這個指令,必須在Nginx程式配置時新增–with-http_gzip_static_module指令
這個模組主要是負責搜尋和傳送Gzip功能預壓縮的資料(這些資料是“.gz”作為字尾名儲存在伺服器上)。如果客戶端請求的資料在之前被壓縮過,而且客戶端瀏覽器支援Gzip壓縮,就直接返回壓縮的資料。
和ngx_http_gzip_module模組不同點: 該模組和ngx_http_gzip_module模組不同處在於該模組使用靜態壓縮,在HTTP響應頭部包含Content-Length頭域來指明報文體的長度,用於伺服器可確定響應資料長度的情況而後者預設使用Chunked編碼動態壓縮,主要使用伺服器無法確定響應資料長度的情況,比如大檔案下載的情形,這時需要實時生成資料長度。
指令: 和該模組的指令有gzip_static、gzip_http_version、gzip_proxied、gzip_disable和gzip_vary等。
gzip_static 指令用來開啟和關閉該模組指令 語法結構:gzip_static on | off |always
on:開啟該模組功能
off:關閉該模組功能
always:一直髮送gzip預壓縮檔案,而不檢查客戶端瀏覽器是否支援Gzip壓縮。其他指令和上面的相同。需要注意的是gzip_proxied指令只接受如下設定: gzip_proxied expired |no-cache | no-store | private | auth
另外對於該模組下的gzip_vary指令,開啟以後只給未壓縮的內容新增“Vary: Accept_Encoding”頭域,而不是所有的內容都新增。
3.ngx_http_gunzip_module模組(解壓)處理的指令
這個指令是在客戶端瀏覽器不支援Gzip解壓能力而在Nginx伺服器在向其傳送資料之前現將其解壓,這些壓縮資料可能來自於後端伺服器壓縮產生的或者Nginx伺服器預壓縮產生的。
指令: gunzip、gunzip_buffers、gzip_httpversion、gzip_proxied、gzip_disable 和gzip_vary等
語法 | 說明 |
---|---|
用於開啟或者關閉該模組 gunzip_static on | off |
on:表示開啟該模組的功能 off:表示關閉該模組功能呢。 預設是關閉功能。如果客戶端瀏覽器不支援Gzip處理,Nginx瀏覽器將返回解壓後的資料,如果客戶端瀏覽器支援Gzip功能,Nginx伺服器忽略這個指令的設定,任然返回壓縮資料 |
用於解壓需要使用快取空間的大小 gunzip_bufffers number size |
number:指定Nginx伺服器需要向系統申請快取空間的個數 size:指定每個快取空間的大小。 預設值number*size=128k ,例如:gunzip_buffers 32 4k | 16 8k 該指令用法和ngx_http_gzip_moduel模組的使用方法相同 |
4.案例
user nobody;
worker_processes 3;
error_log logs/error.log;
pid nginx.pid;
events{
user epoll;
worker_connections 1024;
}
http{
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
log_format access.log '\$remote_addr-[\$time_local]-"\$request"-"\$http_user_agent"';
gzip on; #開啟gzip壓縮功能
gzip_min_length 1024; #最小壓縮檔案為1k
gzip buffers 4 16k; #壓縮快取空間大小
gzip_comp_level 2; #壓縮級別為2
gzip_types text/plain appliaton/x-javascript text/css application/xml #壓縮檔案型別
gzip vary on; #開啟壓縮表示
gunzip_static on; #開啟(在瀏覽器不支援解壓功能,nginx提前解壓)解壓功能
server{
....
gzip off;     #在某一個server不需要壓縮,可以關閉壓縮功能
}
server{
....
}
}
5.常見問題
1.如果nginx和後端伺服器都開啟了gzip壓縮功能會出現報錯:第一次訪問不會出現錯誤,但是重新整理報錯304,建議關閉後端伺服器的gzip壓縮功能
2.Nginx伺服器作為後端伺服器和前端伺服器加護,兩類伺服器對Gzip壓縮功能支援不同也會導致問題。這個和Context-Length還有Chunked編碼有關,建議檢視有關書籍。