Nginx 官方无内置单元测试框架,也不含 check 模块;所谓“check 模块”实为第三方 nginx_upstream_check_module,用于 upstream 主动健康检查,非单元测试工具。

Nginx 本身不内置单元测试框架,官方源码中也没有 check 模块这个标准组件。你提到的 “check 模块” 很可能是指第三方健康检查模块 —— nginx_upstream_check_module(常简称为 upstream_check_module 或 nginx-check),它用于为 upstream 组提供主动健康检查功能(如定期发 HTTP HEAD 请求探测后端是否存活)。
⚠️ 需要明确一点:
该模块不提供、也不参与 Nginx 源码编译阶段的“单元测试”。它是一个功能扩展模块,作用是增强 upstream 的高可用能力,和单元测试(unit test)在目的、机制、执行时机上完全不同。
下面分两部分帮你理清:
? 1. nginx_upstream_check_module 是什么?怎么用?
这是一个由淘宝(Tengine 团队)开源的第三方模块,用于给 upstream 块添加主动健康检查能力(类似 HAProxy 的 health check)。
✅ 编译启用方式(非单元测试)
# 下载 Nginx 源码(例如 nginx-1.24.0) # 下载 check 模块(注意版本兼容性,推荐匹配 Nginx 主版本) git clone https://github.com/yaoweibin/nginx_upstream_check_module.git # 编译时加入模块(--add-module=路径) ./configure \ --add-module=/path/to/nginx_upstream_check_module \ --prefix=/usr/local/nginx \ ... # 其他配置项 make && make install
✅ 配置示例(启用健康检查)
upstream backend {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
# 启用主动检查
check interval=3 rise=2 fall=5 timeout=1 type=http;
check_http_send "HEAD /health HTTP/1.0\r\n\r\n";
check_http_expect_alive http_2xx http_3xx;
}
server {
location /status {
check_status; # 提供检查状态页(需搭配模块提供的指令)
}
}? 注意:
check_status指令仅在启用模块且配置了check后才生效;访问/status可查看各后端节点的实时健康状态。
? 2. Nginx 源码有单元测试吗?怎么运行?
Nginx 官方没有提供传统意义上的单元测试套件(如 pytest / gtest),但提供了:
-
回归测试框架(
tests/目录):基于 Perl 脚本(t/下的.t文件),模拟 HTTP 请求/响应,验证配置解析、模块行为、协议处理等。 - 这些测试属于集成/功能测试层级,不是 C 函数级单元测试。
✅ 运行 Nginx 自带测试的方法:
# 进入 Nginx 源码目录 cd nginx-1.24.0 # 确保已安装 Perl 和 Test::Nginx(常用模块) cpan Test::Nginx # 运行全部测试(需先编译,不需要 install) make prove -r tests/ # 或只跑某类测试,例如: prove tests/t/http/headers.t
⚠️
nginx_upstream_check_module本身不包含在官方 tests 中。若你使用的是该模块,其作者未提供配套的t/测试用例;部分 fork 版本可能有简单测试,但非标准流程。
? 如果你真想对自定义模块做单元测试?
那需要你自己构建测试环境,常见做法包括:
- 使用
Cmocka、Check(C 语言单元测试框架)编写测试用例; - 将模块逻辑解耦为独立函数(避免强依赖 Nginx 核心宏/结构体);
- 编写 mock 的
ngx_*接口(如ngx_log_error、ngx_palloc); - 编译成可执行测试程序(而非
.so模块),单独运行。
但这已超出“Nginx 编译阶段使用 check 模块做单元测试”的范畴,属于模块开发者级别的工程实践。
不复杂但容易忽略:check 模块 ≠ 单元测试工具;它是生产环境用的功能模块。Nginx 自身测试靠 prove + Test::Nginx,而模块级单元测试得自己搭。


















