前言
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采用的这种模型,当请求较多时,进程也随之变