没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
序
、基础知识
基本数据结构
请求中 的介绍
如何处理一个连接
基本介绍
如何处理一个连接
启动过程中的初始化
监听 地址与端口的确定
!的初始化
理论说明: "
详细说明: "
更深入说明: #
$$%& 的初始化 '
有 请求到达 服务器
如何处理一个 请求
解析请求行
解析请求头
处理请求
流程图描述上述过程
对于 $(&&) 的详细解释
" 关于 $$%& 函数的实现 "
附录列表 '
附录一 请求中典型结构体 '
附录二 的详细说明
附录三 $$%& 函数初始化完整代码
附录四 $(&&) 完整代码*
附录五:$$%& 函数完整代码 *
0 序
本文分析 内部是如何对 请求进行响应的。主要分为 启动、有 请
求到达 服务器两部分进行说明。之所以分为两部分,是因为在 启动过程中
会有很多初始化的过程。这些内容接下来都会有详细介绍。
1、基础知识
1.1 基本数据结构
)以图的形式给出, 请见图
)关于图中 + !,以及 $$%& 的
初始化,在后面的内容中会给出详细解释。
)关于图中结构体的原型,详见附录一
)注意内容:
-. 这 儿 要 明 白 的 是 +
!, 数 组 有 个 + 元 素 。 其 中 每 个
+ 元素对应于 # 个 。对于每个 + 元素呢,又有一个相
应的 &&/+ 存放相应的 01&。
-.经过相应初始化后,+ !,包含所
有 的 所 对 应 的 01& , 并 通 过 相 应 的 关 联 , 会 将 01&
中 的 01&+ 01& 指 向 +
!该数组,也就是以后使用 2301&
时就代指 + !该数组。
Figure 1 http 请求中的典型结构体
1.2 hp 请求中 phase 的介绍
) 中的处理一个 请求分成了 个 。在下面这个 )4 枚举类型中,我们
看到了这 个 。(不知道为何有的文章写 # 个),关于这几个 的详细说明,
请见附录
typedefenum{
NGX_HTTP_POST_READ_PHASE= 0,
NGX_HTTP_SERVER_REWRITE_PHASE,
NGX_HTTP_FIND_CONFIG_PHASE,
NGX_HTTP_REWRITE_PHASE,
NGX_HTTP_POST_REWRITE_PHASE,
NGX_HTTP_PREACCESS_PHASE,
NGX_HTTP_ACCESS_PHASE,
NGX_HTTP_POST_ACCESS_PHASE,
NGX_HTTP_TRY_FILES_PHASE,
NGX_HTTP_CONTENT_PHASE,
NGX_HTTP_LOG_PHASE
}ngx_http_phases;
) 更 主 要 的 是 这 几 个 的 执 行 时 严 格 按 照 顺 序 进 行 的 , 也 就 是
56是第一个, 是最后一个。
只有一个特殊的是 786978,因为在后面的 &:&+ 中会改
变 )&,从而需要调用这个 来实现通过 )& 来查找对应的 1($;(。
1.3 Nginx 如何处理一个连接
1.3.1 基本介绍
在 中 $($;( 就是对 +$ 连接的封装,其中包括连接的 ($%+,读事件,写事
件。
中对 +$ 连接的封装所用的结构体是 +&)$+$($;(+ 结构体。
利用 封装的 $($;(,我们可以很方便的使用 来处理与连接相关的事情,
比如建立连接,发送与接收数据等。并且 中的 请求的处理就是建立在 $($;(
之上的。所以 不仅可以作为一个 :< 服务器,也可以作为邮件服务器。当然,利用
提供的 $($;(,我们可以与任何后端服务打交道。
1.3.2 Nginx 如何处理一个连接
1)Nginx 作为服务器
( 1 )启动
首先, 在启动时,会解析配置文件,得到需要监听的端口与 地址
然后, 的 4+& 进程里面,先初始化好这个监控的 ($%+(创建 ($%+22设置
00&&) 等选项22绑定到指定的 地址端口22在 1+),然后再 =(&% 出多个子进程出来,
然后子进程会竞争 $$+ 新的连接。
此时,客户端就可以向 发起连接了。
( 2 )客户端向
Nginx
发起连接
首先:当客户端与 进行三次握手,与 建立好一个连接后,此时,某一个子
进 程 会 $$+ 成 功 , 得 到 这 个 建 立 好 的 ($%+ , 然 后创 建 对 连 接的 封 装 , 即
$($;(+ 结构体。
其次:设置读写事件处理函数并添加读写事件来与客户端进行数据的交互。
最后, 或客户端来主动关掉连接。至此,一个连接寿终正寝。
2)Nginx 作为客户端
也可以作为客户端来请求其他 &>& 的数据(如 )+&4 模块),此时与其他
&>& 创建连接,所创建的连接也封装在 $($;(+ 结构体中。
作为客户端,
首先: 获取一个 $($;(+ 结构体
然后,创建 ($%+,并设置 ($%+ 属性(比如非阻塞)
之后,通过添加读写事件,调用 $($+?&0?:&+ 来调用连接
最后,关掉连接,释放 $($;(+。
2.Nginx 启动过程中的初始化
2.1 监听 ip 地址与端口的确定
+:>+&($+
)为每一个监听套接字分配一个连接结构 $($;(+
)设置读事件成员(&0)的事件处理函数为 >+$$+ 函数
如果没有 $$+ 互斥锁,>+&($+ 会将读事件挂载 的事件处理
模型
如果有 $$+ 互斥锁,则会等到 +&($ 阶段结束,在工作进程的事件处理循
环中,某个进程抢到了 $$+ 互斥锁,才能挂载该读事件。
+:当一个工作进程在某个时刻将监听事件挂载上事件处理模型之后, 就开始正
式接受并处理客户端的请求了。 的事件处理模型接收到这个读事件之后,会速度交由
之前注册好的事件处理函数 >+$$+ 来处理。@
+:>+$$+ 函数中, 调用 $$+ 函数,从已连接队列得到一个连接以及
对应的套接字,接着分配一个连接结构($($;(+),并将新得到的套接字保存在
该连接结构中,这里还会做一些基本的连接初始化工作。其中包括初始化读写事件的处理
函数。
写事件的处理函数设置为 4+/01&。这个事件处理函数不会做任何操作,
实际上 默认连接第一次可写,不会挂载写事件,如果有数据需要发送, 会直接
写到这个连接,只有在发生一次写不完的情况下,才会挂载写事件到事件模型上,并设置
真正的写事件处理函数,这里后面的章节还 会做详细介绍读事件的处理函数设置为
+&A)+。
此时如果该连接上已经有数据过来(设置了 0=&&0$$+. ,则会直接调用
+&A)+ 函数来处理该请求,反之则设置一个定时器并在事件处理模型上
挂载一个读事件,等待数据到来或者超时。当然这里不管是已经有数据到来,或者需要等
待数据到来,又或者等待超时,最终都会进入读事件的处理函数2+&A)+。
2.2 phases[NGX_HTTP_LOG_PHASE + 1]的初始化
接 下 来 主 要 讲 述 $(&4$(=+ 中 +
!,的初始化。
剩余28页未读,继续阅读
资源评论
- slnc872013-10-16过程比较详细
- chen0301122014-12-23对http请求介绍的还是比较详细,又补充作用
yankai0219
- 粉丝: 209
- 资源: 17
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功