监听socket初始化

主要在俩块内容中用到socket的初始化部分,第一块是在ngx_http_core_srv函数中,在最后设置默认的监听套接口时有把监听socket添加进去,第二块是在ngx_http_block的最后,把配置文件的socket添加进去

1.结构信息:
一个port可以对应多个addr,可有多个server监听同一个addr:port,所以在addr中比较重要的几个成员如下:
default_server,该端口默认的server
servers:所有在该端口下监听的server
hash:server name为key,ngx_http_core_srv_conf_t为value的哈希表
2.解析配置文件,获取监听socket信息
用于设置监听socket的指令有俩个,server_name和listen,前者用于设置每个server的虚拟主机名,后者用于设置socket信息,
1》前者对应的函数为ngx_http_core_server_name,它的作用是将server_name指定的虚拟主机名字添加到ngx_http_core_srv_conf_t中的server_names数组中,其实他就相当于一个域名的存在
ps:server_name的配置举例:
server_name jb51.net;比如http://jb51.net的请求就会转发到该主机
server_name jb51.net www.jb51.net;http://www.jb51.net
server_name *.jb51.net;设置该主机处理所有来自jb51.net的子域名,比如www.jb51.net,blog.jb51.net等
2》socket对应得函数是ngx_http_core_listen函数
该函数负责解析listen指令配置项的socket配置信息,并且保存这些值,在函数的最后调用ngx_http_add_listen函数添加监听socket信息
cscf->listen=1
//一旦采用了listen指令就代表要使用相应的配置信息,如果他为0的话,那么就要在Ngx_http_core_srv函数中配置默认的监听信息

value = cf->args->elts;

ngx_memzero(&u, sizeof(ngx_url_t));

u.url = value[1];
u.listen = 1;
u.default_port = 80;

if (ngx_parse_url(cf->pool, &u) != NGX_OK) {
if (u.err) {
ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
“%s in \”%V\” of the \”listen\” directive”,
u.err, &u.url);
}

return NGX_CONF_ERROR;  

}
//解析listen指令的url,ip和端口号信息
初始化ngx_http_listen_opt_t结构体,它里面存储着一些基本的socket选项,比如常见的recbuf,sndbuf,backlog,而后调用ngx_sock_ntop把二进制的地址转化为文本格式存入ngx_http_listen_opt_t结构体。
最后调用ngx_http_add_listen函数添加监听socket信息
ngx_http_add_listen的实现:
a.如果ports为NULL(不为空,就是说已经解析了一个listern),则为ngx_http_core_module的ngx_http_core_main_conf_t.ports分配ngx_http_conf_port
b.通过lsopt获取端口信息赋值给变量p
c.这段代码是遍历ports数组,查看新添加的端口信息是否已经存在,如果该端口信息存在则调用ngx_http_add_addresses函数在对应的端口结构上添加地址信息。否则,在prots数组中添加一个元素,并初始化,
d.查找port->addrs数组中是否已经添加了该ip,如果是,则调用ngx_http_add_server把对应得ngx_http_core_srv_conf_t配置添加到ngx_http_conf_addr_t的servers数组中。
- 若没找到该IP,调用ngx_http_add_address把IP初始化到ngx_http_conf_addr_t结构,添加到port的addrs数组中。
并且设置default_server,往往是第一个监听该addr:port的是它的默认server,最后同样调用nginx_http_add_server添加server块的配置信息
3》函数ngx_http_block函数中调用ngx_http_optimize_servers函数完成ngx_listening_t初始化,下面看一下这个函数的实现。
a.先调用ngx_http_server_names初始化ngx_http_conf_addr_t中的三个哈希表
b.调用ngx_http_init_listening初始化ngx_cycle_t中的ngx_listening_t结构体
b.1调用ngx_http_add_listening函数往ngx_cycle_t的listenings数组中添加监听socket
ngx_http_add_listening函数的实现:
b.11:ls = ngx_create_listening(cf, &addr->opt.u.sockaddr, addr->opt.socklen);
//创建ngx_listening_t结构体,并且把它添加到listening数组中,并且设置该ngx_listening_t结构体中的一些主要的成员信息
b.12:// 设置监听socket的handler,在监听到新的连接时调用,即ngx_event_accept中。
ls->handler = ngx_http_init_connection;
b.2:调用ngx_http_add_addrs函数初始化ngx_listening_t中的servers成员,在处理请求时进行匹配并且赋值给request成员

4》接下来会在ngx_init_cycle函数中调用ngx_open_listening_sockets和ngx_configure_listening_sockets完成监听套接口的打开和配置
5》接下来就会在ngx_event_process_init函数(ngx_event_core_moduel的process_init回调函数,在创建完worker进程后调用)中将这些监听socket添加到事件循环中

综上所述,其实主要的流程就是读取配置文件,设置好端口,地址,server这三个数据的关系,而后打开套接口就可以

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值