Nginx 模块开发介绍
主流的Nginx模块开发方式一般有两种:
一种是结合Lua语言 openresty
一种是结合JavaScript语言 Nginx JavaScript
同时还有一些采用其他语言的开发方式,eg. Perl , C
本文介绍的是基于C语言的原生Nginx模块开发方式
以下来自官方说明,虽然官方更加推荐采用JavaScript,Lua等高级语言来开发模块,扩展功能,确实采用这些高级语言更加简单高效,但是由于Nginx本身就是C语言开发的,采用C语言来开发模块更能深入学习理解Nginx,所以了解一下C语言原生模块开发的基本知识,有利于深入学习Nginx。
Before starting a module, consider the following questions:
- Is it possible to implement a desired feature using already available modules?
- Is it possible to solve an issue using built-in scripting languages, such as Perl or njs?
Nginx 模块开发学习路线
前置知识:需要对Nginx有基本的了解,可以配置简单的Nginx服务器
推荐路线:官方开发指南 ——> nginx-dev-examples ——> write the code yourself
首先可以通读一遍 官方开发指南,了解Nginx工作流程 。这篇指南大概有一百页左右,预计读完需要四天的时间。指南前面部分简单介绍Nginx开发环境,重点在于后面这 Modules, HTTP 两部分。
看完官方指南之后接着可以仔细阅读官方的示例 nginx-dev-examples。官方精心编写了 access, append, hello_world, md5, set_header 等示例,建议仔细阅读每个示例,弄清楚每行代码的意思,如果通读过上述官方指南,基本上每行代码一眼就能明白其含义。
最后参考官方示例,自己编写几个例子。到此为止,已经初步入门Nginx模块开发,后续需要继续深入学习哪些知识,此时您应该可以做到心中有数!
Nginx 官方模块学习实践
编译官方模块首先需要搭建起一个Nginx编译环境,具体可以参考 Nginx 源码编译安装
克隆官方模块仓库到本地
hg clone http://hg.nginx.org/nginx-dev-examples
进入Nginx源码模块,配置将模块编译成动态库的形式,这里官方的 hello_world_3 示例来演示
./configure --add-dynamic-module=/home/lotuscc/git_projects/nginx_module/nginx-dev-examples/hello_world_3
编译Nginx, 只编译模块使用 make modules
make
编译完成以后可以在objs目录下看到,已经生成了 ngx_http_hello_world_module.so 动态库
将官方模块配置文件复制到objs目录下,并添加一行加载动态模块
load_module objs/ngx_http_hello_world_module.so;
因为官方配置文件自定义了log位置,所以还需要创建一个logs目录
mkdir logs
启动Nginx
objs/nginx -p "$PWD" -c objs/nginx.conf
测试
关闭
objs/nginx -p "$PWD" -c objs/nginx.conf -s stop