编译 Nginx 时使用 --modules-path 参数指定动态模块(.so)安装路径,不影响静态模块;需配合配置文件中绝对路径的 load_module 指令加载,且确保工作用户有读权限。

在编译 Nginx 时指定自定义的模块安装路径,核心是使用 --modules-path 参数。这个参数只影响动态模块(.so 文件)的存放位置,对静态编译进主程序的模块无效。
--modules-path 控制动态模块的安装目标
- 它决定
make install阶段把哪些文件复制到哪:所有通过--add-module=引入的第三方模块,或以=dynamic方式启用的官方模块(如--with-http_xslt_module=dynamic),都会被编译为.so文件,并复制到该路径下。 - 不指定
--modules-path时,动态模块默认落在--prefix目录下的modules/子目录中,例如/opt/nginx/modules/。 - 显式设置后,路径完全由你控制,比如:
./configure --prefix=/opt/nginx --modules-path=/usr/lib64/nginx/modules
执行
make install后,ngx_http_v2_module.so等动态模块就会出现在/usr/lib64/nginx/modules/。
配合 load_module 指令才能真正加载
-
--modules-path只管“装到哪”,不负责“怎么用”。 - Nginx 运行时必须在配置文件中用
load_module指令显式加载,且路径必须是绝对路径:load_module /usr/lib64/nginx/modules/ngx_http_echo_module.so;
- 该路径需确保 nginx 工作用户(如
nginx或www-data)有读取权限,否则启动失败并报permission denied。
静态模块不受 --modules-path 影响
- 像
--with-http_ssl_module、--with-http_gzip_static_module这类未加=dynamic的选项,模块代码直接编译进nginx二进制文件,不生成独立.so,因此--modules-path对它们无意义。 - 若想统一管理,建议将第三方模块全部按动态方式编译,便于后续增删和版本隔离。
实际操作小提醒
- 先创建目标目录并赋权,避免
make install失败:sudo mkdir -p /usr/lib64/nginx/modules sudo chown $USER:$USER /usr/lib64/nginx/modules
- 编译完成后,可用以下命令确认模块路径是否生效:
/opt/nginx/sbin/nginx -V 2>&1 | grep "modules-path" ls /usr/lib64/nginx/modules/
不复杂但容易忽略


















