Nginx http端口监听_C/C++_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > C/C++ > Nginx http端口监听

Nginx http端口监听

 2011/1/12 8:43:10  bollaxu  http://bollaxu.javaeye.com  我要评论(0)
  • 摘要:server{}block里面的"listen"指令调用了ngx_http_core_listen()函数ngx_http_core_listen(...){ngx_http_core_srv_conf_t*cscf=conf;ngx_http_listen_opt_tlsopt;/*根据配置的参数设置lsopt*///...ngx_http_add_listen(cf,cscf,&lsopt);}ngx_http_add_listen(...)
  • 标签:Nginx 监听

server {} block里面的"listen"指令调用了ngx_http_core_listen()函数

?

ngx_http_core_listen(...)
{
	ngx_http_core_srv_conf_t *cscf = conf;
	ngx_http_listen_opt_t   lsopt;

	/*根据配置的参数设置lsopt*/
	//...

	ngx_http_add_listen(cf, cscf, &lsopt);
}

ngx_http_add_listen(...)
{
	cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);
	//...

	port = ngx_array_push(cmcf->ports);
	ngx_http_add_address(cf, cscf, port, lsopt);
}
ngx_http_add_address(...)
{
	ngx_http_conf_addr_t  *addr;
	addr = ngx_array_push(&port->addrs);
	//...
	ngx_http_add_server(cf, cscf, addr);
}

ngx_http_add_server(...)
{
	ngx_http_core_srv_conf_t  **server;
	server = ngx_array_push(&addr->servers);
	*server = cscf;
}
?

可以看到,上面的几个函数基本上就是把当前server的ngx_http_core_srv_conf_t关联到port->addrs->servers和port->addrs->default_server,而每个port又是cmcf->ports的一员。

在http_block()函数的最后会调用到ngx_http_optimize_servers(cf, cmcf, cmcf->ports)。

?

ngx_http_optimize_servers(...)
{
	//对于每个cmcf->ports的成员port[p]
	for(;;){
		//...
		ngx_http_init_listening(cf, &port[p]);
	}
}?
ngx_http_init_listening(...)
{
	addr = port->addrs.elts;
	//对于port的每个addr[i]
	while(...){
		//...
		//从cf->cycle->listening数组分配内存给ls并初始化(如ls->handler,ls->sockaddr等)
		ls = ngx_http_add_listening(cf, &addr[i]);
		hport = ngx_pcalloc(cf->pool, sizeof(ngx_http_port_t));
		ls->servers = hport;
		//把addr[i]的default_server关联到hport(即ls->servers)的成员addrs
		ngx_http_add_addrs(cf, hport, addr);
		//...
	}
}
??

注:上面的函数都是在http_block()里面调用的,比如当在http{...} block里面解析到server{...},又会继续在server{...} block解析,当解析到"listen"的时候, 调用了ngx_http_core_listen()。

而整个的配置读取和解析, 是在main()函数的ngx_init_cycle()里面调用了ngx_conf_parse()。

在上面的配置解析完之后, 在ngx_init_cycle()里面又调用了ngx_open_listening_sockets()创建、bind()和listen() socket。

在之后每个子进程中, ls->fd会被关联到一个connection并添加到事件监听?(如果获得mutex);?monospace; line-height: 18px;">ngx_http_init_request()中,ls->servers就被用来找到处理请求的那个server{...}?block的cscf。





发表评论
用户名: 匿名