
nginx源码分析
文章平均质量分 73
鱼思故渊
这个作者很懒,什么都没留下…
展开
-
nginx源码分析--高性能服务器开发 常见进程模型
1、高性能服务器对一个高性能服务器来说,处理速度快和资源占用小是典型特性,尤其是当服务器遇到C10K问题的时候(网络服务器在处理数以万计的客户端连接时,往往出现效率低下甚至完全瘫痪,这被称为C10K问题)。要做到处理速度足够快,其并发模型的设计相当关键,而要做到资源尤其是内存资源的占用少,就要依赖于其资源分配和资源管理的方案设计。服务器的并发模型设计是网络编程中很关键的一个部分,服务器的并原创 2014-11-08 20:31:56 · 2411 阅读 · 0 评论 -
nginx中时间的管理
nginx出于性能考虑采用类似lib_event的方式,自己对时间进行了cache,用来减少对gettimeofday()的调用,因为一般来说服务器对时间的精度要求不是特别的高,不过如果需要比较精确的timer,nginx还提供了一个timer_resolution指令用来设置时间精度,具体的机制再后面会做介绍。在ngx_times.c中提供了ngx_time_update()函数来更新时间缓存,原创 2014-11-18 23:16:35 · 1673 阅读 · 1 评论 -
nginx源码分析--请求头接受流程(2)
在ngx_http_process_request_line函数中,解析完请求行之后,如果请求行的uri里面包含了域名部分,则将其保持在请求结构的headers_in成员的server字段,headers_in用来保存所有请求头,它的类型为ngx_http_headers_in_t:[cpp] view plaincopy"font-size: 18px; ">type转载 2014-11-19 20:57:42 · 1404 阅读 · 0 评论 -
nginx源码分析--module开发(4)
3、对HTTP body的处理上面我们已经开始处理http request header了,接下来,如果请求中有body内容,那么需要处理body了。这里你肯定不会想要去阻塞式的读取body吧?body的长度可大可小,网络环境也巨复杂,只要有阻塞操作肯定玩完。Nginx这时已经准备了一个现成的读取body的非阻塞模式给用户,就是ngx_http_read_client_request_body转载 2014-11-19 20:54:12 · 988 阅读 · 0 评论 -
Nginx源码分析—业务流程
Nginx源码分析—业务流程到此为止,我们假设ngx_init_cycle已经结束,我们暂时不管他做了什么,我们从他做的效果进入。从常理上来讲,如果一个请求到达,那么我们需要接受这个请求,那么就从请求来介绍!在ngx_event_process_init函数中将监听套接字上的读事件注册为ngx_event_accept,ngx_event_accept是为了接受请求的,它负责接收一个连原创 2014-11-19 20:02:34 · 1628 阅读 · 0 评论 -
nginx源码分析--module开发(3)
2、HTTP框架继续上面这个例子,比如当nginx收到一个http请求时,我的module需要处理这个请求,那么我应该怎么做?实际这个问题还要再细分。如果是希望nginx收到完整的HTTP请求,再交给我的module处理?又或者只需要接收到完整的http header就给我呢?我把接收完header就交给module处理的code列下,再说下它的处理流程。首先我要在ngx_XXX_init转载 2014-11-19 20:52:15 · 722 阅读 · 0 评论 -
nginx启动期都做了哪些事
nginx是个多进程web容器,不同的配置下它的启动方式也是不同的,这里我只说说最典型的启动方式。它有1个master进程,和多个worker进程(最优配置的数量与CPU核数相关)。那么,首先我们要找到main函数,它在src/core/nginx.c文件中。谈到源码了,这时我们先简单看下源码的目录结构吧。nginx主要有下列目录:src/core,这个目录存放了基础的数据结构转载 2014-11-14 22:14:46 · 807 阅读 · 0 评论 -
nginx源码分析--nginx进程间通信
Linux下的IPC很多,nginx的进程都是有亲缘关系的进程,对于他们的通信我们选择TCP socket进行通信。 TCP socket 用来做进程通信的好处有, 1.socket是文件描述符,操作简单。 2.双向流动。3.另外还有一个重要好处:可记录可重现,我们可以用tcpdump抓取信息,方便调试。当然对于进程间大量数据的共享 自然而然的我们采用共享内存。采用socketpa原创 2014-11-15 07:50:01 · 1663 阅读 · 0 评论 -
"惊群",看看nginx怎么解决它的
在说nginx前,先来看看什么是“惊群”?简单说来,多线程/多进程(linux下线程进程也没多大区别)等待同一个socket事件,当这个事件发生时,这些线程/进程被同时唤醒,就是惊群。可以想见,效率很低下,许多进程被内核重新调度唤醒,同时去响应这一个事件,当然只有一个进程能处理事件成功,其他的进程在处理该事件失败后重新休眠(也有其他选择)。这种性能浪费现象就是惊群。惊群通常发生在ser转载 2014-11-14 07:48:56 · 864 阅读 · 0 评论 -
nginx中父子进程工作的主体函数
根据Nginx(0.7.67版本)的代码,对Nginx基本的进程创建,进程主体以及事件处理进行了简要的分析。基本上,父进程(即主进程)一开始会初始化及读取配置,并加载各模块的功能,然后fork()出N个子进程(即工作进程),具有相同的工作逻辑和功能。父进程负责监听信号(如HUP,QUIT等),通过socket pair把信号传递给子进程(子进程间一般不通信)。子进程通过事件来处理父进程原创 2014-11-08 19:49:07 · 1242 阅读 · 0 评论 -
nginx源码分析--master和worker进程模型
一、Nginx整体架构正常执行中的nginx会有多个进程,最基本的有master process(监控进程,也叫做主进程)和woker process(工作进程),还可能有cache相关进程。一个较为完整的整体框架结构如图所示:二、核心进程模型启动nginx的主进程将充当监控进程,而由主进程fork()出来的子进程则充当工作进程。nginx也可以原创 2014-11-08 20:09:45 · 7899 阅读 · 1 评论 -
反向代理的概念nginx方向代理和负载均衡的方法
1.什么是正向代理和正向代理服务器?正向代理就是通常所说的代理,是某台电脑通过一台服务器来上Internet网的这种方式,其中这台电脑就叫客户机,这台服务器就叫正向代理服务器也就是通常所说的代理服务器。在这种方式中,你是主动的,网站是被动的,网站那里不能得到你的真实ip地址。正向代理服务器。它只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器(一般在IE-Internet原创 2014-09-13 09:57:27 · 2627 阅读 · 0 评论 -
ngxin的Module开发(2)
nginx的module开发很弱,首先它不是采用动态库的形式被主进程加载,而是要求module的源码必须和nginx的源码一起编译。我是第一次见到这么BT的家伙,呵呵。所以呢,对module开发者来说,nginx就是一个开发平台,可以把它理解为在nginx这个“OS”上用C语言开发application,而且要遵循nginx的框架。既然是平台,那么像其他OS一样,我们需要搞明白几点:1、程序入转载 2014-11-19 20:50:26 · 878 阅读 · 0 评论 -
nginx源码分析--请求体的读取(1)
上节说到nginx核心本身不会主动读取请求体,这个工作是交给请求处理阶段的模块来做,但是nginx核心提供了ngx_http_read_client_request_body()接口来读取请求体,另外还提供了一个丢弃请求体的接口-ngx_http_discard_request_body(),在请求执行的各个阶段中,任何一个阶段的模块如果对请求体感兴趣或者希望丢掉客户端发过来的请求体,可以分别调用原创 2014-11-19 20:58:51 · 2265 阅读 · 0 评论 -
Nginx源码分析—worker进程的创建
Nginx源码分析—worker进程的创建假设现在ngx_init_cycle已经结束(毕竟这个函数确实庞大),也就是说关于nginx的初始化都已经结束。那么看看如何创建进程模型ngx_master_process_cycle。在这个函数中,首先情况一些信号,然后将需要关注的信号注册进去(这个时候关于信号的处理函数已经被注册),可以看出来master进程关注的信号有10个。比如SIGCHL原创 2014-11-19 20:01:43 · 1399 阅读 · 0 评论 -
Nginx源码分析—过期事件和惊群事件的处理
Nginx源码分析—过期事件和惊群事件的处理过期事件:每个事件的date域都是一个结构体ngx_connection_t结构体,表示对应的连接。对于一个结构体struct epoll_event 中的data.ptr成员存储的是ngx_connection_t连接,这里使用Instance标志位来标识,下面就配合ngx_epoll_process_events方法说明他的用法。Data.p原创 2014-11-26 15:09:08 · 2188 阅读 · 2 评论 -
nginx源码分析--进程间通信机制 & 同步机制
Nginx源码分析—进程间通信机制从nginx的进程模型可以知道,master进程和worker进程需要通信,nginx中通信的方式有套接字、共享内存、信号。对于master进程,从外部接受信号,master进程主要就是监控、接受外部信号,将有必要的信号传递给worker进程,master进程大部分时间都是阻塞在sigsuspend()函数调用上。Worker进程屏蔽了所有的外部信号,那么Ma原创 2014-11-20 22:54:19 · 2061 阅读 · 0 评论 -
Nginx源码分析—HTTP框架执行流程
Nginx源码分析—HTTP框架执行流程 HTTP框架动态执行中的大概流程:先与客户端建立TCP连接,接收HTTP请求行、头部并解析出他们的意义,再根据nginx.conf配置文件找到一些HTTP模块,使其一次合作者处理这个请求。 为了精确地控制超时,还需要把读写事件放置到定时器中。 通过事件模块提东的ngx_handle_read_ev原创 2014-11-26 15:10:24 · 2328 阅读 · 0 评论 -
Nginx源码分析—架构设计思想
Nginx源码分析—架构设计思想我任务nginx的源码可以分为三个部分,一个是在ngx_init_cycle之前,这个也算是为了重新启动nginx而准备的代码,比如说在这个时候可以接受外部的信号,也可以保存传递的参数,等等,当然在以后的函数中也考虑了是否正在重启nginx。 至于ngx_init_cycle这个函数,是一个很庞大的函数,在这个函数中可以看到调用了各个模块的钩原创 2014-11-26 15:08:21 · 2427 阅读 · 0 评论 -
Nginx源码分析—nginx的配置
Nginx源码分析—nginx的配置Nginx都是一个master进程来管理多个worker进程。Worker进程的数量与服务器上的CPU核心数相等。Master是管理worker,接受外部信号,worker进程之间通过共享内存、原子操作实现通信和同步。任意一个worker进程出现错误从而导致coredump时,master进程会立刻启动新的worker进程继续服务。不同worker进原创 2014-11-26 15:07:22 · 1615 阅读 · 0 评论 -
Nginx源码分析—定时器事件
Nginx源码分析—定时器事件对于每一个进程都有一个事件缓存,对于worker进程而言,除了nginx启动时更显一次时间外,任何更新时间的操作都只能由ngx_epoll_process_events方法执行。在此方法中,当flags参数中有NGX_UPDATE_TIME标志位,或者ngx_event_timer_alarm标志位为1时,就会调用ngx_time_update方法更新缓存时间。原创 2014-11-26 15:09:46 · 1579 阅读 · 0 评论 -
nginx源码分析--事件模块 & 琐碎
通过HUP信息使得NGINX实现重新读取配置文件,使用USR2信号使得NGINX实现平滑升级。在nginx中有模块这么一说,对外所有的模块都是ngx_module_t类型,这个结构体作为所有模块的通用接口,它只定义了init_master、init_module、init_process、init_thread、exit_thread、exit_process、exit_master这7个回调原创 2014-11-20 21:55:28 · 1694 阅读 · 0 评论 -
nginx源码分析--多阶段请求处理
读取完请求头后,nginx进入请求的处理阶段。简单的情况下,客户端发送过的统一资源定位符(url)对应服务器上某一路径上的资源,web服务器需要做的仅仅是将url映射到本地文件系统的路径,然后读取相应文件并返回给客户端。但这仅仅是最初的互联网的需求,而如今互联网出现了各种各样复杂的需求,要求web服务器能够处理诸如安全及权限控制,多媒体内容和动态网页等等问题。这些复杂的需求导致web服务器不再是一原创 2014-11-19 21:05:01 · 1312 阅读 · 0 评论 -
nginx源码分析--请求体的读取(2)
2,丢弃请求体一个模块想要主动的丢弃客户端发过的请求体,可以调用nginx核心提供的ngx_http_discard_request_body()接口,主动丢弃的原因可能有很多种,如模块的业务逻辑压根不需要请求体 ,客户端发送了过大的请求体,另外为了兼容http1.1协议的pipeline请求,模块有义务主动丢弃不需要的请求体。总之为了保持良好的客户端兼容性,nginx必须主动丢弃无用的请求体转载 2014-11-19 21:03:32 · 1027 阅读 · 0 评论 -
nginx源码分析--框架设计 & master-worker进程模型
Nginx的框架设计—进程模型在这之前,我们首先澄清几点事实:nginx作为一个高性能服务器的特点,其实这也是所有的高性能服务器的特点,依赖epoll系统调用的高效(高效是相对select/poll这些系统调用的,底层有一个链表和红黑树,避免了轮询,减少了用户空间和系统空间之间的数据传递等),非阻塞(所有的操作都是非阻塞,这样),多进程(master-slave进程模型),这些事实使得ng原创 2014-11-19 19:56:52 · 2963 阅读 · 0 评论 -
nginx源码码分析--请求头的接受流程(1)
篇文章主要会介绍nginx中请求的接收流程,包括请求头的解析和请求体的读取流程。首先介绍一下rfc2616中定义的http请求基本格式:[cpp] view plaincopy"font-size:18px;">Request = Request-Line *(( general-header | req转载 2014-11-19 20:55:57 · 1388 阅读 · 0 评论 -
nginx做反向代理处理http请求的过程
我用nginx作反向代理,代理到百度(www.baidu.com),测试时在本地修改了host文件。把www.baidu.com解析到nginx代理服务器(74.91.23.207)上# vim /etc/hosts下面看一下nginx的配置文件段 (其中:server 115.239.210.27 是百度的服务器地址)接下来,在浏览器中输入 www.baidu.原创 2014-09-13 09:58:17 · 8698 阅读 · 1 评论 -
nginx源码分析--nginx上下文结构初始化
说在前面:本文的讨论基于的nginx版本是1.2.1。文章对于nginx的一些背景知识(如什么是模块,上下文等)没有过多提及,本文适合对nginx有一定了解的同学。 ngx_conf_t *cf; 做过nginx模块开发,或者是有学习过nginx源码的同学会对这个结构体非常眼熟了。ngx_cycle.c:251 conf.ctx = cycle->conf_ctx; c原创 2014-04-25 16:30:27 · 2813 阅读 · 1 评论 -
nginx源码分析--配置文件详解
对 Nginx 配置文件的一些认识:配置指令具有作用域,分为全局作用域和使用 {} 创建其它作用域。同一作用域的不同的配置指令没有先后顺序;同一作用域是否能使用相同的指令,和对相 同指令的处理由各模块自行决定整个 Nginx 的运行时各模块行为都和配置指令密切相关每个配置指令都只能在预先定义好的作用域中使用配置指令解析使用递归的方式配置解析相关代码量巨大,本文势必很冗长。所以,都要做好原创 2014-04-25 17:41:36 · 2016 阅读 · 0 评论 -
nginx源码分析--event事件驱动初始化
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_conffor (i =原创 2014-04-24 08:15:38 · 1683 阅读 · 0 评论 -
Nginx惊群问题
1. 简介 简单来说,多线程/多进程(linux下线程进程也没有多大区别)等待同一个socket事件,当这个事件发生时,这些线程/进程被同时唤醒,就是惊群。可以想见,效率很低下,许多进程被内核重新调度唤醒,同时去响应这一个事件,当然只有一个进程能处理事件成功,其他的进程在处理该事件失败后重新休眠(也有其他选择)。这种性能浪费现象就是惊群。 惊群通常发生在server 上转载 2014-03-18 15:08:43 · 1333 阅读 · 0 评论 -
nginx源码分析--内存池ngx_poll_t 内存池管理
本博客(http://blog.youkuaiyun.com/livelylittlefish)贴出作者(阿波)相关研究、学习内容所做的笔记,欢迎广大朋友指正!Content0.序1.内存池结构1.1 ngx_pool_t结构1.2其他相关结构1.3 ngx_pool_t的逻辑结构2.内存池操作2.1创建内存池2.2销毁内存池2.3重转载 2014-03-09 21:18:28 · 1139 阅读 · 0 评论 -
ngx源码分析--数据结构 队列ngx_queue_t
本博客(http://blog.youkuaiyun.com/livelylittlefish )贴出作者(阿波)相关研究、学习内容所做的笔记,欢迎广大朋友指正!Content0. 序1. 队列结构2. 队列操作2.1 在头节点之后插入2.2 在尾节点之后插入2.3 删除节点2.4 分割队列2.5 链接队列2.6 获取中间转载 2014-03-09 20:06:45 · 1059 阅读 · 0 评论 -
nginx源码分析--链表结构体ngx_list_t
Content1.链表结构1.2 ngx_list_t的逻辑结构2.1创建链表3.一个例子3.2如何编译4.小结0. 序 本文继续介绍nginx的容器——链表。链表实现文件:文件:./src/core/ngx_list.h/.c。.表示nginx-1.0.4代码目录,本文为/usr/src/nginx-1.0.4。1. 链表结构 1.1转载 2014-03-09 19:01:03 · 1283 阅读 · 0 评论 -
nginx源码分析--数据结构 哈希 ngx_hash_t
Content0.序1.hash结构1.1ngx_hash_t结构1.2ngx_hash_init_t结构1.3ngx_hash_key_t结构1.4hash的逻辑结构2.hash操作2.1NGX_HASH_ELT_SIZE宏2.2hash函数2.3hash初始化2.4hash查找3.一个例子3.1代码3.2如何编译3.3运行结果3.转载 2014-03-09 21:16:50 · 1577 阅读 · 0 评论 -
ngx源码分析--模块及其初始化
Content0.序1. nginx有哪些模块?2. nginx如何描述这些模块?2.1模块数据结构2.1.1 ngx_module_t结构2.1.2 ngx_command_t结构2.2模块类图3. nginx如何组织这些模块?3.1全局数组ngx_modules3.2模块组织结构图4. nginx的模块种类5. nginx如何转载 2014-03-09 21:22:14 · 1334 阅读 · 0 评论 -
nginx源码分析--数据结构ngx_array_t
Content0.序1.数组结构1.1 ngx_array_t结构1.2 ngx_array_t的逻辑结构2.数组操作2.1创建数组2.2销毁数组2.3添加1个元素3.一个例子3.1代码3.2如何编译3.3运行结果4.小结0. 序本文开始介绍nginx的容器,先从最简单的数组开始。数组实现文转载 2014-03-09 17:17:52 · 1137 阅读 · 0 评论 -
ngx源码分析--启动流程
本文链接:http://blog.youkuaiyun.com/livelylittlefish/article/details/7243718Content0. 序1. main()分析2. 注意问题2.1 几个初值2.2 nginx工作模式2.3 一些配置2.4 其他开关3. 小结0.序本文主要分析nginx主程序。nginx主程序main()实现文件:转载 2014-03-09 21:19:56 · 1337 阅读 · 0 评论 -
nginx源码分析--配置文件解析
Nginx的配置解析相关的部分比较绕,比如为何要有4重指针,比如NGX_MAIN_CONF , loc_conf,NGX_DIRECT_CONF有什么区别呢?这些我前面的blog都有些涉及,这次主要是把配置这块完全拿出来然后来分析下。首先来看配置解析时的数据结构,这里主要是ngx_conf_t,这个结构保存了解析配置文件所需要的一些域,这个是非常重要的一个数据结构,我们详细来看这个结构:s转载 2014-04-26 09:44:37 · 1309 阅读 · 0 评论 -
nginx源码分析--配置文件解析
ngx-conf-parsing对 Nginx 配置文件的一些认识:配置指令具有作用域,分为全局作用域和使用 {} 创建其它作用域。同一作用域的不同的配置指令没有先后顺序;同一作用域是否能使用相同的指令,和对相 同指令的处理由各模块自行决定整个 Nginx 的运行时各模块行为都和配置指令密切相关每个配置指令都只能在预先定义好的作用域中使用配置指令解析使用递归的方式配置解析相关代码量原创 2014-04-26 10:53:37 · 1570 阅读 · 0 评论