• 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 

  • 相关阅读:
    最清晰易懂的Mysql CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP区别
    yield再理解--绝对够透彻
    解决pyspider框架web预览框过小问题
    python中的可哈希与不可哈希
    python json.dumps 中的ensure_ascii 参数引起的中文编码问题
    LeetCode 297. 二叉树的序列化与反序列化 | Python
    LeetCode 1300. 转变数组后最接近目标值的数组和 | Python
    LeetCode 30. 串联所有单词的子串 | Python
    LeetCode 739. 每日温度 | Python
    LeetCode 128. 最长连续序列 | Python
  • 原文地址:https://www.cnblogs.com/smallzhen/p/12623585.html
Copyright © 2020-2023  润新知