在 nginx.conf 配置文件中有这样一个配置项:
events {
wocker_connections 1024;
}
这一配置项表示Nginx的最大并发连接数为1024,那么它会怎样的影响到Nginx的实现流程呢?
Nginx的连接池的表示方法:
Nginx中每一个worker进程都有一个独立的 ngx_cycle_t
结构体,Nginx框架是围绕着 ngx_cycle_t 结构体来控制进程运行的。
在 ngx_cycle_t 结构体中,有三个成员是用来表示连接池的:
typedef struct ngx_cycle_s ngx_cycle_t;
struct ngx_cycle_s {
ngx_connection_t *connections; //数组,每个元素即表示一个网络连接
ngx_event_t *read_events; //表示网络连接套接字上的读事件
ngx_event_t *write_events; //表示网络连接套接字上的写事件
};
其中,*connections 、 *read_events、 *write_event 指向三个数组,分别表示网络连接、读事件、写事件,这三个数组的大小相同,元素个数都是 配置文件中 worker_connection 配置项所设置的大小,且三者是通过 数组下标序号 对应起来的,即 connections[5] 这个连接上的读事件和写事件分别是 read_events[5] 和 write_events[5]。
worker_connections 配置项的默认配置可以在Nginx官网中查到,值为512,这个大小是非常小的,因为Nginx动辄十万几十万的并发连接。
而且要注意:这个连接不仅是对于浏览器客户端的连接,而且也是面向上游服务器的,所以如果是做的反向代理业务,那么一个客户端连接就要消耗两个conneciton。
但是, worker_connections 这个配置项也不是配置的越大越好,因为要考虑到内存消耗的问题。
根据上面的描述,每一个 网络连接需要分配 一个 ngx_connection_t 结构体 和 两个 ngx_event_t 结构体(分表表示连接和读、写事件),则消耗的内存是:
1 * sizeof(struct ngx_connection_s) + 2 * sizeof(struct ngx_event_s) = 1 * 232 + 2 * 96;
//ngx_connection_s 与 ngx_event_s 结构体的大小 具体的Nginx的版本不同,可能会有微小的差异