Nginx Master 进程不处理运行时模块加载冲突,因模块必须静态编译;所谓“冲突”实为三类配置/启动问题:引用未编译指令、load_module 重复或路径/兼容性错误、模块间指令重名。

Nginx 的 Master 进程本身不处理模块加载冲突,因为它根本不会在运行时加载或校验模块——所有模块必须在编译阶段静态链接,不存在“加载冲突”这一运行时概念。
真正需要关注的,是配置层面的模块启用冲突和启动阶段的模块可用性问题。Master 进程只在启动初期做两件事:解析配置、初始化已编译模块。它不执行动态加载,也不做模块兼容性检查,因此所谓“模块加载冲突”,实际表现为以下三类可定位、可修复的问题:
配置中引用了未编译的模块指令
多个 load_module 指令指向同一模块或路径错误
虽然 Nginx 支持 `load_module` 加载动态模块(.so 文件),但该操作仅由 Master 在配置解析早期完成,且有严格限制: - 同一模块不能重复 `load_module`(否则报 `module already loaded`) - 路径不存在、权限不足、架构不匹配(如 32/64 位混用)、符号缺失(如依赖 OpenSSL 版本不对)都会导致 `nginx -t` 或启动失败 - 错误日志通常出现在 `/www/wwwlogs/nginx_error.log` 末尾,例如: `dlopen() "/usr/lib/nginx/modules/ngx_http_geoip2_module.so" failed (undefined symbol: ngx_stream_script_init_arrays)`模块间功能覆盖或指令重名(隐性冲突)
两个第三方模块若定义了同名配置指令(如都声明 `geoip2`),Master 在解析时会因指令注册冲突而终止,报类似: `nginx: [emerg] duplicate directive "geoip2"` - 这类冲突不会在编译期暴露,只在 `nginx -t` 阶段触发 - 解决关键:检查所有 `load_module` 引入的 .so 文件是否来自兼容版本;避免混用不同分支(如 OpenResty 与官方 Nginx 混搭);优先使用统一构建链路产出的模块不复杂但容易忽略。


















