本文介绍在nginx中连接资源(即ngx_connection_t)的管理与使用。

连接池的初始化

在ngx_cycle_t结构体中维护了几个和连接相关的数据,具体如下

struct ngx_cycle_s {
....
ngx_connection_t *free_connections;
ngx_uint_t free_connection_n;
ngx_uint_t connection_n;
ngx_connection_t *connections;
ngx_event_t *read_events;
ngx_event_t *write_events;
}

逐一说明一下

  • connection_n表示最大的连接数量,通过配置项worker_connections设置
  • connections、read_events、write_events都是数组,数组大小为connection_n,且下标都是一一对应,例如connections[i]、read_events[i]、write_events[i]一定是配套使用的一组。connections[i].read = read_events[i],connections[i].write=write_events[i]也始终是成立的。
  • free_connections是一个链表的头部,表示空闲的链接,free_connection_n表示空闲连接的数量。
    • 空闲的链表通过c[i].data当作next指针逐一串联
    • 利用一个free链管理一个资源池的方式与filter中的ngx_output_chain_ctx_t.free类似
  • 上述相关资源的初始化都发生在ngx_event_process_init()函数中,即在worker进程初始化时完成。

关于free链结构可以参考ngx_event_process_init()中的代码

c = cycle->connections;
i = cycle->connection_n;
next = NULL; do {
i--;
c[i].data = next;
c[i].read = &cycle->read_events[i];
c[i].write = &cycle->write_events[i];
c[i].fd = (ngx_socket_t) -1;
next = &c[i];
} while (i); cycle->free_connections = next;
cycle->free_connection_n = cycle->connection_n;

连接的申请与释放

连接的申请与释放就是对cycle->free_connections的操作,相关的函数有2个ngx_get_connection()与ngx_free_connection().核心的逻辑可以参考代码

ngx_connection_t *
ngx_get_connection(ngx_socket_t s, ngx_log_t *log)
{
...
c = ngx_cycle->free_connections;
ngx_cycle->free_connections = c->data;
ngx_cycle->free_connection_n--;
...
} void
ngx_free_connection(ngx_connection_t *c)
{
c->data = ngx_cycle->free_connections;
ngx_cycle->free_connections = c;
ngx_cycle->free_connection_n++;
...
}

连接的典型场景

通过查看ngx_get_connection()与的引用,可以看到连接的主要使用场景

  • 场景一:作为监听fd的管理,在ngx_event_process_init()函数中会为cycle->listening中的每个监听绑定一个connection对象,并把connection对象的read事件处理函数设置为ngx_event_accept。
  • 场景二:accept连接后的管理,在ngx_event_accept()中,在accept获得新连接后会通过connection进行管理,也是业务开发中reqeust->connection对象的来源。
  • 场景三:当nginx需要作为客户端发起请求时,调用ngx_event_connect_peer()函数,也会从连接池中申请资源,这个也是upstream->peer.connection对象的来源。

nginx连接资源管理的更多相关文章

  1. Nginx 连接限制和访问控制Nginx 连接限制和访问控制

    Nginx 连接限制和访问控制   前言 Nginx自带的模块支持对并发请求数进行限制, 还有对请求来源进行限制.可以用来防止DDOS攻击.阅读本文须知道nginx的配置文件结构和语法. 连接限制 l ...

  2. nginx连接php测试

    1 nginx连接php [root@web01 /application/nginx/conf/conf.d]# cat docs.conf server { server_name docs.ol ...

  3. Nginx网络架构实战学习笔记(四):nginx连接memcached、第三方模块编译及一致性哈希应用

    文章目录 nginx连接memcached 第三方模块编译及一致性哈希应用 总结 nginx连接memcached 首先确保nginx能正常连接php location ~ \.php$ { root ...

  4. nginx——优化 Nginx 连接超时时间

    1. 什么是连接超时 (1) 举个例子,某饭店请了服务员招待顾客,但是现在饭店不景气,因此要解雇掉一些服务员,这里的服务员就相当于 Nginx 服务建立的连接 (2) 当服务器建立的连接没有接收处理请 ...

  5. 17 nginx连接memcached

    一:配置php扩展memcached wget http://memcached.googlecode.com/files/memcached-1.4.9.tar.gz # tar zvxf memc ...

  6. nginx连接操作memcahe

    nginx配置连接操作memcache nginx配置连接memcache: location / { set $memcached_key "$uri"; #设置memcache ...

  7. Nginx学习笔记(二):Nginx 连接处理 / 负载均衡

    Connection 在 Nginx 中,connection 就是对 TCP 连接的封装,其中包括连接的 socket,读写事件   Nginx 处理连接流程: 解析配置文件,得到需要监听的端口和I ...

  8. Nginx笔记总结四:Nginx连接PHP5.4

    location ~ .*\.(php)?${ expires -ls; try_file $uri=404; fastcgi_split_path_info ~(.+\.php)(/.+)$; in ...

  9. zabbix监控nginx连接状态(转)

    zabbix监控nginx zabbix可以监控nginx的状态,关于一个服务的状态可以查看服务本身的状态(版本号.是否开启),还应该关注服务能力(例如以nginx的负载效果:连接数.请求数和句柄数) ...

随机推荐

  1. SqlServer判断数据库、表、字段、存储过程、函数是否存在

    原文:SqlServer判断数据库.表.字段.存储过程.函数是否存在 判断数据库是否存在 if exists (select * from sys.databases where name = '数据 ...

  2. The specified type member 'IsLock' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.

    var query = from C in objDb.GetDb<A>() join a in objDb.GetDb<B>().Where(m => m.Comput ...

  3. 如何把zip文件直接解压到内存里?

    解压到硬盘再读进来耽误时间. var  LZip: TZipFile;  LMem: TMemoryStream;  LBytes: TBytes;begin  LZip := TZipFile.Cr ...

  4. centos 部署 asp.net core Error -99 EADDRNOTAVAIL address not available解决

    centos7.3上部署 asp.net core 错误如下: Hosting environment: Production Content root path: /home/netcore Now ...

  5. 自己动手写jQuery插件---Tip(提示框)

    对jQuery相信很多同学和我一样平时都是拿来主义,没办法,要怪只能怪jQuery太火了,各种插件基本能满足平时的要求.但是这毕竟不是长久之道,古人云:“授之以鱼,不如授之以渔”. 为了方便之前没有接 ...

  6. CL_GUI_ALV_GRID 触发PAI事件(Application event)

    *&---------------------------------------------------------------------* *& Report Z_BARRY_A ...

  7. pycharm窗口选项卡管理

    1.主题 我们已经注意到Pycharm的主编辑框是基于窗口选项卡机制显示的,Pycharm选项卡多种多样,这里我们将详细介绍这种选项卡机制.  2.激活的选项卡 每当我们打开一个Python文件时op ...

  8. test判断条件

      一:Shell test 命令        1.数值测试       参数 说明 -eq 等于则为真 -ne 不等于则为真 -gt 大于则为真 -ge 大于等于则为真 -lt 小于则为真 -le ...

  9. nvm淘宝源升级安装最新稳定版nodejs

    为了在服务器上面升级nodejs,用nvm下载实在太慢了,推荐淘宝源安装命令,非常快能安装好: 第一步: NVM_NODEJS_ORG_MIRROR=https://npm.taobao.org/mi ...

  10. 【简单脚本】Linux查看配置信息

    命令比较多,统一整合了一下: 1.新建文件touch getComputerConf.sh 2.vim getComputerConf.sh 3.按i键插入,右键粘贴如下内容: #!/bin/sh e ...