存档

文章标签 ‘源码分析’

nginx配置信息的解析流程

2011年9月9日 4 条评论 12,467 次浏览

请关注最新修正合订:http://lenky.info/ebook/ 这一系列的文章还是在09年写的,存在电脑里很久了,现在贴出来。顺序也不记得了,看到那个就发那个吧,最近都会发上来。欢迎转载,但请保留链接:http://lenky.info/,谢谢。 nginx的配置文件格式是nginx作者自己定义的,并没有采用像语法分析生成器LEMON那种经典的LALR(1)来描述配置信息,这样做的好处就是自由,而坏处就是对于nginx的每一项配置信息都必须自己去解析,因此我们很容易看到nginx模块里大量篇幅的配置信息解析代码,比如模块ngx_http_core_module。 当然,nginx配置文件的格式也不是随意的,它有自己的一套规范: nginx配置文件是由多个配置项组成的。每一个配置项都有一个项目名和对应的项目值,项目名又被称为指令(Directive),而项目值可能简单的字符串(以分号结尾),也可能是由简单字符串和多个配置项组合而成配置块的复杂结构(以大括号}结尾),因此我们可以将配置项归纳为两种:简单配置项和复杂配置项。 从上面这条规范可以看到这里包含有递归的思想,因此在后面的配置解析代码里可以看到某些函数被递归调用,其原因也就在这里。 对于复杂配置项来说,其值是由多个简单/复杂配置项组成,因此nginx不做过细的处理,一般就是申请内容空间、切换解析状态,然后递归调用解析函数;真正将用户配置信息转换为nginx内变量的值,还是那些简单配置项所对应的处理函数。 不管是简单配置项还是复杂配置项,它们的项目名和项目值都是由标记(token:这里指一个配置文件字符串内容中被空格、引号、括号,比如'{‘、换行符等分割开来的字符子串。)组成的,配置项目名就是一个token,而配置项目值可以是一个、两个、多个token组成。 比如简单配置项: daemon... [阅读更多]

分类: nginx, 源码分析 标签: ,

nginx的超时处理

2011年9月9日 没有评论 11,819 次浏览

请关注最新修正合订:http://lenky.info/ebook/ 这一系列的文章还是在09年写的,存在电脑里很久了,现在贴出来。顺序也不记得了,看到那个就发那个吧,最近都会发上来。欢迎转载,但请保留链接:http://lenky.info/,谢谢。 nginx对于是否存在有超时事件的处理很巧妙。首先,nginx利用红黑树来组织那些等待处理的并且需要关注其是否超时的事件对象(以下称该红黑树为事件计时红黑树:event_timer_rbtree);其次,nginx提供了两种方案来检测那些等待处理的事件对象是否已经超时,一种为常规的定时检测机制,也就是设置定时器,每过一定的时间就对红黑树管理的所有事件对象进行一次超时检测;另一种是过距离当前最快发生超时的事件对象的时间就进行一次超时检测,这样叙述可能不是很清楚,看完下面的介绍,读者就会理解。 我们已经知道nginx把事件封装在一个名为ngx_event_s的结构体内,而该结构体有几个字段与本节讲的nginx超时处理相关。 unsigned        ... [阅读更多]

分类: nginx, 源码分析 标签: ,