1. 项目概述
最近在排查线上服务问题时,经常需要快速统计各个接口的访问量。虽然Nginx本身有access日志,但实时性不够,而且每次都要写awk脚本分析太麻烦。于是决定自己动手开发一个简单的Nginx模块,直接在内存中统计HTTP请求的流量情况。
这个模块的核心功能很简单:记录每个URI的访问次数和流量大小。但通过这个入门级的模块开发,可以掌握Nginx模块开发的基本流程和关键点。下面我就把整个开发过程记录下来,包括踩过的坑和优化技巧。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 开发环境准备
2.1 基础环境配置
首先需要准备Nginx的开发环境。我使用的是Ubuntu 20.04系统,Nginx版本是1.18.0。选择这个版本是因为它比较稳定,而且API变化不大。
安装开发依赖:
bash复制sudo apt-get install build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev
下载Nginx源码:
bash复制wget http://nginx.org/download/nginx-1.18.0.tar.gz
tar zxvf nginx-1.18.0.tar.gz
注意:最好保持开发环境和线上环境的Nginx版本一致,避免出现兼容性问题。
2.2 模块目录结构
Nginx模块的标准目录结构如下:
code复制ngx_http_traffic_stats_module/
├── config
└── ngx_http_traffic_stats_module.c
config文件是模块的编译配置,.c文件是模块的源码。这个简单的模块只需要这两个文件就够了。
3. 模块核心实现
3.1 模块定义结构
每个Nginx模块都需要定义一个ngx_module_t结构体。这是我们模块的入口:
c复制ngx_module_t ngx_http_traffic_stats_module = {
NGX_MODULE_V1,
&ngx_http_traffic_stats_module_ctx, /* module context */
ngx_http_traffic_stats_commands, /* module directives */
NGX_HTTP_MODULE, /* module type */
NULL, /* init master */
NULL, /* init module */
NULL,
