Nginx 动态模块配置指南(以 Brotli 模块为例)

Nginx 动态模块配置指南(以 Brotli 模块为例)


前置要求

  1. Nginx 1.9.11+(推荐 1.19+)
  2. 已安装开发工具链:sudo apt install build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev(Debian/Ubuntu)
  3. 当前运行的 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:多模块依赖

处理方式

  1. 按正确顺序加载模块:
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"

解决方法

  1. 确认 load_module 指令在配置顶部
  2. 确保模块文件路径正确

错误 3:缺少依赖库

log 复制代码
error while loading shared libraries: libbrotlienc.so.1

解决方法

bash 复制代码
# 安装 Brotli 开发库
sudo apt install libbrotli-dev

错误 4:重复压缩配置

log 复制代码
content encoding error

解决方法

  • 避免同时启用 gzipbrotli 的动态压缩
  • 使用预压缩静态文件方案:
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. 浏览器验证


六、维护建议

  1. 使用版本控制系统管理模块文件:
bash 复制代码
# 保存模块版本信息
md5sum /usr/share/nginx/modules/*.so > nginx_modules_checksum.txt
  1. 创建更新脚本模板:
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/

# 编译安装新模块
...
相关推荐
Arya_aa4 小时前
四:部署前端和后端
nginx
Java面试题总结5 小时前
一文搞定 Linux Nginx 从安装、启动到 nginx.conf 全配置详解(新手也能看懂)
linux·运维·nginx
MiNG MENS19 小时前
nginx 代理 redis
运维·redis·nginx
珊瑚怪人20 小时前
一个域名问题
nginx
dxdz1 天前
一文搞定 Linux Nginx 从安装、启动到 nginx.conf 全配置详解(新手也能看懂)
nginx
遇见火星1 天前
Nginx 负载均衡配置模板:轮询、权重、IP哈希、最少连接
tcp/ip·nginx·负载均衡
untE EADO1 天前
Nginx代理到https地址忽略证书验证配置
运维·nginx·https
Treh UNFO1 天前
nginx的重定向
大数据·数据库·nginx
理人综艺好会1 天前
nginx了解
运维·nginx
likeGhee1 天前
docker创建nginx+keepalived+nacos集群(仅测试环境)
nginx·docker