November
24th,
2010
了解了nginx的模块化结构和进程关系之后,可以知道在worker进程的主循环里面,nginx实际上在循环处理一个个IO事件,那么具体的业务处理模块是怎么挂接进这个框架呢?
以http为例,在模块初始化时,ngx_http_commands
中定义了函数ngx_http_block()
,该函数负责读取http模块的配置指令,根据指令监听端口,初始化各个数据结构。
static ngx_command_t ngx_http_commands[] = {
{ ngx_string("http"),
NGX_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,
ngx_http_block,
0,
0,
NULL },
ngx_null_command
};
同时,ngx_http_block
将ngx_http_init_connection()
函数挂接进ngx_listening_s
的handler。 这个handler在event模块执行accept之后被调用。
struct ngx_listening_s {
ngx_socket_t fd;
struct sockaddr *sockaddr;
socklen_t socklen; /* size of sockaddr */
size_t addr_text_max_len;
ngx_str_t addr_text;
int type;
int backlog;
int rcvbuf;
int sndbuf;
/* handler of accepted connection */
ngx_connection_handler_pt handler;
整个流程见下图: