Nginx的重要概念之connection

connection是什么?

  connection是对tcp连接的封装,包括连接的socket和读事件、写事件。利用connection,我们可以很方便的建立连接、发送数据和接受数据,我们可以与任何后端服务打交道。其中,Nginx的http请求处理也是建立在connection上的。

Nginx如何通过connection处理一个连接?

  1. Nginx在启动时,会解析配置文件,得到需要监听的端口和IP地址。
  2. 在master进程里初始化好这个监控的socket(即创建socket,设置addrreuse等,绑定到指定的ip地址端口,然后监听)
  3. fork多个子进程出来,子进程们会竞争accept的新的连接。
  4. 客户端向Nginx发起连接
  5. 客户端与服务端通过三次握手后建立了一个连接
  6. 某一个子进程accept成功该连接,得到了该连接的socket(socket是一个接口,在用户进程与TCP/IP协议之间充当中间人,完成TCP/IP协议的书写,用户只需理解接口即可)
  7. 该子进程创建Nginx对连接的封装,即ngx_connection_t结构体
  8. 设置读写时间处理函数,添加读写事件来与客户端进行数据交互
  9. Nginx或客户端主动关掉连接

Nginx作为客户端请求其他服务时如何处理连接?

  1. Nginx先获取一个ngx_connection_t结构体
  2. 创建socket并设置socket的属性(如非阻塞)
  3. 添加读写事件
  4. 调用connect/read/write来调用连接
  5. 关掉连接
  6. 释放ngx_connection_t

Nginx能建立的最大连接数是多少?

  Nginx通过设置worker_connectons来设置每个进程支持的最大连接数,如果该值大于nofile,那么实际的最大连接数就是nofile(操作系统中一个进程能够打开的fd(fd为文件描述符fd,作为进程文件打开表项的指针)的最大数,可通过ulimit -n命令得到。一个socket占用一个fd,当fd用完的时候,再创建socket就会失败)。

  每个worker进程都有一个独立的连接池(worker_connections大小的一个ngx_connection_t结构的数组),Nginx通过一个链表free_connections来保存所有空闲的ngx_connection_t,每次获取一个连接时,就从free_connections获取一个,用完后再放回空闲链表里。

  总的来说,对于http请求本地资源来说,能够支持的最大并发数量是worker_connections*worker_processes,而如果是http作为反向代理来说,最大并发数量为worker_connections*worker_processes/2,因为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的链接,会占用两个链接。

以上总结参考https://mp.weixin.qq.com/s/bXtI45d7M-XjkJH3ARZiMQ