Nginx 动态模块配置指南(以 Brotli 模块为例)
前置要求
- Nginx 1.9.11+(推荐 1.19+)
 - 已安装开发工具链:
sudo apt install build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev(Debian/Ubuntu) - 当前运行的 Nginx 版本号必须与模块编译版本一致
 
一、标准安装流程
1. 获取 Nginx 版本信息
            
            
              bash
              
              
            
          
          nginx -v
# 示例输出:nginx version: nginx/1.18.0 (Ubuntu)
        2. 下载对应版本源码
            
            
              bash
              
              
            
          
          nginx_version=$(nginx -v 2>&1 | awk -F/ '{print $2}')
wget http://nginx.org/download/nginx-${nginx_version}.tar.gz
tar zxvf nginx-${nginx_version}.tar.gz
        3. 下载 Brotli 模块源码
            
            
              bash
              
              
            
          
          git clone --recursive https://github.com/google/ngx_brotli.git
cd ngx_brotli && git submodule update --init && cd ..
        4. 编译动态模块
            
            
              bash
              
              
            
          
          cd nginx-${nginx_version}
./configure --with-compat --add-dynamic-module=../ngx_brotli
make modules
        5. 安装模块
            
            
              bash
              
              
            
          
          sudo cp objs/ngx_http_brotli_filter_module.so /usr/share/nginx/modules/
sudo cp objs/ngx_http_brotli_static_module.so /usr/share/nginx/modules/
        6. 加载模块配置
创建 /etc/nginx/modules-enabled/50-mod-http-brotli.conf:
            
            
              nginx
              
              
            
          
          load_module /usr/share/nginx/modules/ngx_http_brotli_filter_module.so;
load_module /usr/share/nginx/modules/ngx_http_brotli_static_module.so;
        7. 配置 Brotli 压缩
在 nginx.conf 的 http 上下文中:
            
            
              nginx
              
              
            
          
          brotli on;
brotli_comp_level 6;
brotli_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
        8. 验证与重载
            
            
              bash
              
              
            
          
          sudo nginx -t && sudo systemctl reload nginx
curl -I -H 'Accept-Encoding: br' http://localhost | grep -i content-encoding
        二、不同场景处理
场景 1:自定义编译参数
解决方案:
            
            
              bash
              
              
            
          
          # 获取当前编译参数
nginx -V 2>&1 | grep configure
# 在新编译时加入原有参数
./configure [原参数] --with-compat --add-dynamic-module=../ngx_brotli
        场景 2:多模块依赖
处理方式:
- 按正确顺序加载模块:
 
            
            
              nginx
              
              
            
          
          load_module modules/ngx_http_brotli_filter_module.so;
load_module modules/ngx_http_headers_more_filter_module.so;
        场景 3:与 Gzip 共存
推荐配置:
            
            
              nginx
              
              
            
          
          gzip on;
brotli on;
# 优先使用 Brotli(现代浏览器)
brotli_static on;
gzip_static on;
        三、常见错误与解决方案
错误 1:版本不匹配
            
            
              log
              
              
            
          
          module is not binary compatible
        解决方法:
- 使用 
nginx -v获取确切版本 - 下载对应版本的 Nginx 源码重新编译
 
错误 2:模块加载顺序错误
            
            
              log
              
              
            
          
          unknown directive "brotli"
        解决方法:
- 确认 
load_module指令在配置顶部 - 确保模块文件路径正确
 
错误 3:缺少依赖库
            
            
              log
              
              
            
          
          error while loading shared libraries: libbrotlienc.so.1
        解决方法:
            
            
              bash
              
              
            
          
          # 安装 Brotli 开发库
sudo apt install libbrotli-dev
        错误 4:重复压缩配置
            
            
              log
              
              
            
          
          content encoding error
        解决方法:
- 避免同时启用 
gzip和brotli的动态压缩 - 使用预压缩静态文件方案:
 
            
            
              nginx
              
              
            
          
          brotli_static on;
gzip_static on;
        四、高级优化配置
1. 预压缩静态文件
            
            
              bash
              
              
            
          
          # 生成预压缩文件
find /var/www/html -type f -name '*.css' -exec brotli -kf {} \;
        2. 调整压缩参数
            
            
              nginx
              
              
            
          
          brotli_window 1m;
brotli_min_length 20;
brotli_buffers 16 8k;
        3. 排除特定 User-Agent
            
            
              nginx
              
              
            
          
          map $http_user_agent $no_brotli {
    default          0;
    "~MSIE [4-6]\." 1;
    "~SV1"           1;
}
brotli on;
brotli_bypass $no_brotli;
        五、验证方法
1. 命令行测试
            
            
              bash
              
              
            
          
          curl -H 'Accept-Encoding: br' -I http://localhost | grep -i content-encoding
# 验证预压缩文件
curl -H 'Accept-Encoding: br' -I http://localhost/style.css | grep -i vary
        2. 浏览器验证
- Chrome DevTools:Network → Headers → Response Headers
 - 使用 tools.keycdn.com/brotli-test 在线检测
 
六、维护建议
- 使用版本控制系统管理模块文件:
 
            
            
              bash
              
              
            
          
          # 保存模块版本信息
md5sum /usr/share/nginx/modules/*.so > nginx_modules_checksum.txt
        - 创建更新脚本模板:
 
            
            
              bash
              
              
            
          
          #!/bin/bash
NGINX_VERSION=$(nginx -v 2>&1 | awk -F/ '{print $2}')
MODULE_DIR="/usr/share/nginx/modules"
# 自动备份旧模块
cp ${MODULE_DIR}/ngx_http_brotli_* ${MODULE_DIR}/backup/
# 编译安装新模块
...