Linux下编写Nginx自定义模块本质是源码级集成,需配齐编译工具链、PCRE、zlib、OpenSSL等依赖,组织含config文件的模块目录,定义命令、上下文、模块三类结构体,并通过configure--add-module编译进二进制。

Linux 下编写 Nginx 自定义模块,本质是源码级集成——不是改配置、也不是加插件,而是把你的 C 代码和 Nginx 源码一起编译进最终的二进制文件。只要环境配对、结构写准、编译流程走通,一个最简 handler 模块几分钟就能生效。
装齐底层依赖,确保 configure 能过
缺任何一项,configure 阶段就会中断报错(比如 “the HTTP rewrite module requires the PCRE library”)。必须提前安装:
-
编译工具链:Ubuntu/Debian 运行
sudo apt install -y build-essential;CentOS/RHEL/AlmaLinux 运行sudo dnf groupinstall -y "Development Tools" -
PCRE 开发包:支持正则匹配与
rewrite指令,Ubuntu 装libpcre3-dev,RHEL 系装pcre-devel -
zlib 开发包:启用
gzip压缩功能,对应zlib1g-dev或zlib-devel -
OpenSSL 开发包:HTTPS 和 HTTP/2 必需,装
libssl-dev或openssl-devel
验证方式:检查 /usr/include/openssl/ssl.h、/usr/include/pcre.h 等头文件是否存在。
组织模块目录,必须含 config 文件
Nginx 不识别“裸”C 文件。每个自定义模块必须满足两个硬性条件:
- 根目录下存在
config文件,声明模块类型、依赖头文件路径、参与编译的源码文件等。例如最简ngx_http_hello_module/config内容为:ngx_addon_name=ngx_http_hello_module<br>HTTP_MODULES="$HTTP_MODULES ngx_http_hello_module"<br>NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_hello_module.c"
- 模块路径使用绝对路径或相对于 Nginx 源码目录的相对路径,如
--add-module=../ngx_http_hello_module - 若模块依赖外部库(如 LuaJIT、MaxMindDB),对应开发包(
libluajit-5.1-dev、libmaxminddb-dev)也需已安装
编写标准模块骨架,三类核心结构缺一不可
所有 Nginx 模块都必须定义三个结构体,这是加载和调用的基础:
-
命令结构
ngx_command_t[]:声明配置指令(如hello),绑定解析函数,指定作用域(NGX_HTTP_LOC_CONF表示可在 location 块中使用) -
上下文结构
ngx_http_module_t:定义模块生命周期钩子(如create_loc_conf、merge_loc_conf),多数简单模块可全置为NULL -
模块结构
ngx_module_t:注册模块元信息,包括名称、类型(NGX_HTTP_MODULE)、命令数组、上下文指针等
处理逻辑写在 handler 函数里(如 ngx_http_hello_handler),它接收 ngx_http_request_t * 参数,可读取 URI、参数、头信息,也可直接构造响应并返回。
编译安装并验证是否真正加载
进入 Nginx 源码目录后执行:
-
./configure --prefix=/usr/local/nginx --add-module=/path/to/your/module --with-http_ssl_module(按需启用其他核心模块) make && sudo make install- 验证模块是否编译进二进制:
/usr/local/nginx/sbin/nginx -V 2>&1 | grep -o "your_module_name" - 验证配置语法和模块可调用:
/usr/local/nginx/sbin/nginx -t,再在nginx.conf中添加对应指令(如location /hello { hello; }),重启后访问测试


















