Nginx模块开发与原理剖析
文章平均质量分 92
主要记录了Nginx的模块开发的常用方法及流程,架构解析,源码阅读。希望能和大家相互交流~望通过~
没有昵称阿
计算机专业同学的充电站,专注分享硬核CS学习路线、大学生成长干货。有些道理如果早一点知道,就能少走很多弯路~~~
展开
-
Nginx学习之十四-GDB调试Nginx初试
本文的测试环境:Win7+虚拟机VMWareVMware-workstation-full-7.1.4-385536+Ubuntu12.04Nginx-1.4.0要想有效的研究Nginx源码,必须要动手调试,GDB就是有用的利器。下面简要介绍用GDB调试Nginx的一个小例子。本文完成了这样的工作:跟踪worker子进程,观察worker子进程阻塞在何处。然后利用w原创 2013-07-19 18:11:41 · 14381 阅读 · 1 评论 -
Nginx学习之十三-负载均衡-IP哈希策略剖析
前面介绍过nginx负载均衡的加权轮询策略(http://blog.csdn.net/xiajun07061225/article/details/9318871),它是Nginx负载均衡的基础策略,所以一些初始化工作,比如配置值转储,其他策略可以直接复用他。在后面的初始化的代码中将可以看到。IP哈希初始化IP哈希的初始化函数ngx_http_upstream_init_i原创 2013-07-15 17:29:28 · 24281 阅读 · 3 评论 -
Nginx学习之十二-负载均衡-加权轮询策略剖析
本问介绍的是客户端请求在多个后端服务器之间的均衡,注意与客户端请求在多个nginx进程之间的均衡相区别(Nginx根据每个工作进程的当前压力调整它们获取监听套接口的几率,那些当前比较空闲的工作进程有更多机会获取到监听套接口,从而客户端的请求到达后也就相应地被它捕获并处理)。如果Nginx是以反向代理的形式配置运行,那么对请求的实际处理需要转发到后端服务器运行,如果后端服务器有多台,如何选择一台合适原创 2013-07-13 15:52:19 · 48420 阅读 · 6 评论 -
Nginx学习之十一-Nginx启动框架处理流程
Nginx启动过程流程图下面首先给出Nginx启动过程的流程图:ngx_cycle_t结构体Nginx的启动初始化在src/core/nginx.c的main函数中完成,当然main函数是整个Nginx的入口,除了完成启动初始化任务以外,也必定是所有功能模块的入口之处。Nginx的初始化工作主要围绕一个类型为ngx_cycle_t类型的全局变量(cycle)原创 2013-07-12 11:24:54 · 15870 阅读 · 0 评论 -
Nginx学习之十-超时管理(定时器事件)
Nginx事件管理主要是网络事件和定时器事件。下面介绍定时器事件管理,即超时管理。为什么要进行超时管理Nginx有必要对可能发生超时的事件进行统一管理,并在事件超时时作出相应的处理,比如回收资源,返回错误等。举例来说,当客户端对nginx发出请求连接后,nginx机会accept()并建立对应的连接对象、读取额护短请求的头部信息。而读取这个头部信息显然是要在一定的时间内转载 2013-07-09 19:03:37 · 14913 阅读 · 3 评论 -
Nginx学习之九-负载均衡(客户端请求与Nginx进程间负载均衡)
负载均衡问题的产生在nginx中,建立连接的时候,会设计负载均衡问题。在多个子进程争抢处理一个新连接事件时,一定只有一个worker子进程最终会成功建立连接,随后它会一直处理这个连接直到连接关闭。那么,就有可能出现这样的情况:有的子进程建立并处理了大部分连接,而有的子进程只处理了少量连接。这对多核CPU架构下的应用是很不利的。因为子进程之间应该是平等的,每个子进程应该尽量独占一个CPU原创 2013-07-08 15:19:09 · 7350 阅读 · 1 评论 -
Nginx学习之八-惊群问题
惊群问题(thundering herd)的产生在建立连接的时候,Nginx处于充分发挥多核CPU架构性能的考虑,使用了多个worker子进程监听相同端口的设计,这样多个子进程在accept建立新连接时会有争抢,这会带来著名的“惊群”问题,子进程数量越多越明显,这会造成系统性能的下降。一般情况下,有多少CPU核心就有配置多少个worker子进程。假设现在没有用户连入服务器,原创 2013-07-06 21:37:18 · 12861 阅读 · 3 评论 -
【Linux学习】epoll详解
什么是epollepoll是什么?按照man手册的说法:是为处理大批量句柄而作了改进的poll。当然,这不是2.6内核才有的,它是在2.5.44内核中被引进的(epoll(4) is a new API introduced in Linux kernel 2.5.44),它几乎具备了之前所说的一切优点,被公认为Linux2.6下性能最好的多路I/O就绪通知方法。 epoll的相关原创 2013-07-05 11:50:42 · 153536 阅读 · 26 评论 -
Nginx学习之七-模块ngx_epoll_module详解(epoll机制在nginx中的实现)
本文结合实际代码介绍事件驱动模块接口与epoll用法是如何结合起来发挥作用的。Nginx中ngx_epoll_module模块基于epoll实现了Nginx的事件驱动。模块定义(src/event/ngx_epoll_module.c):ngx_module_t ngx_epoll_module = { NGX_MODULE_V1, &ngx_epoll_modu原创 2013-07-05 11:30:50 · 16399 阅读 · 2 评论 -
Nginx学习之六-nginx核心进程模型
一、Nginx整体架构正常执行中的nginx会有多个进程,最基本的有master process(监控进程,也叫做主进程)和woker process(工作进程),还可能有cache相关进程。一个较为完整的整体框架结构如图所示:二、核心进程模型启动nginx的主进程将充当监控进程,而由主进程fork()出来的子进程则充当工作进程。nginx也可以原创 2013-07-04 11:22:23 · 16337 阅读 · 6 评论 -
Nginx学习之四-Nginx进程同步方式-自旋锁(spinlock)
自旋锁简介Nginx框架使用了三种消息传递方式:共享内存、套接字、信号。Nginx主要使用了三种同步方式:原子操作、信号量、文件锁。基于原子操作,nginx实现了一个自旋锁。自旋锁是一种非睡眠锁。如果某进程视图获得自旋锁,当发现锁已经被其他进程获得时,那么不会使得当前进程进入睡眠状态,而是始终保持进程在可执行状态,每当内核调度到这个进程执行时就持续检查是否可以获取到所锁。原创 2013-07-02 10:27:31 · 7968 阅读 · 0 评论 -
Nginx学习之三-ngx_http_request_t结构体
ngx_http_request_s是nginx中非常重要的一个结构体,贯穿于htpp请求处理的整个过程中。下面解释了ngx_http_request_s结构体中与HTTP框架相关的重要的成员变量。struct ngx_http_request_s { uint32_t signature; /* "HTTP原创 2013-06-27 16:41:50 · 18126 阅读 · 0 评论 -
Nginx学习之二-配置项解析及编程实现
在开发功能灵活的Nginx模块时,需要从配置文件中获取特定的信息。不过,我们并不需要再编写一套读取配置的系统,Nginx已经为用户提供了强大的配置项解析机制,同时还支持“-s reload”命令,可以在不重启服务的情况下可使配置生效。一、Nginx配置文件简介如果编译安装Nginx时使用默认路径,那么Nginx运行目录是/usr/local/nginx,其配置文件存放目录是/usr原创 2013-06-21 17:36:33 · 14782 阅读 · 3 评论 -
Nginx学习之一-第一个程序Hello World
本例子实现了一个简单的hello world程序。运行效果:虚拟机Ubuntu中:win7中chrome浏览器:一、config文件编写Nginx提供了一种简单的方式将第三方的模块编译到Nginx中。首先把源代码文件全部放到一个目录下,同时在该目录中编写一个文件用于通知Nginx如何编译本模块,这个文件名必须为config。然后,在configure原创 2013-06-19 16:50:42 · 28294 阅读 · 11 评论