Nginx的模块是被静态编译到Web Server里面的,因为Nginx的代码量也就十万行左右,编译并不需要多少时间;另外Nginx支持代码热切换,所以这并不是什么问题。Nginx模块开发同Apache非常类似,我想Nginx的作者应该非常精通Aapche吧。
默认情况下,Nginx包括如下模块(在objs/ngx_modules.c目录下)
我一直很好奇Nginx如何使用epoll,所以看了看epoll相关的代码。epoll模块结构非常之简单,通过它可以看到Nginx一个模块应该是什么样子的,但是epoll做的事情确实Nginx的一个核心所在,它源源不断地提供各种事件驱动程序。
epoll模块只有一个参数,那就是指定epoll_wait的events参数。所以它的conf结构体非常简单:
epoll的ngx_epoll_create_conf和ngx_epoll_init_conf都非常简单,只是在初始化上面这个ngx_epoll_conf_t结构体。
ngx_epoll_module的定义如下:
可以看出ngx_epoll_module 的类型是NGX_EVENT_MODULE,它属于ngx_events_module的子模块,而ngx_events_module又是ngx_core_module的子模块。这种层次关系决定了读取配置的顺序,模块的初始化是一个递归的关系。比如ngx_core_module初始化ngx_events_module,ngx_events_module就必须负责初始化ngx_epoll_module。
ngx_conf_parse这个函数先使用ngx_conf_read_token读取配置数据,然后再使用ngx_conf_handler找到合适的模块,并循环调用它的commands数组中的每个函数。因为ngx_epoll_commands只有一个ngx_conf_set_num_slot函数。
Nginx有很多这样的slot函数,这个slot实现很简单,代码如下:
ngx_epoll_moduled的create_conf和init_conf也都非常之简单,create_conf负责在内存池中申请一个ngx_epoll_conf_t结构体,init_conf则判断结构体events这个成员变量是否被初始化过了,如果没有的话就将其设置成512。
ngx_epoll_module的配置虽然很简单,但是它要做的事情却不少,看看它的ctx结构体就知道了。
呵呵,感觉讲得乱七八糟的,只有看源代码才能理解个中关系。Nginx是一个精品程序,值得细细品味。自己才刚刚起步而已,加油啊~