[开发记录]Nginx模块开发(一)
引言:最近实习由于项目需要,为了追求稳定性加上烤鱼利用Nginx本身提供的优秀的基础设施,使用了Nginx提供的一些扩展功能来做Nginx本身的开发。
Nginx提供了很强的可以自己定制扩展功能的“插件式”扩展,在需要加钩子的地方构造回调函数来完成相应功能(说起来容易做起来难)。
Nginx可以提供三种方式的模块扩展:
1.Handler方式处理HTTP请求
2.Filter方式对于输出的HTTP做过滤,可以加解密或其他功能等
3.Load Balancer,作为HTTP方向代理时候的负载均衡所用
由于项目原因,暂时使用的是Handler方式,不过大多数场景下也是使用了Handler方式
Nginx处理HTTP请求的时候,Nginx模块通过读取配置文件的参数找到相应的钩子函数
比如我们的模块是一个取得日志文件的Nginx模块,以HTTP POST方式
按照Nginx模块的命名规则就是 ngx_http_get_log_module
比如在Nginx模块的配置文件 nginx/conf/nginx.conf server 段中增加如下选项
location /get_log {
get_log on;
}
在模块编写完成后在 ./configure 的时候加上--add-module=/yourdir/ngx_http_get_log_module.c 选项
在模块中与 ngx_http_get_log_module.c 中编写配置文件config
ngx_addon_name=ngx_http_get_log_module
HTTP_MODULES="$HTTP_MODULES ngx_http_get_log_module"
NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_get_log_module.c"
在编译的时候 ./configure --add-module=/yourdir/ngx_http_get_log_module
make &&make install
然后再用HTTP方式测试,client端可以用浏览器或者是其他的第三方库来做
我利用的是python的 urllib2 做HTTP POST的