Nginx自定义模块需用C语言实现标准接口并源码编译,依赖gcc、PCRE、zlib和OpenSSL开发包;需编写config脚本和符合规范的C文件(含指令数组、模块上下文、模块结构体及handler函数);最后通过--add-module编译集成并验证。

编写 Nginx 自定义模块本质是源码级集成,不是改配置或加插件那么简单。它要求你用 C 语言实现标准接口,配合 config 脚本,和 Nginx 源码一起编译。只要结构写对、依赖齐备、编译路径正确,一个基础模块几分钟就能跑起来。
准备编译环境与依赖
必须装齐四类底层依赖:
- gcc:C 编译器,用于构建模块和 Nginx 主体
- PCRE:支持正则表达式(如 location 匹配)
- zlib:用于 gzip 压缩相关功能
- OpenSSL(可选但推荐):启用 HTTPS 支持
确认这些库的开发包已安装(例如 Ubuntu 上需安装 libpcre3-dev、zlib1g-dev、libssl-dev),否则 configure 阶段会报错。
组织模块目录与 config 文件
在任意位置新建模块目录,例如:~/ngx_http_hello_module。该目录下必须包含:
- config 文件:纯文本脚本,告诉 Nginx 如何识别并编译你的模块。内容示例:
ngx_addon_name=ngx_http_hello_module HTTP_MODULES="$HTTP_MODULES ngx_http_hello_module" NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_hello_module.c"
注意变量名大小写敏感,$ngx_addon_dir 是 Nginx 构建系统自动注入的路径变量,不能硬编码。
编写符合规范的 C 源文件
核心是定义三个结构体:
-
指令数组(
ngx_command_t[]):声明配置指令,比如hello,并绑定解析函数 -
模块上下文(
ngx_http_module_t):8 个回调指针,多数可置为 NULL(如仅做响应处理,只需填postconfiguration或留空) -
模块结构体(
ngx_module_t):全局唯一变量,类型设为NGX_HTTP_MODULE,指定指令数组和上下文地址
处理逻辑写在 handler 函数里,例如返回 “Hello World”,需手动设置状态码、响应头、构造 buffer 并调用 ngx_http_send_header() 和 ngx_http_output_filter()。
编译集成与验证
进入 Nginx 源码根目录,执行:
./configure --add-module=/path/to/ngx_http_hello_module make && sudo make install
然后检查:
-
nginx -t:确认配置语法无误,且模块已加载(不会报 “unknown directive”) - 在
nginx.conf的 location 块中加入你定义的指令(如hello;) - 重启 Nginx,用 curl 访问对应路径,观察是否返回预期响应


















