本节我们介绍一下nginx中对socket connection的相关操作.主要包括两个方面的内容:
1. 函数ngx_create_listening()
这里主要是根据sockaddr
地址构建一个ngx_listening_t
结构体对象,存放于cycle->listening数组中。这里并未真正创建socket:
注意这里将二进制形式表示的socket地址sockaddr
转换为字符串形式时长度的确定。
2. 函数ngx_clone_listening()
我们在objs/ngx_auto_config.h头文件中有如下定义:
#ifndef NGX_HAVE_REUSEPORT
#define NGX_HAVE_REUSEPORT 1
#endif
一般是在worker0创建完成一个监听socket后,通过此函数再复制到其他worker进程。
3. 函数ngx_set_inherited_sockets()
本函数主要用于平滑升级时,设置继承而来的socket。在objs/ngx_auto_config.h头文件中我们有如下定义:
#ifndef NGX_HAVE_DEFERRED_ACCEPT
#define NGX_HAVE_DEFERRED_ACCEPT 1
#endif
#ifndef NGX_HAVE_TCP_FASTOPEN
#define NGX_HAVE_TCP_FASTOPEN 1
#endif
#ifndef NGX_HAVE_REUSEPORT
#define NGX_HAVE_REUSEPORT 1
#endif
并且支持SO_ACCEPTFILTER
与TCP_DEFER_ACCEPT
。
本函数是受ngx_add_inherited_sockets()函数调用的,并且在该函数中通过继承已经设置了ngx_listening_t
对象的fd字段。接下来我们分析一下本函数的实现:
4. 函数ngx_open_listening_sockets()
本函数用于打开cycle->listening.elts中符合要求的所有监听sockets。我们在objs/ngx_auto_config.h头文件中有如下定义:
#ifndef NGX_HAVE_REUSEPORT
#define NGX_HAVE_REUSEPORT 1
#endif
下面我们来简单分析一下该函数:
本函数用于配置监听sockets。在objs/ngx_auto_config.h头文件中我们有如下宏定义:
#ifndef NGX_HAVE_DEFERRED_ACCEPT
#define NGX_HAVE_DEFERRED_ACCEPT 1
#endif
#ifndef NGX_HAVE_KEEPALIVE_TUNABLE
#define NGX_HAVE_KEEPALIVE_TUNABLE 1
#endif
#ifndef NGX_HAVE_TCP_FASTOPEN
#define NGX_HAVE_TCP_FASTOPEN 1
#endif
#ifndef NGX_HAVE_IP_PKTINFO
#define NGX_HAVE_IP_PKTINFO 1
#endif
接下来我们来简要分析一下该函数:
[参看]:
- setsockopt