运行时报“libbrotlidec.so.1 not found”说明模块已编译但运行时找不到动态库;需用ldd验证链接、readelf检查rpath是否写入,再通过ld_library_path或/etc/ld.so.conf.d/配置系统级库路径。

编译时加了 Brotli 支持,但 Nginx 启动报 error while loading shared libraries: libbrotlidec.so.1: cannot open shared object file,说明模块已编译进 Nginx,但运行时系统找不到 Brotli 的动态库。这不是 Nginx 配置或模块加载语法的问题,而是 Linux 动态链接器(ld-linux-x86-64.so.2)在启动时无法定位依赖的共享库。
确认 Brotli 模块是否真连上了库
先验证模块二进制本身有没有正确链接到 Brotli 库:
- 运行:
ldd /usr/local/nginx/modules/ngx_http_brotli_filter_module.so | grep brotli - 如果输出类似
libbrotlidec.so.1 => not found,说明模块没链接上——可能是 configure 时--with-cc-opt/--with-ld-opt没配对,或-L/opt/brotli/lib路径写错 - 如果输出是
libbrotlidec.so.1 => /opt/brotli/lib/libbrotlidec.so.1 (0x...),说明链接成功,问题出在运行时路径未生效
检查 rpath 是否写入模块文件
Nginx 模块是独立的 .so 文件,它自身的 DT_RUNPATH 决定它能否自动找到依赖库(不依赖全局环境变量):
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- 运行:
readelf -d /usr/local/nginx/modules/ngx_http_brotli_filter_module.so | grep -E 'RUNPATH|RPATH' - 若无输出,说明编译时没加
-Wl,-rpath,/opt/brotli/lib;需重新 configure,显式添加:./configure --add-dynamic-module=../ngx_brotli \--with-ld-opt="-Wl,-rpath,/opt/brotli/lib" - 若有输出且路径正确(如
0x000000000000001d (RUNPATH) Library runpath: [/opt/brotli/lib]),则跳过此步
让系统级加载器能找到库
即使模块没带 rpath,也可通过系统机制补救:
-
临时验证:启动前设环境变量:
LD_LIBRARY_PATH=/opt/brotli/lib nginx -t -
永久生效(推荐):新建配置文件
/etc/ld.so.conf.d/brotli.conf,内容只写一行:/opt/brotli/lib,然后执行sudo ldconfig - 验证是否生效:
ldconfig -p | grep brotli应能列出libbrotlidec.so.1
注意 Nginx 启动用户与权限
某些场景下,Nginx 主进程由 root 启动,但 worker 进程降权为 nobody 或 www-data,而 LD_LIBRARY_PATH 不会继承给子进程(尤其 systemd 管理时):
- systemd 用户:编辑
/usr/lib/systemd/system/nginx.service,在[Service]下加:Environment="LD_LIBRARY_PATH=/opt/brotli/lib",再systemctl daemon-reload && systemctl restart nginx - 手动启动:确保所有调用(
nginx -t、nginx)都在同一环境变量下执行










