# ============================================================
# Nginx Gzip 压缩配置示例
# ============================================================
#
# 功能说明:
# - 响应内容压缩
# - 减少传输带宽
# - 可配置压缩级别和类型
#
# Lolly 对应配置:
# server:
#   compression:
#     type: "gzip"
#     level: 6
#     min_size: 1024
#     gzip_static: false
#     gzip_static_extensions: [".gz", ".br"]
#     types:
#       - "text/html"
#       - "text/css"
#       - "text/javascript"
#       - "application/json"
#       - "application/javascript"
# ============================================================

http {
    server {
        listen 80;
        server_name gzip.example.com;

        # Gzip 基础配置
        # Lolly 对应: compression 配置块

        # 启用 Gzip
        gzip on;

        # 压缩级别（1-9）
        # 1: 最快，压缩率最低
        # 9: 最慢，压缩率最高
        # 推荐: 4-6（平衡性能和压缩率）
        # Lolly 对应: compression.level: 6
        gzip_comp_level 6;

        # 最小压缩大小
        # 小于此值不压缩（压缩反而增加大小）
        # Lolly 对应: compression.min_size: 1024
        gzip_min_length 1024;

        # 压缩类型
        # 指定需要压缩的 MIME 类型
        # Lolly 对应: compression.types
        gzip_types text/plain text/css text/xml text/javascript application/json application/javascript application/xml application/xml+rss application/x-javascript image/svg+xml;

        # 压缩变体
        gzip_vary on;  # 添加 Vary: Accept-Encoding 头

        # 压缩缓冲
        gzip_buffers 16 8k;  # 16 个 8KB 缓冲区

        # HTTP 版本
        gzip_http_version 1.1;  # 仅 HTTP/1.1 以上启用

        # 禁用 IE6 压缩（IE6 有 bug）
        gzip_disable "msie6";

        # 预压缩文件支持
        # 自动查找 .gz 文件
        # Lolly 对应: compression.gzip_static: true
        gzip_static on;

        location / {
            root /var/www/html;
        }

        # 静态资源（预压缩优化）
        location /assets {
            # 预压缩文件优先
            gzip_static on;

            root /var/www/assets;
        }

        # API 响应压缩
        location /api {
            gzip_types application/json;
            gzip_min_length 256;  # API 响应较小，降低阈值

            proxy_pass http://backend:8080;
        }
    }
}

# Gzip 说明:
#
# 1. 压缩级别选择:
#    - 静态内容（CSS/JS）: 建议预压缩，级别 9
#    - 动态内容: 建议 4-6，平衡性能
#    - 实时响应: 建议 1-3，降低延迟
#
# 2. 预压缩文件:
#    - 预先使用 gzip -9 压缩
#    - 文件名: file.js.gz
#    - nginx 直接返回预压缩文件
#    - 避免实时压缩开销
#
# 3. MIME 类型:
#    - 图片/视频通常已压缩，不需要再压缩
#    - 文本类型收益最大
#    - 注意压缩 JSON API 响应
#
# 4. Vary 头:
#    - Vary: Accept-Encoding
#    - 告知缓存服务器根据 Accept-Encoding 缓存不同版本
#    - 防止给不支持 gzip 的客户端返回压缩内容
#
# 5. 生成预压缩文件:
#    gzip -9 -k file.js  # 保留原文件，生成 file.js.gz
#    brotli --best file.js  # 生成 file.js.br