• nginx 数据结构

  1.Hash table

  nginx 对虚拟主机的管理使用到了HASH数据结构,假设配置文件里有如下的配置。

  Server{

  listen 192.168.0.1

  server_name xxxx

}

....

Server{

  listen 192.168.0.2

  server_name xxx1

}

  当Nginx以此配置文件正常启动后,如果来了一个客户端请求192.168.0.1的80端口,那么Nginx肯定要查询,看是使用哪个Server配置。为了提高查找效率,所以在启动开始后,Nginx就将根据这些server_name建立起一个Hash数据结构,如下图所示:

  

  上图中,字段buckets指向的就是Hash节点所对应的存储空间,不过这里具体实现时用的是二级指针,那么*buckets本身是一个数组,每一个数组元素用来存储映射到此的Hash节点。由于可能有多个实际元素映射到同一个Hash节点(发生Hash冲突),所以对实际元素再次进行数组形式的组织存储在一个bucket内,这个数组的结束以哨兵元素NULL作为标记,而前面的每一个ngx_hash_elt_t结构对应一个实际元素的存储。这里的实例,整体上也就形成上面所示那样的结构图。对于4个实际元素的Hash  数据结构,只有5个Hash节点,并且正好没有冲突,这主要是归功与ngx_hash_init()函数,通过它的提前测试,确定了Hash节点的个数。具体过程:逐步增加Hash节点数目(对应bucket数目同步增加),然后把所有的实际元素往这些bucket里添加,这有可能发生冲突,但只要冲突的次数可以容忍(即任意一个bucket都还没满),那么就继续填,如果发生有任何一个bucket满溢了,就必须增加Hash节点、增加bucket。如果所有的实际元素都填完没有发生满溢,那么当前的size就是最终的节点数目值。

  2. Radix tree

   Radix tree(基树),是一种基于二进制表示健值的二叉查找树,正是由于其健值的这个特点,所以只有在特定的情况下才会使用,典型的应用场景有文件系统、路由表等。Nginx提供的基树仅被geo模块使用,这个模块使用基树来处理IP地址的匹配查找。其次key与节点的对应是从高位向地位逐步匹配的。这是因为geo模块里真正使用的IP网络地址,比如192.168.0.0/16,它们前面bit为才是有效区分位,如果从后往前匹配,会产生大量bit 0,那么导致任何一个IP地址插入到基数上都是32层。ngx_radix32tree_insert()和ngx_radix32tree_delete()中,引入mask就是告诉插入函数只需匹配前多少位。这就是最长前缀匹配。

     

  • nginx配置解析

  Nginx配置文件可以认为是一种上下文相关的,高度可扩展的,有作用域。Ngix配置项有简单配置项和复杂配置项,对于复杂配置项而言,Nginx并不做具体的解析与赋值操作,一般只是申请对应的内容空间、切换解析状态,然后递归调用解析函数,而真正将用户配置信息转换为Nginx内控制变量的值,还是依靠那些简单配置项所对应的处理函数来做。

  无论是简单配置项还是复杂配置项,他们的项目名和项目值都是有标记(token:这里是指一个配置文件字符串内容中被空格、引号、分号、tab号、括号等)组成的,配置项目名就是一个token,而配置项目值可以是一个、两个和多个token组成。比如:

error_page  /.html;

  其项目名为error_page,其项目值为404及404.html两个。Nginx配置文件里的注释信息以#作为开头标记。根据Nginx应用本身的特点,我们可以对配置文件作上下文识别和区分,或者说是配置项的作用域。因为虽然某项配置项在同一个上下恩里只可以设置一次,但却可以在不同的上下文里设置多次,以便达到更细粒度的控制。

  目前Nginx预定义的配置上下文主要包括main、http、server、location4种(还有其他几种,比如event、upstream、if、mail等)这些上下文相当于一个独立的作用域。Ngix_conf_parse()函数是解析配置文件的关键函数,这个函数是一个间接递归函数,也就是说虽然我们在该函数体内看不到直接的对其本身的调用,但是它执行的一些其它函数(比如ngx_conf_hander()里面会调用ngx_conf_parse()函数),从而形成递归。ngx_conf_parse()解析配置内容的过程分为三个步骤:

  1. 判断当前解析状态
  2. 读取配置标记token
  3. 读取合适数量的token后对其进行实际的处理,也就是将配置值准换为nginx内对应控制变量(nginx转换很简单,直接转换key/value)

  所有的配置信息按照模块进行管理,转换之后的变量也按照模块进行管理。同事配置信息还可以继承,如果location中还有location,那么对于在某个层次没有设置的配置选项,它的值应该来自上一层。    

  

  

关于nginx架构探究(2)的更多相关文章

  1. 关于nginx架构探究(1)

    nginx的架构主要是有一个主监控进程:master;三个工作进程:worker:还有Cache的两个进程.back-end-server是后端服务器,主要是处理后台逻辑.nginx作为代理服务器需要 ...

  2. 关于nginx架构探究(4)

    事件管理机制 Nginx是以事件驱动的,也就是说Nginx内部流程的向前推进基本都是靠各种事件的触发来驱动,否则Nginx将一直阻塞在函数epoll_wait()或suspend函数,Nginx事件一 ...

  3. 关于nginx架构探究(3)

    Nginx 模块综述 Nginx 所有的代码都是以模块的新式组织的,包括核心模块和功能模块.Nginx加载模块的时候不想Apache一样动态加载,它是直接被编译到二进制执行文件中,所以,如果想要加载新 ...

  4. Nginx学习笔记(一) Nginx架构

    Nginx架构 Nginx全程是什么? Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器. ...

  5. Nginx架构的企业级应用

    Nginx架构的企业级应用 ==================================================== 实现HA高可用集群 实现LB负载均衡集群 Nginx实现反向代理 ...

  6. [转载] 深入 nginx 架构

    原文: http://www.cnbeta.com/articles/402709.htm 了解 nginx 架构帮助我们学习如何开发高性能 web 服务. 为了更好地理解设计,你需要了解NGINX是 ...

  7. nginx架构与基础概念

    1       Nginx架构 Nginx 高性能,与其架构有关. Nginx架构: nginx运行时,在unix系统中以daemon形式在后台运行,后台进程包含一个master进程和多个worker ...

  8. Nginx从入门到放弃-第5章 Nginx架构篇

    5-1 Nginx常见问题_架构篇介绍 5-2 Nginx常见问题_多个server中虚拟主机读取的优先级 5-3 Nginx常见问题_多个location匹配的优先级1 5-4 Nginx常见问题_ ...

  9. 转:初探nginx架构(一)

    来源:http://tengine.taobao.org/book/chapter_02.html 众所周知,nginx性能高,而nginx的高性能与其架构是分不开的.那么nginx究竟是怎么样的呢? ...

随机推荐

  1. C51库函数积累

    C51库函数积累: (1)_chkfloat_: 函数定义:unsigned char _chkfloat_ ( float val); /* number to check */ 函数功能:_chk ...

  2. FE: CSS固定图片显示大小及GitHub Pages在线演示

    CSS固定图片显示大小 分析 假设图片区域的大小固定为250×300px,那么我们可以写出如下的样式 .picture-area { width: 250px; height: 300px; marg ...

  3. 安卓u8800刷机

    一篇非常好的帖子:http://bbs.anzhi.com/thread-5113728-1-1.html 虽然不是什么大神,不过在两个QQ群里和这里解答过N多刷机和ROOT中遇到的问题了...而且伸 ...

  4. iOS 定位服务、通讯录、日历、提醒事项、照片、蓝牙共享、麦克风、相机等授权检测

    金田 iOS系统版本的不断升级的前提,伴随着用户使用设备的安全性提升,iOS系统对于App需要使用的硬件限制也越来越严格,App处理稍有不妥,轻则造成功能不可用用户还不知道,重则会造成App Cras ...

  5. poj2409 & 2154 polya计数+欧拉函数优化

    这两个题都是项链珠子的染色问题 也是polya定理的最基本和最经典的应用之一 题目大意: 用m种颜色染n个珠子构成的项链,问最终形成的等价类有多少种 项链是一个环.通过旋转或者镜像对称都可以得到置换 ...

  6. javascript 中的location.reload

    location.reload()是什么意思 location.reload() 括号内有一个参数 true/false , 为空和false的效果一样. 如果该方法没有规定参数,或者参数是 fals ...

  7. [深入React] 3.JSX的神秘面纱

    <div> <List /> </div> 会被编译为: React.createElement("div",null, React.creat ...

  8. EF中主表和附表一起提交的话,如果主附表的主键外键已经设定。

    EF中主表和附表一起提交的话,如果主附表的主键外键已经设定,如果新增同时新增主表和附表的记录,那么在EF同时提交时,不需要人为的设定附表的主表的主键值,EF会自动为附表添加外键值.

  9. Spring 详解第一天

    spring 框架简述: http://www.cnblogs.com/ToBeAProgrammer/p/5230065.html http://www.cnblogs.com/ToBeAProgr ...

  10. less样式表

    LESS是一种由Alexis Sellier设计的动态层叠样式表语言.受Sass所影响,同时也影响了Sass的新语法:SCSS.[2]  LESS是开源的,其第一个版本由Ruby写成,但在后续的版本当 ...