Nginx的框架设计-进程模型 在这之前,我们首先澄清几点事实: nginx作为一个高性能server的特点.事实上这也是全部的高性能server的特点,依赖epoll系统调用的高效(高效是相对select/poll这些系统调用的,底层有一个链表和红黑树,避免了轮询,降低了用户空间和系统空间之间的数据传递等).非堵塞(全部的操作都是非堵塞,这样).多进程(master-slave进程模型),这些事实使得nginx成为一个高性能server的前提条件. 既然作为一个软件(httpserver),相…
菜鸟nginx源代码剖析 框架篇(一) 从main函数看nginx启动流程 Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csdn.net/chen19870707 Date:Nov 9th, 2014 俗话说的好.牵牛要牵牛鼻子 驾车顶牛,处理复杂的东西,仅仅要抓住重点,才干理清脉络.不至于深陷当中,不能自拔.对复杂的nginx而言,main函数就是"牛之鼻",仅仅要能理清main函数.就一定能理解当中的奥秘…
Nginx源代码分析-进程间通信机制 从nginx的进程模型能够知道.master进程和worker进程须要通信,nginx中通信的方式有套接字.共享内存.信号.对于master进程,从外部接受信号,master进程主要就是监控.接受外部信号,将有必要的信号传递给worker进程,master进程大部分时间都是堵塞在sigsuspend()函数调用上.Worker进程屏蔽了全部的外部信号,那么Master进程就通过套接字和worker进程通信,worker进程改动全局变量,使得worker进程接…
nginx源代码分析数据结构篇(两) 双链表ngx_queue_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csdn.net/chen19870707 Date:October 20h, 2014 1.ngx_queue优势和特点 ngx_queue作为顺序容器链表.它优势在于其能够高效地运行插入.删除.合并操作,在插入删除的过程中,仅仅须要改动指针指向.而不须要拷贝数据,因此.对于频繁改动的容器非常适合. 此外,…
Nginx源代码分析-业务流程 到此为止,我们如果ngx_init_cycle已经结束.我们临时无论他做了什么,我们从他做的效果进入. 从常理上来讲,假设一个请求到达,那么我们须要接受这个请求,那么就从请求来介绍! 在ngx_event_process_init函数中将监听套接字上的读事件注冊为ngx_event_accept,ngx_event_accept是为了接受请求的,它负责接收一个连接,那么连接接收完毕以后直接调用这个监听套接字上的处理函数ls->handler(c);那么这个时候是怎…
新秀nginx源代码分析数据结构篇(四)红黑树ngx_rbtree_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csdn.net/chen19870707 Date:October 27h, 2014 1.ngx_rbtree优势和特点 ngx_rbtree是一种使用红黑树实现的关联容器.关于红黑树的特性,在<手把手实现红黑树>已经具体介绍,这里就仅仅探讨ngx_rbtree与众不同的地方:ngx_rbtree红…
nginx源代码总结: 1)代码中没有特别绕特别别扭的编码实现.从变量的定义调用函数的实现封装,都非常恰当.比方从函数命名或者变量命名就能够看出来定义的大体意义,函数的基本功能,再好的架构实如今编码习惯差的人实现也会黯然失色,假设透彻理解代码的实现,领悟架构的设计初衷,认为每块代码就想经过耐心雕琢一样,不只实现了主要的功能给你,为其它人阅读也会提供非常好的支持.仔细恰当的命名规则就能够看出作者的功力. 2)更好更高的软件性能体如今架构设计上,好的架构会让软件更加稳定.easy维护.便于扩展.从核…
1.高性能server 对于高性能server对于.处理速度和占用空间小是典型特性.特别是当server经验C10K问题的时候(网络server在处理数以万计的client连接时.往往出现效率低下甚至全然瘫痪,这被称为C10K问题). 要做到处理速度足够快.其并发模型的设计相当关键,而要做到资源尤其是内存资源的占用少,就要依赖于其资源分配和资源管理的方案设计. server的并发模型设计是网络编程中非常关键的一个部分,server的并发量取决于两个因素,一个是提供服务的进程数量,另外一个是每一个…
通过HUP信息使得NGINX实现又一次读取配置文件,使用USR2信号使得NGINX实现平滑升级. 在nginx中有模块这么一说,对外全部的模块都是ngx_module_t类型,这个结构体作为全部模块的通用接口.它仅仅定义了init_master.init_module.init_process.init_thread.exit_thread.exit_process.exit_master这7个回调方法,(事实上init_master.init_thread.exit_thread这3个方法眼下…
1.在nginx.c中设置每一个核心模块的index ngx_max_module = 0; for (i = 0; ngx_modules[i]; i++) { ngx_modules[i]->index = ngx_max_module++; } 2.进入函数ngx_init_cycle,调用每一个核心模块的create_conf for (i = 0; ngx_modules[i]; i++) { if (ngx_modules[i]->type != NGX_CORE_MODULE)…