本节我们介绍一下nginx中对socket connection的相关操作.主要包括两个方面的内容:
1. 函数ngx_close_listening_sockets()
本函数用于关闭cycle->listening中的所有监听sockets。下面我们来简要分析:
2. 函数ngx_get_connection()
在讲解本函数之前,我们必须先明白如下几点:
-
ngx_cycle->files
: 本字段是nginx事件模块初始化时预先分配的一个足够大的空间,用于将来存放所有正在使用的连接(指针)。并且可以通过socket fd来索引该ngx_connection_t
连接对象。
-
ngx_cycle->connections
: 预先分配了一个足够大的空间来在这空间分配ngx_connection_t
对象
-
ngx_cycle->free_connections
: 本字段存放了所有空闲状态的ngx_connection_t
对象,通过ngx_connection_t.data字段连接起来。
-
cycle->read_events
: 预先分配的足够大的ngx_event_t
对象空间
下面我们简要画出在初状态下,大概的一副场景:
下面我们对该函数进行简单的解释:
3. 函数ngx_free_connection()
此函数用于释放ngx_connection_t
连接,将其插入到ngx_cycle->free_connections
链表头,并且如果该connection存放在ngx_cycle->files[c->fd]
中,则从该位置移除。
4. 函数ngx_close_connection()
下面我们来简单介绍一下ngx_close_connection()函数的实现:
5. 函数ngx_reusable_connection()
此函数主要用于在reusable
为true,即表示该连接需要马上被复用,因此这里会先从队列中移除,然后再重新加入到可复用连接队列中。
其中ngx->reusable_connections_queue
是一个双端队列,如下图所示:
6. 函数ngx_drain_connections()
这里主要是从ngx_cycle->reusable_connections_queue
中释放长连接,释放完成后加入到空闲连接池,以供后续新连接使用。
注意: 这里只有在ngx_http_set_keepalive()中会将connection->reusable置为1,因此这里可复用的连接绑定的read->handler
为ngx_http_keepalive_handler()
7. 函数ngx_close_idle_connections()
这里遍历cycle->connections链表,关闭所有空闲连接。
8. 函数ngx_connection_local_sockaddr()
在当前我们的配置当中,并不支持NGX_HAVE_INET6
,但是在obs/ngx_auto_config.h头文件中有如下宏定义:
#ifndef NGX_HAVE_UNIX_DOMAIN
#define NGX_HAVE_UNIX_DOMAIN 1
#endif
本函数用于获取ngx_connection_t
所绑定的本地socket地址,将其转化成字符串表示形式返回。下面简要解释一下:
9. 函数ngx_connection_error()
当前我们运行在Linux环境下,因此不支持NGX_WIN32
与NGX_SOLARIS
。此函数主要用于打印ngx_connection_t
中的日志信息。ngx_connection_t.log_error
定义了一个连接中的日志打印级别。
[参看]:
-
setsockopt
-
nginx源码初读(8)–让烦恼从数据结构开始(ngx_event)
-
nginx keepalive连接回收机制