nginx源码阅读(一).综述

nginx源码阅读(一).综述

置顶 2017年10月28日 09:33:43 UKey_ 阅读数:3868 标签: nginx源码阅读web服务器简介 更多

个人分类: Nginx

所属专栏: Nginx源码阅读

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Move_now/article/details/78373017

前言

nginx作为一款开源的轻量级高性能web服务器,是非常值得立志从事服务端开发方向的人学习的。现今nginx的最新版本是nginx-1.13.6,代码量也日渐庞大,但是由于其核心思想并没改变,为了降低阅读难度,我选择的是nginx-1.0.15版本,并且由于时间和水平有限,重点关注的是nginx的启动以及进程模型、事件模块中的epoll模块、负载均衡以及整体的框架等方面。 

这里先推荐两本有关nginx的书籍:《深入理解Nginx》、《深入剖析Nginx》,后者已经绝版了,可以去网上找pdf阅读。

不过建议主要还是以代码为主,书籍为辅。

下面简单的介绍一下后面会进行分析的各块。

nginx的启动

nginx整个启动流程围绕着ngx_cycle_t结构体进行操作。要知道nginx是高度模块化以及非常依赖配置文件,大部分功能都需要配置文件的配置才能进行。在启动工作中,需要做的主要工作就是读取配置文件,然后将各模块感兴趣的配置项保存到各结构体中,根据配置文件对所有的模块进行初始化,接着启动各进程,准备进行工作。

nginx的多进程模型

另一款比较常用的web服务器就是apache,它最大的特点就是稳定,所以相比于nginx复杂很多也臃肿很多。nginx最大的特点就是强调性能,在后面展示其源码时也可以看到它为了追求性能所做的一些工作。 

nginx之所以高效的主要原因是它采用的异步非阻塞多进程模型,并且一般进程的个数与cpu核心数相同,一个master进程,多个worker进程,可能还会有cache loader以及cache manager进程,多个连接对应一个worker进程,master进程主要负责管理worker进程以及启动/停止服务、重新读取配置文件、平滑升级等功能,而cache进程则当开启了缓存功能才会出现。

apache则通常采用同步多进程模型,每个连接对应一个进程,apache采用的这种模型,当请求较多时,进程也随之变多,cpu资源耗费在进程间切换非常昂贵(毕竟要切换进程的上下文以及重载缓存等),而nginx因为进程数固定且很少,并且由于cpu是多核心的,可以同时运行多个不同的进程/线程,每个进程的资源都互相独立,因此切换时无需进行上下文的切换。那么为什么不采用多线程结构呢,不是说线程间的切换比进程间的切换更迅速吗,若cpu是单核的的确如此,但是当每个cpu核心运行一个线程的时候,由于线程间需要共享资源,所以这些资源必须从一个核心拷贝到另外一个核心,反观多进程就不需要。因此在cpu为多核的情况下,多线程在性能上反而可能不如多进程。

关于同步和异步的区别,可以简单的理解为,采用同步模型,cpu会阻塞等待请求的完成,而异步非阻塞时,cpu不会阻塞等待,内核处理完之后再进行通知。

nginx的事件模块

nginx采用的是事件驱动机制来处理事件,不同的模块有各自己负责处理的事件,当一个事件发生时,相应的模块就会对该事件进行处理。对于一个web服务器来说,用户的请求其实就对应了一个tcp连接,也对应了读/写事件,nginx内部使用了连接池、内存池等机制提高效率,而nginx的事件模块中针对不同的I/O多路机制select、epoll、kqueue、eventport也编写了不同的模块,这是为了能让nginx在更多的操作系统上运行。在linux下,我们重点关注的就是epoll对应的模块,nginx对epoll提供的接口进行了封装,并且将定时事件也集成到了其中。

负载均衡

nginx有两处地方进行了负载均衡。一处是当大量的请求到来时,各个worker进程该如何分配这些请求,而不会造成其中某个worker进程超载,而另外的worker进程则空闲,nginx采用的是负载均衡锁,当一个worker进程处理的连接数大于某个值时,就不再接受新的连接。

还有一处是当nginx作为反向代理服务器运行时,会将客户端的请求转发给上游服务器,若上游服务器有多个,则需要选择将请求转发给哪个上游服务器,一直转给一个造成其中某个服务器过载,但是其余空闲肯定是不对。nginx官方提供了加权轮询、IP哈希这两种负载均衡的方法。加权轮询简单的来说就是计算各个上游服务器的权值,然后选择权值最高的服务器处理请求;IP哈希负载均衡策略则会使用客户端的ip地址作为哈希的key来决定选择服务器群中某台服务器来处理客户端的请求,这种方式可以确保来自同一台客户端的请求会分发到同一台服务器上,除非这台服务器处于不可用状态。

除了这两种方法之外,还有一致哈希、fair等方法,不过都是第三方模块。

整体架构

nginx即可以处理静态请求也可以处理动态请求,并且还可以作为反向代理服务器。但是它处理动态请求的效果并不如apache好,因此一般作为静态web服务器和反向代理服务器。整体的架构引用《深入剖析Nginx》书中的图: 

小结

本小节简单的介绍了一下后面要展开分析的各块,接下来正式开始分析nginx的启动流程。



nginx源码阅读(一).综述 - Move_now的博客 - CSDN博客

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352

推荐阅读更多精彩内容

  • 第一章 Nginx简介 Nginx是什么 没有听过Nginx?那么一定听过它的“同行”Apache吧!Ngi...
    JokerW阅读 32,664评论 24 1,002
  • 1. Nginx的模块与工作原理 Nginx由内核和模块组成,其中,内核的设计非常微小和简洁,完成的工作也非常简单...
    rosekissyou阅读 10,208评论 5 124
  • 上一篇《WEB请求处理一:浏览器请求发起处理》,我们讲述了浏览器端请求发起过程,通过DNS域名解析服务器IP,并建...
    七寸知架构阅读 80,982评论 21 356
  • 什么是Nginx? Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器N...
    jiangmo阅读 2,537评论 1 9
  • 璞玉57阅读 306评论 6 3