博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
nginx源码剖析--从main函数开始
阅读量:4166 次
发布时间:2019-05-26

本文共 1463 字,大约阅读时间需要 4 分钟。

八九月份找好工作之后,着实懒散了一段时间。现在回想起来,九月份没有做一件有意义的事情,成天都是胡思海想。现在工作基本上定下来了,打算这段时间直到毕业,好好学习几个方面的知识:

  1. 后台开发
  2. 数据存储

后台开发上主要是打算吃透nginx。为了达到这个目的,这段时间会写一系列的nginx源码剖析的文章。由于水平实在有限,可能会写相当长的时间,并且写的时候也会有许多问题。不过我总是会尽自己最大的努力的。

想起来,第一次尝试看nginx是在一年前了。时间过的很快,虽然一年过去了,还是有很多不懂的地方,因此写这个系列的博文主要还是想督促自己把它看透。


nginx是一个轻量级的web服务器。它性能好,设计优雅,因此无论从功能实现,还是架构设计上都值得我们研读。这篇博文从main函数开始。

main函数是服务器启动的入口,总的来说,main主要是做了两件事情。

  1. 初始化服务器的一些全局变量
  2. 启动各个IO事件进程

对于初始化任务,主要都是在ngx_init_cycle函数中完成。这个函数主要是完成对ngx_cycle_t结构体的初始化。Nginx所有动作都是围绕着ngx_cycle_t结构体进行的。Nginx的高度灵活性,主要就是来自于它的高可配置性,也就是说,在不需要改变源代码,只需要改变配置文件的情况下,就可以实现不同的功能。这是系统设计中的一个很重要的方法。而ngx_cycle_t结构体就是和可配置性息息相关的。

可以说,ngx_cycle_t是配置文件通往nginx实际运行的桥梁,配置文件可以通过改变ngx_cycle_t结构体中的相关值来改变nginx的实际运行行为

ngx_cycle_t结构体的介绍我们留给下一篇。

初始化完成之后,下面就是启动IO处理进程了,这是web服务器的核心。Nginx使用的也是多路IO复用+reactor的范式。Nginx提供了单进程和多进程的模式:

if (ngx_process == NGX_PROCESS_SINGLE) {        ngx_single_process_cycle(cycle);    } else {        ngx_master_process_cycle(cycle);    }
ngx_single_process_cycle

就是只启动一个IO进程来处理服务器IO事件。

ngx_master_process_cycle

启动多个worker进程处理IO事件,同时有一个master进程管理这些worker进程。

深入到每个IO进程里面,我们就会发现每个IO进程都会有一个类似这样的死循环:

for ( ;; ) {    ......    ngx_process_events_and_timers(cycle);    ......}

这里就是IO事件循环,它的核心工作主要是处理IO事件和定时器事件。

我们看到这里把cycle作为参数传递到事件处理器中,就验证我们前面所说,Nginx主要是围绕这个结构体运行的。它会影响nginx如何做事件处理。


本篇我粗糙讲了一下nginx服务器启动的流程,主要包括初始化和事件循环启动。nginx提供多进程和单进程的事件处理逻辑。Nginx的运行主要是围绕ngx_cycle_t结构体,因此初始化部分主要是对它进行初始化。下一篇我们将会深入了解一下这个NGINX的核心结构体。这个结构体上面有nginx运行时所依赖的资源,有配置文件相关的配置项信息,以及各个模块各自加载的配置项的信息。

转载地址:http://hsqxi.baihongyu.com/

你可能感兴趣的文章
Java设计模式(1) - 单例设计模式多种写法
查看>>
Java设计模式(2) - 工厂设计模式
查看>>
Java多线程(8) - 同步(并发)类容器详解(CopyOnWrite容器、ConcurrentMap容器、Queue队列容器)
查看>>
Java设计模式(3) - 多线程并发设计模式 - Future设计模式
查看>>
Java设计模式(5) - 多线程并发设计模式 - 生产者-消费者设计模式多种写法
查看>>
Java多线程(9) - 多线程 - 线程池详解与使用示例
查看>>
Java多线程(10) - 多线程 - CountDownLatch、CyclicBarrier、Semaphore使用示例详解
查看>>
Java多线程(11) - 多线程 - 锁详解:重入锁、公平锁、非公平锁、读写锁、不可重入锁、自旋锁、独享锁、共享锁、互斥锁、悲观锁、乐观锁、分段锁、偏向锁、轻量级锁、重量级锁、CAS算法原理
查看>>
Java网络编程(10) - Netty网络编程常见问题与疑问
查看>>
设置Django连接到Google Cloud SQL(MYSQL)
查看>>
爬虫: 基于Node.js的强大爬虫,能直接发布抓取的文章哦
查看>>
Django学习笔记 扩展User模型
查看>>
Django资料总结
查看>>
Android进阶系列-发布项目到Jcenter
查看>>
基于Zxing的二维码扫描解析库——ZxingPlus
查看>>
算法入门-程序设计入门
查看>>
java数据结构-数据结构的概述
查看>>
java -Math常用方法
查看>>
Android进阶系列-手写数据库框架
查看>>
算法入门-循环结构程序设计
查看>>