熟悉Nginx,为Nginx编写插件(一)

最近打算写几篇关于Nginx插件开发的文章。
有人肯定要问我,怎么老是喜欢写插件,一会儿是php的,一会儿是apache的,现在又是Nginx的了。这怎么说呢,其实为linux写应用程序,可以理解成为linux写插件,就算你要写操作系统,同样也可以称之为“为CPU写插件”。为某个东西写插件,还不如说是要更加深入地了解这个东西呢。Nginx本身小巧,研究它其实都可以对整个代码扫通了,我们从中一定能学到人家的长处。
这次连载计划写成,第一篇,内核简介 第二篇,hello world 第三篇,模块配置 第四篇,一个实例。

当然,本文结尾处我也要推荐一篇国外高手写的文章,其实我很想把它翻译成中文,但这要等有时间的时候才能做,忙啊~~~
本文原地址:http://www.hoverlees.com/blog/?p=322

Nginx是近两年才出来的高性能WebServer服务器,俄罗斯人开发,在我印象里,俄罗斯人搞的软件很牛X,他们在破解软件上也很牛X,唯一的缺点,就是语言的通用性不够牛X,不够大众…
Nginx特性:

  • Nginx非常快,非常省资源,网上有大量的Nginx性能测试数据,这儿就不多说了。还有一个开源的WebServer叫Cherokee,自称比Nginx更强劲的,不过这个没做太多研究。
  • Nginx直接集成反向代理功能,为大型的web应用提供负载均衡的保证。
  • Nginx本身非常小,整个Server其实就一个2M多的执行程序加上配置文件。
  • Nginx配置非常直观,配置就跟写脚本一样。
  • Nginx依赖的PCRE库,在文本处理上具有很强的功能,虽然Nginx本身主要是拿来做重定向的,但正则表达式在文本处理应用中的重要性和普遍性,相信所有做过Web的人都认同。
  • Nginx又依赖了OpenSSL库,数据安全方面又有保障,可以拿来做CS/BS架构应用项目的服务器(只需为Ngnix写插件而不用自己去实现网络协议),如OA系统,当下流行的网页游戏服务器,SNS游戏等。

Nginx的模块不像其它应用的扩展那样,是动态链接的,Nginx的模块是跟它的源代码一起直接编译到执行文件中,当然如果想让它可以动态链接外部库,只需要为Nginx写一个不是很难的模块即可实现。
Nginx主要的类型和常量定义在/src/core目录下的多个头文件中,对于这样小巧的工程,这些头文件定义的东西都值得去了解。

核心头文件主要分为以下几类:

  • 高效数据算法 包含数组,哈希表,队列,树等高效算法的实现,这些定义在ngx_array.h,ngx_hash.h,ngx_queue.h,ngx_radix_tree.h等头文件中。
  • 存储管理 包含内存池管理,输出链表等,在ngx_palloc.h,ngx_slab.h等头文件中定义。
  • 运行状态 包含运行信息,配置管理,连结管理,日志操作,在ngx_cycle,ngx_conf_file,ngx_connection.h,ngx_log.h 等头文件中定义。
  • 字符串处理 包含数据格式化,PCRE上层封装,时间处理,CRC校验,hash字符串等,在头文件ngx_strings.h,ngx_parse.h,ngx_times.h,ngx_crc.h,ngx_md5.h等中定义。
  • 平台不相关的上层类型定义,这个基本上头文件里都会有些。

作为一个模块,其实已经进入到了Nginx内部,所以权力是很大的,所以一定要保证模块的稳定性,否则一不注意就是Segment Fault.Nginx这个模块体系可以说是软件开发建模的一个典范,或许这样设计只是为了他们自己开发的方便,当初并没有想过给第三方的开发,但这样的设计无疑是提高他们自己效率的。

模块的启动,实际上是在配置文件里配置的,我上面提到过,配置文件就像写脚本一样直观和简单,下面是个简单的配置文件:

http {
gzip  on;
server {
listen       80;
server_name  localhost;

location / {
root   html;
index  index.html index.htm;
}
}
}

其中 http,server,location后面都跟了一个中括号,称为“配置路径”,在ngx_conf_file.h中有定义,域可以为NGX_HTTP_MAIN_CONF, NGX_HTTP_SRV_CONF, NGX_HTTP_LOC_CONF, NGX_HTTP_UPS_CONF,这样的配置很直观,很有层次感,模块也是建立在这种层次感之上的。
然后是里面的配置,如gzip on,gzip其实是一个命令(command),on是它的参数。下面的所有均是如此,命令即是由模块提供的!包括下面的listen,server_name等等。location /说明当服务器收到/的请求时,执行哪些命令而已。

Nginx模块知道怎么执行了,最后就是了解模块本身了,模块包括以下几种:

  • 处理模块 提供命令并完成请求输出的模块
  • 过滤模块 过滤HTTP头,BODY等数据
  • 均衡模块 反向代理时使用,自带的Round-Robin 和 IP-Hash方式已经挺不错,也可以添加更多的方式,比如说,随机访问方式。

本文大致描述了Nginx系统,下一篇文章将介绍处理模块的具体写法并写一个Hello World模块。
英文好一点的可参考下面的文章,会给更大的帮助。
http://www.evanmiller.org/nginx-modules-guide.html

Join the Conversation

6 Comments

Leave a Reply to dah2o

Your email address will not be published. Required fields are marked *

  1. hello,很喜欢你的兔子,想到小时候那会的小狮子和大眼夹,希望多多交流!

  2. 你好,linux使用常规环境,GCC+MAKE+autotools.
    windows上可以使用mingw,编译之前选好事件模型.
    nginx依赖pcre,openssl,zlib库.