没有合适的资源?快使用搜索试试~ 我知道了~
首页nginx核心讲解--非常不多讲解nginx书籍
资源详情
资源评论
资源推荐
转载请保持文档完全或保留出处( http://lenky.info/ )
欢迎访问 Lenky 个人网站: http://lenky.info/
1
nginx
nginx
nginx
nginx 核心讲解
第零章
第零章
第零章
第零章 前言
前言
前言
前言
慕名对 nginx 的源码进行学习研究是早在 2009 年的事情,当时还在学校,整天呆在实
验室里看动漫 , 时间一久就心感愧疚 , 觉得还是要趁有空学点东西 , 恰当时不知从哪里得知
高性能服务器是一个很有 “ 前途 ” 的方向,几经搜索又机缘偶合的得识 lighttpd 与 nginx ,
从此开始在动漫与代码之间来回穿梭,直到毕业。
关于 lighttpd 与 nginx ,无需多说,当时 lighttpd 比 nginx 要火,所以我先看的 lighttp d
源码,后看的 nginx 源码,也因此 lighttpd 的文档在我读书的时候就写完(虽然写得很矬)
了 , 但 nginx 的文档写了一些放在电脑里 , 后来离开学校开始工作后 , 就把这件事情和这些
文档都给搁在那了,直到近一年前,我建了一个个人博客站点( http://lenky.info/ ) ,为了凑
文章数目 , 才又把它们给找了出来 , 并且根据最新的 nginx 源码重新整理了一下 , 也就是现
在你看到的这篇文档。
重新整理主要是因为注意到以前写的文档过细的去逐行注释代码 ( 网上很多 nginx 源码
分析的文章也大多有这个缺点 ) , 而此次希望能从比较高一点的角度去解析 nginx , 让读者尽
快的把握全局 , 搞清楚整体实现原理而不是陷入细节 。 我个人认为 , 只要看清楚了整体的实
现原理,对于一时半会没有触及到的细节,在真正遇到那个点再去理解时肯定毫不费力 , 最
多也只不过是可能还需要去查一下 man 手册,了解一下系统 API 而已。授人以鱼不如授人
以渔 , 这也是我此次重新整理的最主要目标 , 为了达到这个目标 , 文档里就尽量的少贴代码
多画图 , 当然一些必要的代码是不可缺少的 , 所以你还是会在本文档里看到源代码 。 从文档
名称叫做核心讲解,而不是源码分析,这也足见我的个人期望,虽然我的个人期望比较好
,
可惜限于水平比较差,目前写出来的文档也就这个样了。
:)
最后 , 说一下本文档基于的相关环境 , 虽然列了一个表格如下 , 其实没那么复杂 , 我安
装的是一个 centos 6.2 的 32 位虚拟机 ( Intel x86 ) , 其它开发软件包都是 centos 6.2 里所对应
提供的,而 nginx 版本为 1.2.0 。另外,在没有特别说明的情况下,文档讲解过程中针对 的
nginx 配置环境是 http 协议、 epoll 事件机制。
软件包 版本
nginx 1.2.0
os CentOS release 6.2 (Final) /kernel- 2.6.32 /32bit
gcc gcc version 4.4.6 20110731 (Red Hat 4.4.6-3) (GCC)
gdb GNU gdb (GDB) Red Hat Enterprise Linux (7.2-50.el6)
make GNU Make 3.81
转载请保持文档完全或保留出处( http://lenky.info/ )
欢迎访问 Lenky 个人网站: http://lenky.info/
2
文档版本( 由于文档目前在逐步整理中,尚未仔细校订,所以难免出现错误,如发现错误
请反馈,非常感谢,文档将持续更新,请关注更新地址: http://lenky.info/ebook/ ) :
版本号 修订时间
0.1 2012-7-20
0.2 2012-7-22
新增事件机制一章
0.3 2012-7-2 9
新增初始变量、支撑机制、脚本引擎三节
0.31 2012-8-5
修订 & 完成第六章
0.32 2012-8- 9
修订第三章
0.35 2012-8- 11
新增第七章:创建监听套接口、创建连接套接口
0.4 2012-8- 15
完成第七章
转载请保持文档完全或保留出处( http://lenky.info/ )
欢迎访问 Lenky 个人网站: http://lenky.info/
3
第一章
第一章
第一章
第一章 进程解析
进程解析
进程解析
进程解析
进程模型
nginx 的进程模型和大多数后台服务程序一样,按职责将进程分成监控进程和工作进程
两类,启动 nginx 的主进程充当监控进程,而由主进程 fork 出来的子进程则充当工作进程
。
工作进程的任务自然是完成具体的业务逻辑 , 而监控进程充当整个进程组的对外接口 , 同时
对工作进程进行监护,比如如果某工作进程意外退出,监控进程将重新 fork 生成一个新的
工作进程。 nginx 也可以单进程模型执行,在这种进程模型下,主进程就是工作进程,此时
没有监控进程 , 单进程模型比较简单且官方建议仅供测试使用 , 所以下面主要分析多进程模
型。
分析 nginx 多进程模型的入口函数为主进程的 ngx_master_process_cycle() 函数,在该函
数做完信号处理设置等之后就会调用一个名为 ngx_start_worker_processes() 的函数用于 for k
产生出子进程(子进程数目通过函数调用的第二个实参指定 ) ,子进程作为一个新的实体开
始充当工作进程的角色执行 ngx_worker_process_cycle () 函数,该函数主体为一个无限 for 循
环 , 持续不断的处理客户端的服务请求 , 而主进程继续执行 ngx_master_process_cycle() 函数
,
也就是作为监控进程执行主体 for 循环 , 这也是一个无限循环 , 直到进程终止才退出 , 服务
进程基本都是这种写法,所以不用详述,下面先看看这个模型的图示:
转载请保持文档完全或保留出处( http://lenky.info/ )
欢迎访问 Lenky 个人网站: http://lenky.info/
4
上图中表现得很明朗 , 监控进程和工作进程各有一个无限 for 循环 , 以便进程持续的等
待和处理自己负责的事务,直到进程退出。
监控进程的无限 for 循环内有一个关键的 sigsuspend() 函数调用 , 该函数的调用使得监控
进程的大部分时间都处于挂起等待状态 , 直到监控进程接收到信号为止 , 当监控进程接收到
信号时 , 信号处理函数 ngx_signal_handler() 就会被执行 , 我们知道信号处理函数一般都要求
足够简单 ( 关于信号处理函数的实现准则请 Google ) , 所以在该函数内执行的动作主要也就
是根据当前信号值对相应的旗标变量做设置,而实际的处理逻辑必须放在主体代码里来处
理,所以该 for 循环接下来的代码就是判断有哪些旗标变量被设置而需要处理的,比如 ngx
_reap (有子进程退出? ) 、 ngx_quit 或 ngx_terminate (进行要退出或终止?注意:虽然两个
旗标都是表示结束 nginx ,不过 ngx_quit 的结束更优雅,它会让 nginx 监控进程做一些清理
工作且等待子进程也完全清理并退出之后才终止,而 ngx_terminate 更为粗暴,不过它通过
使用 SIGKILL 信号能保证在一段时间后必定被结束掉 ) 、 ngx_reconfigure ( 重新加载配置?
)
等 。 当所有信号都处理完时又挂起在函数 sigsuspend() 调用处继续等待新的信号 , 如此反复
,
构成监控进程的主要执行体。
82: F ilename
:
ngx_process_cycle.c
83: void
84: ngx_master_process_cycle(ngx_cycle_t *cycle)
85: {
86: …
146: for ( ;; ) {
147: …
170: sigsuspend(&set);
171: …
177:
if
(ngx_reap) {
178: …
184:
if
(!live && (ngx_terminate || ngx_quit)) {
185: …
188:
if
(ngx_terminate) {
189: …
210:
if
(ngx_quit) {
211: …
212: }
213: …
工作进程的执行主体与监控进程类似 , 不过工作进程既名之为工作进程 , 那么它的主要
关注点就是与客户端或后端真实服务器(此时 nginx 作为中间代理)之间的数据可读 / 可写
等交互事件,而不是进程信号,所以工作进程的阻塞点是在像 select() 、 epoll_wait() 等这样
的 I/O 多路复用函数调用处,以等待发生数据可读 / 可写事件,当然,也可能被新收到的进
程信号中断。关于 I/O 多路复用的更多细节,请参考其他章节。
721: F ilename
:
ngx_process_cycle.c
转载请保持文档完全或保留出处( http://lenky.info/ )
欢迎访问 Lenky 个人网站: http://lenky.info/
5
722: static void
723: ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data)
724: {
725: …
780: for ( ;; ) {
781:
782:
if
(ngx_exiting) {
783: …
806: ngx_process_events_and_timers(cycle);
807:
808:
if
(ngx_terminate) {
809: …
810: }
811: …
整体架构
如前面介绍的那样 , 正常执行起来后的 N ginx 会有多个进程 , 最基本的有 master_proces s
和 worker_process , 还可能会有 cache 相关进程 ( 这在后面会具体讲到 ) 。 除了自身进程之间
的相互通信 , N ginx 还凭借强悍的模块功能与外界四通八达 , 比如通过 upstream 与 web serve r
通信、依靠 fastcgi 与 application server 通信等等。一个较为完整的整体架构框图如下所示 :
剩余144页未读,继续阅读
y00198695
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论2