日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Nginx Gzip壓縮配置指南

馬哥Linux運維 ? 來源:馬哥Linux運維 ? 2026-01-30 16:03 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、概述

1.1 背景介紹

說起Gzip壓縮,可能很多人覺得這是個老生常談的話題。但我在這幾年的運維工作中發(fā)現(xiàn),真正把Gzip配置到位的網(wǎng)站其實不多。去年幫一個客戶做性能優(yōu)化,他們的網(wǎng)站日均帶寬消耗在2TB左右,一看Nginx配置,Gzip居然只開了默認的gzip on,壓縮級別是1,很多該壓的文件類型都沒加上。調(diào)整完配置后,帶寬直接降到800GB,每個月省下來的CDN費用夠給團隊發(fā)幾次下午茶了。

Gzip是HTTP/1.1引入的內(nèi)容編碼機制,通過DEFLATE算法對響應(yīng)體進行壓縮。文本類內(nèi)容(HTML、CSS、JS、JSON、XML)壓縮率通常能達到60%-80%,這意味著原本100KB的文件傳輸時只需要20-40KB。在移動網(wǎng)絡(luò)環(huán)境下,這個優(yōu)化效果特別明顯。

現(xiàn)代瀏覽器都支持Gzip解壓,服務(wù)端壓縮+客戶端解壓這個過程對用戶來說完全透明,但帶來的體驗提升卻是實實在在的。

1.2 技術(shù)特點

壓縮原理

Gzip基于LZ77算法和哈夫曼編碼,通過查找重復(fù)字符串并用更短的引用替代,再對結(jié)果進行熵編碼。對于包含大量重復(fù)模式的文本文件效果最好,對已經(jīng)壓縮過的文件(圖片、視頻、壓縮包)幾乎沒有效果。

壓縮級別

Nginx支持1-9九個壓縮級別:

級別1:壓縮速度最快,壓縮率最低

級別9:壓縮率最高,但CPU消耗也最大

級別5-6:通常是性能和壓縮率的最佳平衡點

實測數(shù)據(jù)顯示,從級別5到級別9,壓縮率只提升3-5%,但CPU消耗增加40%以上。所以生產(chǎn)環(huán)境一般不建議用9。

靜態(tài)預(yù)壓縮

Nginx的gzip_static模塊支持預(yù)壓縮文件。如果存在file.js.gz,直接返回壓縮文件而不用實時壓縮,徹底消除CPU開銷。這是高并發(fā)場景下的殺手級優(yōu)化。

1.3 適用場景

適合Gzip壓縮的內(nèi)容

HTML/CSS/JavaScript

JSON/XML/SVG

純文本文件(txt、csv、log)

字體文件(woff雖然已壓縮,但gzip還能再壓10%左右)

不適合Gzip壓縮的內(nèi)容

圖片(JPEG、PNG、WebP本身已壓縮)

視頻/音頻文件

壓縮包(zip、gz、rar)

PDF文件(內(nèi)部已壓縮)

典型應(yīng)用場景

API服務(wù)器:JSON響應(yīng)壓縮效果極佳

靜態(tài)資源服務(wù)器:CSS/JS壓縮節(jié)省大量帶寬

文檔站點:HTML內(nèi)容壓縮率高

日志分析平臺:大量文本數(shù)據(jù)傳輸

1.4 環(huán)境要求

組件 版本要求 說明
操作系統(tǒng) Rocky Linux 9 / Ubuntu 24.04 LTS 內(nèi)核4.x以上
Nginx 1.26.x / 1.27.x 需包含ngx_http_gzip_module
可選模塊 gzip_static 靜態(tài)預(yù)壓縮支持
可選模塊 gunzip 為不支持gzip的客戶端解壓
CPU 多核推薦 實時壓縮消耗CPU
內(nèi)存 每連接約256KB gzip緩沖區(qū)大小

二、詳細步驟

2.1 準備工作

確認Nginx已編譯gzip模塊

# 查看編譯參數(shù)
nginx -V 2>&1 | tr' ''
'| grep gzip

# 輸出應(yīng)包含:
# --with-http_gzip_static_module
# --with-http_gunzip_module

# 如果缺少gzip_static模塊,需要重新編譯或安裝帶模塊的版本
# 官方倉庫的nginx默認包含這些模塊

準備測試文件

# 創(chuàng)建測試目錄
mkdir -p /data/gzip-test

# 生成測試文件
cat > /data/gzip-test/test.html <


  
  Gzip壓縮測試
  


  

Gzip壓縮效果測試頁面

這是一個用于測試Nginx Gzip壓縮效果的頁面。

重復(fù)內(nèi)容有助于提高壓縮率。

重復(fù)內(nèi)容有助于提高壓縮率。

重復(fù)內(nèi)容有助于提高壓縮率。

EOF # 創(chuàng)建一個大的JS文件用于測試 curl -o /data/gzip-test/jquery.js https://code.jquery.com/jquery-3.7.1.js 2>/dev/null ||echo'console.log("test");'> /data/gzip-test/jquery.js # 創(chuàng)建JSON測試文件 cat > /data/gzip-test/data.json <

安裝測試工具

# Rocky Linux
dnf install curl httpd-tools -y

# Ubuntu
apt install curl apache2-utils -y

2.2 核心配置

基礎(chǔ)Gzip配置

# /etc/nginx/nginx.conf 或 /etc/nginx/conf.d/gzip.conf

http {
  # ==================== Gzip基礎(chǔ)配置 ====================

  # 開啟gzip壓縮
  gzip on;

  # 壓縮級別:1-9,推薦5-6
  # 級別越高壓縮率越好但CPU消耗越大
  gzip_comp_level 5;

  # 最小壓縮文件大小
  # 小于這個值的文件不壓縮(壓縮收益?。?  gzip_min_length 1024;

  # 壓縮緩沖區(qū)
  # 32個4k的緩沖區(qū),用于存儲壓縮結(jié)果
  gzip_buffers 32 4k;

  # 壓縮HTTP版本
  # 對HTTP/1.0也啟用壓縮(兼容老代理)
  gzip_http_version 1.0;

  # ==================== 壓縮類型配置 ====================

  # 需要壓縮的MIME類型
  # 注意:text/html默認已啟用,不需要重復(fù)添加
  gzip_types
    # 文本類型
    text/plain
    text/css
    text/xml
    text/javascript
    # 應(yīng)用類型
    application/json
    application/javascript
    application/x-javascript
    application/xml
    application/xml+rss
    application/xhtml+xml
    application/atom+xml
    application/rss+xml
    # 字體類型
    application/font-woff
    application/font-woff2
    application/vnd.ms-fontobject
    application/x-font-ttf
    font/opentype
    font/woff
    font/woff2
    # 圖片類型(僅SVG,其他圖片已壓縮)
    image/svg+xml
    image/x-icon;

  # ==================== 代理相關(guān)配置 ====================

  # 針對代理請求的壓縮策略
  # any: 對所有代理請求都壓縮
  gzip_proxied any;

  # 其他可選值:
  # off: 禁止對代理請求壓縮
  # expired: 響應(yīng)頭包含Expires且已過期
  # no-cache: 響應(yīng)頭包含Cache-Control: no-cache
  # no-store: 響應(yīng)頭包含Cache-Control: no-store
  # private: 響應(yīng)頭包含Cache-Control: private
  # no_last_modified: 響應(yīng)頭不包含Last-Modified
  # no_etag: 響應(yīng)頭不包含ETag
  # auth: 請求頭包含Authorization
  # any: 所有代理請求

  # ==================== Vary頭配置 ====================

  # 在響應(yīng)頭中添加Vary: Accept-Encoding
  # 告訴代理服務(wù)器根據(jù)Accept-Encoding緩存不同版本
  gzip_vary on;

  # ==================== 排除特定客戶端 ====================

  # 禁止對特定User-Agent壓縮
  # 某些老舊瀏覽器對gzip支持有問題
  gzip_disable "MSIE [1-6].";

  # 也可以用正則排除更多
  # gzip_disable "MSIE [1-6].|Mozilla/4";
}

靜態(tài)預(yù)壓縮配置(gzip_static)

這是我強烈推薦的優(yōu)化方式,特別是對于前端構(gòu)建產(chǎn)物:

http {
  # 開啟靜態(tài)預(yù)壓縮
  # on: 查找.gz文件,找到就直接返回
  # off: 禁用
  # always: 始終返回.gz文件,不檢查客戶端是否支持
  gzip_static on;

  server {
    listen 80;
    server_name example.com;
    root /data/www;

    # 前端資源目錄
    location /assets/ {
      # 啟用靜態(tài)預(yù)壓縮
      gzip_static on;

      # 緩存控制
      expires 1y;
      add_header Cache-Control "public, immutable";
    }

    # API接口(實時壓縮)
    location /api/ {
      # API響應(yīng)需要實時壓縮
      gzip on;
      gzip_comp_level 5;
      gzip_types application/json;

      proxy_pass http://backend;
    }
  }
}

預(yù)壓縮文件生成腳本

#!/bin/bash
# generate_gzip.sh - 生成預(yù)壓縮文件

STATIC_DIR=${1:-/data/www/assets}
GZIP_LEVEL=${2:-9}

echo"開始生成預(yù)壓縮文件..."
echo"目錄:$STATIC_DIR"
echo"壓縮級別:$GZIP_LEVEL"

# 需要預(yù)壓縮的文件類型
FILE_TYPES="css js html json xml svg txt"

forextin$FILE_TYPES;do
  find"$STATIC_DIR"-name"*.$ext"-typef |whilereadfile;do
   # 跳過已經(jīng)是.gz的文件
    [["$file"== *.gz ]] &&continue

    gz_file="${file}.gz"

   # 如果.gz文件不存在或源文件更新,重新壓縮
   if[[ ! -f"$gz_file"]] || [["$file"-nt"$gz_file"]];then
     echo"壓縮:$file"
      gzip -${GZIP_LEVEL}-c"$file">"$gz_file"

     # 保持時間戳一致
      touch -r"$file""$gz_file"
   fi
 done
done

echo"預(yù)壓縮完成!"

# 統(tǒng)計壓縮效果
echo""
echo"=== 壓縮效果統(tǒng)計 ==="
find"$STATIC_DIR"-name"*.gz"-typef |whilereadgz_file;do
  orig_file="${gz_file%.gz}"
 if[[ -f"$orig_file"]];then
    orig_size=$(stat-c%s"$orig_file"2>/dev/null ||stat-f%z"$orig_file")
    gz_size=$(stat-c%s"$gz_file"2>/dev/null ||stat-f%z"$gz_file")
    ratio=$(echo"scale=2; (1 -$gz_size/$orig_size) * 100"| bc)
   echo"$orig_file:$orig_size->$gz_size(節(jié)省${ratio}%)"
 fi
done

2.3 啟動和驗證

配置檢查

# 檢查配置語法
nginx -t

# 查看gzip相關(guān)配置
nginx -T | grep -i gzip

# 重載配置
nginx -s reload

基礎(chǔ)驗證

# 測試gzip是否生效
# 注意:必須發(fā)送Accept-Encoding頭

# 不帶壓縮請求
curl -I http://localhost/test.html
# Content-Length: 1234 (原始大小)

# 帶壓縮請求
curl -I -H"Accept-Encoding: gzip"http://localhost/test.html
# Content-Encoding: gzip
# Content-Length: 456 (壓縮后大?。?# Vary: Accept-Encoding

# 獲取完整響應(yīng)并解壓
curl -H"Accept-Encoding: gzip"http://localhost/test.html | gunzip

詳細測試腳本

#!/bin/bash
# test_gzip.sh - 測試Gzip壓縮效果

URL=${1//localhost}
FILES=("test.html""jquery.js""data.json""style.css")

echo"=== Gzip壓縮效果測試 ==="
echo"目標:$URL"
echo""

printf"%-30s %10s %10s %10s
""文件""原始大小""壓縮大小""壓縮率"
printf"%-30s %10s %10s %10s
""----""--------""--------""------"

forfilein"${FILES[@]}";do
 # 獲取未壓縮大小
  orig_size=$(curl -sI"$URL/$file"2>/dev/null | grep -i content-length | awk'{print $2}'| tr -d'
')

 # 獲取壓縮后大小
  gzip_size=$(curl -sI -H"Accept-Encoding: gzip""$URL/$file"2>/dev/null | grep -i content-length | awk'{print $2}'| tr -d'
')

 # 檢查是否啟用了壓縮
  encoding=$(curl -sI -H"Accept-Encoding: gzip""$URL/$file"2>/dev/null | grep -i content-encoding)

 if[[ -n"$encoding"]] && [[ -n"$orig_size"]] && [[ -n"$gzip_size"]];then
    ratio=$(echo"scale=1; (1 -$gzip_size/$orig_size) * 100"| bc)
   printf"%-30s %10s %10s %9s%%
""$file""$orig_size""$gzip_size""$ratio"
 else
   printf"%-30s %10s %10s %10s
""$file""$orig_size""${gzip_size:-N/A}""未壓縮"
 fi
done

壓力測試對比

# 無壓縮測試
ab -n 10000 -c 100 http://localhost/jquery.js
# 記錄:Requests per second, Transfer rate

# 有壓縮測試
ab -n 10000 -c 100 -H"Accept-Encoding: gzip"http://localhost/jquery.js
# 記錄:Requests per second, Transfer rate

# 對比傳輸量和吞吐量的變化

三、示例代碼和配置

3.1 完整配置示例

生產(chǎn)環(huán)境完整配置

# /etc/nginx/conf.d/gzip-production.conf
# 生產(chǎn)環(huán)境Gzip完整配置

http {
  # ==================== Gzip全局配置 ====================

  # 基礎(chǔ)開關(guān)
  gzip on;

  # 壓縮級別:生產(chǎn)環(huán)境推薦5
  gzip_comp_level 5;

  # 最小壓縮大?。盒∮?KB的文件不壓縮
  gzip_min_length 1024;

  # 壓縮緩沖區(qū)配置
  # 16個8k的緩沖區(qū),適合中等大小文件
  gzip_buffers 16 8k;

  # HTTP版本
  gzip_http_version 1.1;

  # 啟用Vary頭
  gzip_vary on;

  # 對代理請求的處理
  gzip_proxied any;

  # 禁用對老舊IE的壓縮
  gzip_disable "MSIE [1-6].(?!.*SV1)";

  # 壓縮類型(完整列表)
  gzip_types
    # 文本
    text/plain
    text/css
    text/xml
    text/javascript
    text/x-component
    text/cache-manifest
    # 應(yīng)用
    application/json
    application/javascript
    application/x-javascript
    application/xml
    application/xml+rss
    application/xhtml+xml
    application/atom+xml
    application/rss+xml
    application/ld+json
    application/manifest+json
    application/schema+json
    application/geo+json
    application/vnd.api+json
    application/vnd.ms-fontobject
    application/x-font-ttf
    application/x-font-opentype
    application/x-font-truetype
    application/x-web-app-manifest+json
    # 字體
    font/eot
    font/opentype
    font/otf
    font/woff
    font/woff2
    # 圖片(僅矢量)
    image/svg+xml
    image/x-icon
    image/bmp
    image/vnd.microsoft.icon;

  # ==================== 靜態(tài)預(yù)壓縮 ====================

  # 全局開啟靜態(tài)預(yù)壓縮
  gzip_static on;
}

分場景配置示例

server {
  listen 80;
  server_name example.com;
  root /data/www;

  # ==================== 場景一:靜態(tài)資源CDN源站 ====================

  location /static/ {
    # 使用預(yù)壓縮文件(最高壓縮級別)
    gzip_static on;

    # 如果沒有預(yù)壓縮文件,實時壓縮
    gzip on;
    gzip_comp_level 6;

    # 長緩存
    expires 1y;
    add_header Cache-Control "public, immutable";
  }

  # ==================== 場景二:API響應(yīng)壓縮 ====================

  location /api/ {
    # API響應(yīng)通常是JSON,必須實時壓縮
    gzip on;
    gzip_comp_level 5;
    gzip_min_length 256; # API響應(yīng)可能較小,降低閾值
    gzip_types application/json;

    # 禁用代理緩存(API響應(yīng)經(jīng)常變化)
    add_header Cache-Control "no-store";

    proxy_pass http://api_backend;
    proxy_set_header Accept-Encoding ""; # 不讓后端壓縮,Nginx統(tǒng)一處理
  }

  # ==================== 場景三:HTML頁面 ====================

  location / {
    gzip on;
    gzip_comp_level 5;
    gzip_types text/html;

    # HTML不緩存,保證獲取最新內(nèi)容
    expires -1;
    add_header Cache-Control "no-cache, must-revalidate";

    try_files $uri $uri/ /index.html;
  }

  # ==================== 場景四:大文件下載 ====================

  location /downloads/ {
    # 大文件不壓縮,避免占用大量內(nèi)存和CPU
    gzip off;

    # 開啟sendfile高效傳輸
    sendfile on;
    tcp_nopush on;

    # 限速防止帶寬耗盡
    limit_rate 1m;
  }

  # ==================== 場景五:WebSocket ====================

  location /ws/ {
    # WebSocket不能使用gzip
    gzip off;

    proxy_pass http://websocket_backend;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
  }
}

3.2 實際應(yīng)用案例

案例一:電商網(wǎng)站首頁優(yōu)化

我們有個電商客戶,首頁HTML有800KB(包含大量商品數(shù)據(jù)),加載時間超過3秒。

優(yōu)化前的情況:

首頁大小: 812KB
加載時間: 3.2s(3G網(wǎng)絡(luò))
Gzip: 未啟用

優(yōu)化方案:

location / {
  gzip on;
  gzip_comp_level 6; # 首頁訪問頻繁,適當(dāng)提高壓縮級別
  gzip_types text/html application/json;
  gzip_min_length 256;

  # 啟用ETag便于緩存驗證
  etag on;

  try_files $uri @backend;
}

location @backend {
  proxy_pass http://backend;

  # 后端響應(yīng)也要壓縮
  gzip on;
  gzip_proxied any;
}

優(yōu)化后:

首頁大小: 812KB -> 156KB(壓縮率81%)
加載時間: 3.2s -> 0.8s
帶寬節(jié)省: 約80%

案例二:API服務(wù)壓縮優(yōu)化

某金融APP后端API,每天數(shù)千萬次調(diào)用,返回JSON數(shù)據(jù)。

問題分析:

平均響應(yīng)大小: 15KB
日請求量: 5000萬次
日帶寬消耗: 約700TB
帶寬成本: 高

配置方案:

upstream api_servers {
  server 10.0.1.10:8080;
  server 10.0.1.11:8080;
  keepalive 100;
}

server {
  listen 80;
  server_name api.example.com;

  location / {
    # JSON響應(yīng)壓縮
    gzip on;
    gzip_comp_level 5;
    gzip_min_length 512;
    gzip_types application/json;
    gzip_proxied any;
    gzip_vary on;

    proxy_pass http://api_servers;
    proxy_http_version 1.1;
    proxy_set_header Connection "";

    # 重要:告訴后端不要壓縮,統(tǒng)一由Nginx處理
    proxy_set_header Accept-Encoding "identity";

    # 緩沖設(shè)置,避免邊收邊發(fā)
    proxy_buffering on;
    proxy_buffer_size 4k;
    proxy_buffers 8 32k;
  }
}

優(yōu)化效果:

平均響應(yīng)大小: 15KB -> 3KB(壓縮率80%)
日帶寬消耗: 700TB -> 140TB
月度帶寬成本節(jié)省: 約560TB * 單價
CPU增加: 約15%(可接受)

案例三:前端構(gòu)建產(chǎn)物預(yù)壓縮

現(xiàn)代前端項目使用Webpack/Vite構(gòu)建,結(jié)合CI/CD自動生成預(yù)壓縮文件。

Vite配置:

// vite.config.js
import{ defineConfig }from'vite'
importviteCompressionfrom'vite-plugin-compression'

exportdefaultdefineConfig({
plugins: [
  viteCompression({
  algorithm:'gzip',
  ext:'.gz',
  threshold:1024, // 大于1KB才壓縮
  deleteOriginFile:false// 保留原文件
  }),
 // 同時生成Brotli壓縮
  viteCompression({
  algorithm:'brotliCompress',
  ext:'.br',
  threshold:1024
  })
 ]
})

Nginx配置:

location /assets/ {
  # 優(yōu)先返回Brotli壓縮(壓縮率更高)
  brotli_static on;

  # 其次返回Gzip
  gzip_static on;

  # 如果都沒有,實時壓縮
  gzip on;
  gzip_comp_level 5;

  expires max;
  add_header Cache-Control "public, immutable";
}

CI/CD pipeline腳本:

#!/bin/bash
# build.sh - 前端構(gòu)建腳本

# 構(gòu)建
npm run build

# 生成預(yù)壓縮文件
cddist

# Gzip壓縮
find . -typef ( -name"*.js"-o -name"*.css"-o -name"*.html"-o -name"*.json") 
  -execgzip -9 -k {} ;

# Brotli壓縮(如果安裝了brotli)
ifcommand-v brotli &> /dev/null;then
  find . -typef ( -name"*.js"-o -name"*.css"-o -name"*.html"-o -name"*.json") 
    -execbrotli -9 -k {} ;
fi

# 統(tǒng)計
echo"=== 壓縮統(tǒng)計 ==="
du -sh dist/
find dist -name"*.gz"| wc -l
find dist -name"*.br"| wc -l

案例四:不同壓縮級別性能對比測試

我在一臺4核8G的服務(wù)器上做了詳細測試,文件是280KB的jquery.min.js:

壓縮級別 壓縮后大小 壓縮率 壓縮耗時 QPS
1 98KB 65% 0.8ms 12000
2 94KB 66% 0.9ms 11500
3 91KB 67% 1.1ms 10800
4 88KB 69% 1.4ms 9500
5 85KB 70% 1.8ms 8200
6 84KB 70% 2.5ms 6800
7 83KB 70% 3.8ms 5200
8 82KB 71% 6.2ms 3500
9 82KB 71% 12ms 1800
預(yù)壓縮 82KB 71% 0ms 35000

結(jié)論:

級別5是性價比最高的選擇

級別6-9收益遞減明顯,不推薦

預(yù)壓縮性能碾壓實時壓縮,強烈推薦

四、最佳實踐和注意事項

4.1 最佳實踐

1. 根據(jù)內(nèi)容類型選擇壓縮策略

# 高頻訪問的靜態(tài)資源:預(yù)壓縮
location ~* .(js|css)$ {
  gzip_static on;
  gzip on;
  gzip_comp_level 5;
}

# 動態(tài)生成的內(nèi)容:實時壓縮
location /api/ {
  gzip on;
  gzip_comp_level 5;
}

# 已壓縮的媒體文件:不壓縮
location ~* .(jpg|jpeg|png|gif|mp4|webm|zip|gz)$ {
  gzip off;
}

2. 合理設(shè)置gzip_min_length

# 太小的文件壓縮后可能反而變大(gzip頭部開銷)
# 推薦設(shè)置:
gzip_min_length 1024; # 通用場景

# API場景可以降低閾值(JSON通常較小但壓縮率高)
gzip_min_length 256;

3. gzip_vary必須開啟

# 必須開啟,否則CDN/代理可能返回錯誤的緩存
gzip_vary on;

# 這會在響應(yīng)頭添加:
# Vary: Accept-Encoding
# 告訴緩存服務(wù)器:同一URL根據(jù)Accept-Encoding返回不同內(nèi)容

4. 統(tǒng)一在Nginx層壓縮

# 不要讓后端應(yīng)用也壓縮,會造成:
# 1. 重復(fù)壓縮浪費CPU
# 2. 壓縮策略不統(tǒng)一
# 3. 調(diào)試困難

location /api/ {
  proxy_pass http://backend;

  # 告訴后端不要壓縮
  proxy_set_header Accept-Encoding "identity";

  # 由Nginx統(tǒng)一壓縮
  gzip on;
  gzip_proxied any;
}

5. 監(jiān)控壓縮效果

# 自定義日志格式記錄壓縮信息
log_format compression '$remote_addr - $remote_user [$time_local] '
           '"$request" $status $body_bytes_sent '
           '"$http_referer" "$http_user_agent" '
           '$gzip_ratio';

# $gzip_ratio 顯示壓縮比例,如 "2.50"表示壓縮到原來的1/2.5

4.2 注意事項

常見錯誤表

錯誤 原因 解決方案
gzip不生效 請求頭缺少Accept-Encoding 檢查客戶端/代理是否移除了該頭
壓縮率低 文件已壓縮或內(nèi)容隨機性高 檢查文件類型,已壓縮文件不要重復(fù)壓縮
CPU飆高 壓縮級別過高或并發(fā)過大 降低壓縮級別或使用預(yù)壓縮
響應(yīng)變慢 gzip_buffers配置不當(dāng) 增大緩沖區(qū)或降低壓縮級別
CDN緩存異常 未設(shè)置Vary頭 開啟gzip_vary on
部分請求未壓縮 小于gzip_min_length 降低閾值或接受不壓縮
亂碼 客戶端不支持gzip 使用gzip_disable排除

性能陷阱

# 陷阱1:對所有內(nèi)容都壓縮
# 錯誤
gzip_types *;
# 正確:只壓縮文本類型

# 陷阱2:壓縮級別設(shè)置過高
# 錯誤
gzip_comp_level 9; # CPU殺手
# 正確
gzip_comp_level 5; # 性價比最高

# 陷阱3:不限制最小壓縮大小
# 錯誤
gzip_min_length 0; # 所有文件都壓縮
# 正確
gzip_min_length 1024; # 小文件不壓縮

# 陷阱4:對圖片視頻壓縮
# 錯誤
gzip_types image/jpeg image/png video/mp4;
# 這些格式已經(jīng)壓縮過,再壓縮只浪費CPU

# 陷阱5:沒有預(yù)壓縮高頻文件
# 錯誤:每次請求都實時壓縮
# 正確:構(gòu)建時預(yù)壓縮 + gzip_static on

安全考慮

# BREACH攻擊防護
# 對包含敏感信息的HTTPS響應(yīng),攻擊者可能通過壓縮率變化推測內(nèi)容
# 防護方案:
# 1. 對包含敏感數(shù)據(jù)的響應(yīng)禁用壓縮
location /api/sensitive/ {
  gzip off;
}

# 2. 在響應(yīng)中添加隨機填充
# 需要后端配合實現(xiàn)

# 3. 使用SameSite Cookie
add_header Set-Cookie "session=xxx; SameSite=Strict";

五、故障排查和監(jiān)控

5.1 故障排查

問題一:Gzip完全不生效

# 排查步驟

# 1. 檢查模塊是否加載
nginx -V 2>&1 | grep -o'http_gzip_module'

# 2. 檢查配置是否生效
nginx -T | grep gzip

# 3. 測試請求
curl -I -H"Accept-Encoding: gzip"http://localhost/test.html

# 4. 如果響應(yīng)頭沒有Content-Encoding: gzip,檢查:
# - gzip是否為on
# - 文件類型是否在gzip_types中
# - 文件大小是否大于gzip_min_length
# - 是否被gzip_disable規(guī)則排除

# 5. 查看錯誤日志
tail -f /var/log/nginx/error.log

問題二:部分文件未壓縮

# 常見原因:MIME類型不在gzip_types中

# 檢查文件MIME類型
file --mime-type test.json
# application/json

# 檢查Nginx的MIME配置
cat /etc/nginx/mime.types | grep json

# 確保gzip_types包含該類型
nginx -T | grep gzip_types

問題三:壓縮后文件變大

# 小文件或高熵內(nèi)容壓縮后可能變大

# 檢查原始文件大小
ls -la test.html

# 如果小于1KB,提高gzip_min_length
# 或者檢查文件內(nèi)容是否已壓縮/隨機數(shù)據(jù)

問題四:CPU占用過高

# 檢查壓縮級別
nginx -T | grep gzip_comp_level

# 查看Nginx進程CPU
top -p $(pgrep -d','nginx)

# 解決方案:
# 1. 降低壓縮級別
# 2. 使用預(yù)壓縮
# 3. 增加gzip_min_length
# 4. 限制壓縮類型

調(diào)試腳本

#!/bin/bash
# debug_gzip.sh - Gzip配置調(diào)試

URL=$1
if[ -z"$URL"];then
 echo"用法:$0"
 exit1
fi

echo"=== Gzip調(diào)試:$URL==="
echo""

echo"--- 請求頭 ---"
curl -sI"$URL"| head -20

echo""
echo"--- 帶Accept-Encoding的請求 ---"
curl -sI -H"Accept-Encoding: gzip, deflate""$URL"| head -20

echo""
echo"--- 關(guān)鍵響應(yīng)頭 ---"
echo"Content-Encoding:$(curl -sI -H 'Accept-Encoding: gzip' "$URL" | grep -i content-encoding)"
echo"Content-Length (原始):$(curl -sI "$URL" | grep -i content-length)"
echo"Content-Length (壓縮):$(curl -sI -H 'Accept-Encoding: gzip' "$URL" | grep -i content-length)"
echo"Vary:$(curl -sI -H 'Accept-Encoding: gzip' "$URL" | grep -i vary)"

echo""
echo"--- 內(nèi)容類型 ---"
echo"Content-Type:$(curl -sI "$URL" | grep -i content-type)"

5.2 性能監(jiān)控

Nginx狀態(tài)監(jiān)控

# 啟用狀態(tài)頁
location /nginx_status {
  stub_status on;
  allow 127.0.0.1;
  deny all;
}

壓縮率日志

# 記錄壓縮比例
log_format gzip_log '$remote_addr [$time_local] "$request" '
          '$status $body_bytes_sent '
          'gzip_ratio=$gzip_ratio '
          'rt=$request_time';

access_log /var/log/nginx/gzip.log gzip_log;

分析腳本

#!/bin/bash
# analyze_gzip.sh - 分析Gzip壓縮效果

LOG_FILE=${1:-/var/log/nginx/gzip.log}

echo"=== Gzip壓縮效果分析 ==="
echo""

echo"--- 壓縮比例分布 ---"
awk'{
  for(i=1;i<=NF;i++) {
? ? ? ? if($i ~ /gzip_ratio=/) {
? ? ? ? ? ? split($i, a, "=")
? ? ? ? ? ? ratio = a[2]
? ? ? ? ? ? if (ratio == "-") {
? ? ? ? ? ? ? ? none++
? ? ? ? ? ? } else if (ratio < 1.5) {
? ? ? ? ? ? ? ? low++
? ? ? ? ? ? } else if (ratio < 3) {
? ? ? ? ? ? ? ? medium++
? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? high++
? ? ? ? ? ? }
? ? ? ? }
? ? }
}
END {
? ? total = none + low + medium + high
? ? printf "未壓縮: %d (%.1f%%)
", none, none/total*100
? ? printf "低壓縮(<1.5x): %d (%.1f%%)
", low, low/total*100
? ? printf "中壓縮(1.5-3x): %d (%.1f%%)
", medium, medium/total*100
? ? printf "高壓縮(>3x): %d (%.1f%%)
", high, high/total*100
}'$LOG_FILE

echo""
echo"--- 按文件類型統(tǒng)計 ---"
awk'{
  # 提取URL和壓縮比
  url = $5
  gsub(/"/, "", url)
  for(i=1;i<=NF;i++) {
? ? ? ? if($i ~ /gzip_ratio=/) {
? ? ? ? ? ? split($i, a, "=")
? ? ? ? ? ? ratio = a[2]
? ? ? ? }
? ? }

? ? # 提取擴展名
? ? n = split(url, parts, ".")
? ? ext = parts[n]
? ? n = split(ext, parts, "?")
? ? ext = parts[1]

? ? if (ratio != "-" && ratio > 0) {
    count[ext]++
    sum[ext] += ratio
  }
}
END {
  printf "%-10s %10s %15s
", "類型", "請求數(shù)", "平均壓縮比"
  for (ext in count) {
    printf "%-10s %10d %15.2f
", ext, count[ext], sum[ext]/count[ext]
  }
}'$LOG_FILE| sort -t$'	'-k2 -rn

Prometheus監(jiān)控指標

# prometheus.yml 抓取配置
scrape_configs:
-job_name:'nginx'
 static_configs:
  -targets:['localhost:9113']

# 自定義指標(需要nginx-prometheus-exporter)
# nginx_http_requests_total
# nginx_connections_active
# nginx_connections_reading
# nginx_connections_writing

5.3 備份與恢復(fù)

配置備份

#!/bin/bash
# backup_gzip_config.sh

BACKUP_DIR="/backup/nginx/gzip"
DATE=$(date +%Y%m%d)

mkdir -p$BACKUP_DIR

# 備份gzip相關(guān)配置
nginx -T | grep -A 100'gzip'>$BACKUP_DIR/gzip_config_$DATE.txt

# 備份完整配置
cp -r /etc/nginx/conf.d/$BACKUP_DIR/conf.d_$DATE/

# 保留30天
find$BACKUP_DIR-mtime +30 -delete

echo"備份完成:$BACKUP_DIR"

快速回滾

#!/bin/bash
# rollback_gzip.sh - 回滾到默認gzip配置

cat > /etc/nginx/conf.d/gzip.conf <

六、總結(jié)

6.1 技術(shù)要點回顧

Gzip壓縮優(yōu)化的核心就是這幾點:

選對壓縮級別:生產(chǎn)環(huán)境用5-6,別用9

選對壓縮類型:只壓縮文本類,別碰圖片視頻

用好預(yù)壓縮:高頻訪問的靜態(tài)資源必須預(yù)壓縮

開啟Vary頭:gzip_vary on必須有

統(tǒng)一入口壓縮:在Nginx層統(tǒng)一處理,后端不壓縮

關(guān)鍵配置速記:

gzip on;
gzip_comp_level 5;
gzip_min_length 1024;
gzip_types text/plain text/css application/json application/javascript;
gzip_vary on;
gzip_static on;

6.2 進階學(xué)習(xí)方向

Brotli壓縮:比Gzip壓縮率高15-20%,現(xiàn)代瀏覽器都支持

Zstd壓縮:Facebook開源的新一代壓縮算法

動態(tài)壓縮級別:根據(jù)CPU負載動態(tài)調(diào)整壓縮級別

邊緣壓縮:在CDN邊緣節(jié)點進行壓縮

6.3 參考資料

Nginx Gzip模塊文檔:https://nginx.org/en/docs/http/ngx_http_gzip_module.html

Gzip vs Brotli對比:https://www.keycdn.com/blog/brotli-compression

HTTP壓縮機制RFC:https://tools.ietf.org/html/rfc7231#section-3.1.2.2

BREACH攻擊說明:https://breachattack.com/

附錄

A. 命令速查表

命令 說明
gzip -9 file.js 壓縮文件(最高級別)
gzip -k file.js 壓縮并保留原文件
gzip -l file.js.gz 查看壓縮信息
gunzip file.js.gz 解壓文件
zcat file.js.gz 查看壓縮文件內(nèi)容
curl -I -H "Accept-Encoding: gzip" URL 測試gzip是否生效

B. 配置參數(shù)詳解

參數(shù) 默認值 說明
gzip off 開啟/關(guān)閉gzip
gzip_comp_level 1 壓縮級別1-9
gzip_min_length 20 最小壓縮大?。ㄗ止?jié))
gzip_buffers 32 4k 壓縮緩沖區(qū)配置
gzip_types text/html 壓縮的MIME類型
gzip_vary off 是否添加Vary頭
gzip_proxied off 代理請求壓縮策略
gzip_disable - 禁用壓縮的User-Agent
gzip_http_version 1.1 啟用壓縮的最低HTTP版本
gzip_static off 靜態(tài)預(yù)壓縮開關(guān)

C. 術(shù)語表

術(shù)語 解釋
Gzip GNU zip,一種基于DEFLATE算法的壓縮格式
DEFLATE 結(jié)合LZ77和霍夫曼編碼的壓縮算法
Content-Encoding HTTP響應(yīng)頭,指示內(nèi)容的編碼方式
Accept-Encoding HTTP請求頭,告知服務(wù)器客戶端支持的編碼
Vary HTTP響應(yīng)頭,指示緩存應(yīng)根據(jù)哪些請求頭區(qū)分響應(yīng)
Transfer-Encoding 傳輸編碼,chunked表示分塊傳輸
MIME Type 多用途互聯(lián)網(wǎng)郵件擴展類型,標識內(nèi)容格式
Brotli Google開發(fā)的新一代壓縮算法,壓縮率優(yōu)于Gzip

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 算法
    +關(guān)注

    關(guān)注

    23

    文章

    4810

    瀏覽量

    98604
  • 字符串
    +關(guān)注

    關(guān)注

    1

    文章

    596

    瀏覽量

    23218
  • nginx
    +關(guān)注

    關(guān)注

    0

    文章

    194

    瀏覽量

    13223

原文標題:Nginx Gzip壓縮配置指南:流量節(jié)省60%的秘密

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    nginx中的sendfile配置說明

    nginx配置sendfile及詳細說明
    發(fā)表于 05-05 08:08

    如何使用GZip的比特流完成重新配置

    我正在開發(fā)一個具有大型遠程可升級比特流和慢速閃存寫入速度的項目。這些比特流使用普通文件壓縮(pkzip,gzip等)傳送。我想將更新的比特流以壓縮格式存儲在閃存上,并使用多引導(dǎo)方法引導(dǎo)它們
    發(fā)表于 05-29 17:12

    nginx錯誤頁面配置

    16、nginx 錯誤頁面配置nginx錯誤頁面包括404 403 500 502 503 504等頁面,只需要在server中增加以下配置即可: error_page404 403
    發(fā)表于 07-26 06:54

    主要學(xué)習(xí)下nginx的安裝配置

    主要學(xué)習(xí)下nginx的安裝配置,以便于后續(xù)學(xué)習(xí)。以下在本地虛擬機上搭建學(xué)習(xí)。1、檢查系統(tǒng)網(wǎng)絡(luò)是否能連通公網(wǎng):ping www.taobao.com2、確認yum源是否配置好,用于下載安裝環(huán)境基礎(chǔ)包
    發(fā)表于 10-19 14:12

    JAVA教程之用GZIP壓縮解壓文件

    JAVA教程之用GZIP壓縮解壓文件,很好的JAVA的資料,快來學(xué)習(xí)吧
    發(fā)表于 04-11 17:28 ?6次下載

    Nginx 常見應(yīng)用技術(shù)指南

    Nginx 常見應(yīng)用技術(shù)指南
    發(fā)表于 09-07 14:42 ?6次下載
    <b class='flag-5'>Nginx</b> 常見應(yīng)用技術(shù)<b class='flag-5'>指南</b>

    運行nginx所需的最低配置

    運行nginx所需的最低配置: # /etc/nginx/nginx.confevents {} # event context have to be defined to consi
    的頭像 發(fā)表于 08-23 10:53 ?6083次閱讀

    python解壓tar/gzip/zip格式壓縮

    創(chuàng)建一個 gzip 格式的壓縮包(gzip 的輸入,只能是一個文件,而不能是一個目錄)
    的頭像 發(fā)表于 04-07 17:00 ?2556次閱讀

    Spring Boot+Filter實現(xiàn)Gzip壓縮超大json對象

    請求廣告保存接口時先將Json對象字符串進行GZIP壓縮,那請求時傳入的就是壓縮后的數(shù)據(jù),而GZIP壓縮效率是很高的,因此可以大大減小傳輸
    的頭像 發(fā)表于 12-01 10:18 ?1508次閱讀

    Nginx常用的配置和基本功能講解

    Nginx 已經(jīng)廣泛應(yīng)用于 J-one 和 Jdos 的環(huán)境部署上,本文對 Nginx 的常用的配置和基本功能進行講解,適合 Nginx 入門學(xué)習(xí)。
    的頭像 發(fā)表于 05-04 10:25 ?1568次閱讀

    深入淺出了解華為云 API 網(wǎng)關(guān)的 Gzip 功能

    ? Gzip 是什么 Gzip 是一種用于數(shù)據(jù)壓縮的編碼格式,經(jīng)常被使用在基于 HTTP 協(xié)議的網(wǎng)絡(luò)傳輸中。Gzip 功能允許服務(wù)器在傳輸數(shù)據(jù)是對其進行
    的頭像 發(fā)表于 11-12 17:36 ?1020次閱讀
    深入淺出了解華為云 API 網(wǎng)關(guān)的 <b class='flag-5'>Gzip</b> 功能

    如何使用gzip壓縮和解壓縮技術(shù)

    Nginx是一款高性能的Web服務(wù)器,它也能夠充當(dāng)反向代理服務(wù)器和負載均衡器。在Web應(yīng)用開發(fā)中,優(yōu)化網(wǎng)站速度是一個非常重要的工作。使用gzip壓縮和解壓縮技術(shù),可以有效減小傳輸文件的
    的頭像 發(fā)表于 09-29 15:57 ?1515次閱讀

    nginx負載均衡配置介紹

    目錄 nginx負載均衡 nginx負載均衡介紹 反向代理與負載均衡 nginx負載均衡配置 Keepalived高可用nginx負載均衡器
    的頭像 發(fā)表于 11-10 13:39 ?1743次閱讀
    <b class='flag-5'>nginx</b>負載均衡<b class='flag-5'>配置</b>介紹

    深度解析Nginx Gzip指令:優(yōu)化網(wǎng)站性能與加速加載速度的關(guān)鍵工具

    快,當(dāng)然相比較之下體驗會更好。 IT成本上 對這個場景來說的成本主要是帶寬成本, 數(shù)據(jù)不壓縮那么傳輸這些數(shù)據(jù)相應(yīng)的帶寬肯定更大,對比之下壓縮耗費的CPU資源在帶寬費用上不值一提。 所以你有什么理由不用壓縮呢? 背景 當(dāng)然
    的頭像 發(fā)表于 02-12 11:06 ?1027次閱讀

    Nginx配置終極指南

    更新。性能是 Nginx 最重要的考量,其占用內(nèi)存少、并發(fā)能力強、能支持高達 5w 個并發(fā)連接數(shù),最重要的是, Nginx 是免費的并可以商業(yè)化,配置使用也比較簡單。
    的頭像 發(fā)表于 06-18 15:56 ?1237次閱讀
    <b class='flag-5'>Nginx</b><b class='flag-5'>配置</b>終極<b class='flag-5'>指南</b>
    门源| 化德县| 页游| 绥滨县| 苏尼特右旗| 名山县| 临夏市| 松溪县| 赣榆县| 兴业县| 宁城县| 天津市| 翁源县| 大埔区| 尚志市| 兴安县| 旬阳县| 五原县| 石渠县| 务川| 图们市| 漯河市| 辰溪县| 大渡口区| 临安市| 当涂县| 内乡县| 邵武市| 建湖县| 磴口县| 靖州| 龙里县| 阳山县| 龙海市| 前郭尔| 泸溪县| 南宫市| 休宁县| 竹山县| 凤冈县| 蓝田县|