9.3.3 ngx_connection_t连接池

Nginx在接受客户端的连接时,所使用的ngx_connection_t结构体都是在启动阶段就预分配好的,使用时从连接池中获取即可。这个连接池是如何封装的呢?如图9-1所示。

从图9-1中可以看出,在ngx_cycle_t中的connections和free_connections这两个成员构成了一个连接池,其中connections指向整个连接池数组的首部,而free_connections则指向第一个ngx_connection_t空闲连接。所有的空闲连接ngx_connection_t都以data成员(见9.3.1节)作为next指针串联成一个单链表,如此,一旦有用户发起连接时就从free_connections指向的链表头获取一个空闲的连接,同时free_connections再指向下一个空闲连接。而归还连接时只需把该连接插入到free_connections链表表头即可。

9.3.3 ngx_connection_t连接池 - 图1

图 9-1 ngx_connection_t连接池示意图

图9-1中还显示了事件池,Nginx认为每一个连接一定至少需要一个读事件和一个写事件,有多少连接就分配多少个读、写事件。怎样把连接池中的任一个连接与读事件、写事件对应起来呢?很简单。由于读事件、写事件、连接池是由3个大小相同的数组组成,所以根据数组序号就可将每一个连接、读事件、写事件对应起来,这个对应关系在ngx_event_core_module模块的初始化过程中就已经决定了(参见9.5节)。这3个数组的大小都是由nginx.conf中的connections配置项决定的。

在使用连接池时,Nginx也封装了两个方法,见表9-1。

9.3.3 ngx_connection_t连接池 - 图2

如果我们开发的模块直接使用了连接池,那么就可以用这两个方法来获取、释放ngx_connection_t结构体。