Nginx R31 doc-11-Compression and Decompression 壓縮與解壓縮

老马啸西风發表於2024-05-26

前言

大家好,我是老馬。很高興遇到你。

我們為 java 開發者實現了 java 版本的 nginx

https://github.com/houbb/nginx4j

如果你想知道 servlet 如何處理的,可以參考我的另一個專案:

手寫從零實現簡易版 tomcat minicat

壓縮與解壓縮

壓縮伺服器響應,或者對不支援壓縮的客戶端進行解壓縮,以提高交付速度並減少伺服器的開銷。

這一部分描述瞭如何配置響應的壓縮或解壓縮,以及傳送壓縮檔案。

介紹

壓縮響應通常會顯著減小傳輸資料的大小。然而,由於壓縮發生在執行時,它也可能會增加相當大的處理開銷,從而對效能產生負面影響。

NGINX 在將響應傳送給客戶端之前執行壓縮,但不會對已經壓縮的響應進行“雙重壓縮”(例如,透過代理伺服器壓縮的響應)。

啟用壓縮

要啟用壓縮,請使用 gzip 指令,並使用 on 引數。

gzip on;

預設情況下,NGINX 只會壓縮 MIME 型別為 text/html 的響應。要壓縮其他 MIME 型別的響應,請包含 gzip_types 指令並列出其他型別。

gzip_types text/plain application/xml;

要指定響應的最小長度以進行壓縮,請使用 gzip_min_length 指令。預設值為 20 位元組(在此調整為 1000):

gzip_min_length 1000;

預設情況下,NGINX 不會壓縮代理請求的響應(來自代理伺服器的請求)。請求來自代理伺服器的事實是由請求中的 Via 標頭欄位的存在確定的。要配置這些響應的壓縮,請使用 gzip_proxied 指令。該指令具有許多引數,指定 NGINX 應壓縮哪些型別的代理請求。例如,僅對不會在代理伺服器上快取的請求壓縮響應是合理的。為此,gzip_proxied 指令具有引數,指示 NGINX 檢查響應中的 Cache-Control 標頭欄位,並在該值為 no-cache、no-store 或 private 時壓縮響應。此外,必須包括 expired 引數以檢查 Expires 標頭欄位的值。以下是這些引數的設定示例,以及 auth 引數,該引數檢查 Authorization 標頭欄位的存在(授權響應特定於終端使用者,通常不會被快取):

gzip_proxied no-cache no-store private expired auth;

與大多數其他指令一樣,配置壓縮的指令可以包含在 http 上下文或伺服器或位置配置塊中。

壓縮 gzip 的整體配置可能如下所示。

server {
    gzip on;
    gzip_types      text/plain application/xml;
    gzip_proxied    no-cache no-store private expired auth;
    gzip_min_length 1000;
    ...
}

啟用解壓縮

一些客戶端不支援使用 gzip 編碼方法的響應。

與此同時,可能希望儲存壓縮資料,或者在執行時壓縮響應並將其儲存在快取中。

為了成功為既接受壓縮資料又不接受壓縮資料的客戶端提供服務,NGINX 可以在傳送給後一種型別的客戶端時實時解壓縮資料。

要啟用執行時解壓縮,請使用 gunzip 指令。

location /storage/ {
    gunzip on;
    ...
}

gunzip 指令可以在與 gzip 指令相同的上下文中指定:

server {
    gzip on;
    gzip_min_length 1000;
    gunzip on;
    ...
}

請注意,此指令是在一個單獨的模組中定義的,預設情況下可能不包含在 NGINX Open Source 構建中。

傳送壓縮檔案

為了向客戶端傳送檔案的壓縮版本而不是常規版本,請在適當的上下文中將 gzip_static 指令設定為 on。

location / {
    gzip_static on;
}

在這種情況下,為了處理對 /path/to/file 的請求,NGINX 嘗試找到併傳送檔案 /path/to/file.gz。

如果檔案不存在,或者客戶端不支援 gzip,則 NGINX 傳送檔案的未壓縮版本。

請注意,gzip_static 指令不啟用實時壓縮。它僅使用由任何壓縮工具預先壓縮的檔案。要在執行時壓縮內容(而不僅僅是靜態內容),請使用 gzip 指令。

此指令是在一個單獨的模組中定義的,預設情況下可能不包含在 NGINX Open Source 構建中。

nginx 系列

從零手寫實現 nginx-01-為什麼不能有 java 版本的 nginx?

從零手寫實現 nginx-02-nginx 的核心能力

從零手寫實現 nginx-03-nginx 基於 Netty 實現

從零手寫實現 nginx-04-基於 netty http 出入參最佳化處理

從零手寫實現 nginx-05-MIME型別(Multipurpose Internet Mail Extensions,多用途網際網路郵件擴充套件型別)

Nginx 實戰-01-nginx ubuntu 安裝筆記

Nginx 實戰-01-nginx windows 安裝筆記

Nginx 實戰-02-nginx proxy_pass 服務代理訪問 使用筆記 ubuntu nodejs

Nginx 實戰-03-nginx 負載均衡

Nginx 實戰-04-nginx 不同的地址訪問不同的服務

Nginx 實戰-05-nginx 反向代理實現域名到指定的 ip

Nginx-01-聊一聊 nginx

Nginx-01-Nginx 是什麼

Nginx-02-為什麼使用 Nginx

Nginx-02-Nginx Ubuntu 安裝 + windows10 + WSL ubuntu 安裝 nginx 實戰筆記

Nginx-02-基本使用

Nginx-03-Nginx 專案架構

Nginx-04-Docker Nginx

Nginx-05-nginx 反向代理是什麼?windows 下如何配置使用 nginx

Nginx-06-nginx 彙總入門介紹

相關文章