闲不下来-nginx源码全局认知(三)

闲不下来-nginx源码全局认知

时隔了也不知道多少天,终于要写这部分的内容了。

本来国庆期间写一些内容的,但是发现我挺天真的,基本在床上躺尸看着别人旅游...

❤要收回来,踏踏实实的继续阅读我们的nginx源码吧,害...

个人觉得,阅读源码之前,要了解整个nginx的架构,或者整体结构,况且nginx源码目录结构非常清晰,方便大家学习或者阅读想要看的模块。

注意:此次阅读nginx源码版本是0.5

首先我们键入一个终端命令:tree -L 1

↳ tree -L 1                                                     22:08:02 
.
├── core
├── event
├── http
├── mail
├── misc
├── os

6 directories, 0 files
复制代码

简单介绍一下每个模块是做什么的

  • core: nginx的核心源代码,包括常用数据结构以及内核实现的核心代码,比如红黑树,队列等
  • event: nginx事件驱动模型,以及定时器的实现相关代码;
  • http: nginx实现http服务器相关的代码,之后重头戏呀;
  • mail: nginx实现邮件代理服务器相关的代码;
  • misc: 辅助代码,测试C++头的兼容性,以及对Google_PerfTools的支持;
  • os: 不同体系结构所提供的系统函数的封装、提供对外统一的系统调用接口;

初期,我们主要阅读的是core、event、http三个核心模块,其实这三个模块也算是nginx的重要组件了。

总体架构

在阅读源码或者调试之前,首先要对nginx源码全局的认知,要了解nginx都有哪些组件,都包含了哪些功能,因此我画了一个图方便理解。

nginx-模块

  • 核心模块功能:为其他模块提供一些基本功能:字符串处理、时间管理、文件读写等功能(无论什么框架源码,都会包含一些基本的工具或者处理等功能的实现);
  • 配置解析:主要包括文件语法检查、配置参数解析、参数初始化等功能;(一般优秀的框架都会提供给用户对应的使用配置,因此这部分是必需品)
  • 内存管理:内存池管理、共享内存的分配、缓冲区管理等功能;(内存管理是任何框架的保证)
  • 事件驱动:进程创建与管理、信号接收与处理、所有事件驱动模型的实现、高级 IO 等功能;(nginx的核心,包括redis的核心也如此)
  • 日志管理:错误日志的生成与管理、任务日志的生成与管理等功能;(耳熟能详的日志管理,没有它,我们怎么排查错误呀)
  • HTTP 服务:提供 Web 服务,包括客户度连接管理、客户端请求处理、虚拟主机管理、服务器组管理等功能;(nginx所干的事情,不就是如此吗?)
  • Mail 服务:与 HTTP 服务类似,但是增加了邮件协议的实现;(比如25、465等)

core

core 目录中的源码定义了 nginx 服务器最基本的数据结构以及最基本的核心模块(核心模块为其他模块提供了公共调用的基本功能)。首先看下该核心模块的源码结构:

nginx-core-SXRWcE

注意:部分xxx.h省略,只是因为有c在,h有些是配对的,并且图片过大的话,体验不太友好...

从这部分图可以看出,nginx核心目录主要包含一些高效的数据结构和一些配置、日志、连接、内存等一些管理文件。

后续会针对该部分进行详细的介绍

event

event 目录里面包含一种子目录 module 以及一些文件,除了 module 子目录,其他文件提供了事件驱动模型相关数据结构的定义、初始化、事件接收、传递、管理功能以及事件驱动模型调用功能。module 子目录里面的源码实现了Nginx 支持的事件驱动模型:AIO、epoll、kqueue、select、/dev/poll、poll 等事件驱动模型;

nginx-event

注意:部分xxx.h已省略,从上图可以看出event目录主要包含一些事件驱动模型的实现以及事件管理的封装,后面章节会详细讲解该部分的内容。

http

http 目录和 event 目录一样,通用包含了模块实现源码的 module 目录文件以及一些结构定义、初始化、网络连接建立、管理、关闭,以及数据报解析、服务器组管理等功能的源码文件。module 目录文件实现了HTTP 模块的功能。

├── modules
├── ngx_http_busy_lock.c
├── ngx_http_busy_lock.h
├── ngx_http.c
├── ngx_http_cache.h
├── ngx_http_config.h
├── ngx_http_copy_filter_module.c
├── ngx_http_core_module.c
├── ngx_http_core_module.h
├── ngx_http_file_cache.c
├── ngx_http.h
├── ngx_http_header_filter_module.c
├── ngx_http_parse.c
├── ngx_http_parse_time.c
├── ngx_http_postpone_filter_module.c
├── ngx_http_request_body.c
├── ngx_http_request.c
├── ngx_http_request.h
├── ngx_http_script.c
├── ngx_http_script.h
├── ngx_http_spdy.c
├── ngx_http_spdy_filter_module.c
├── ngx_http_spdy.h
├── ngx_http_spdy_module.c
├── ngx_http_spdy_module.h
├── ngx_http_special_response.c
├── ngx_http_upstream.c
├── ngx_http_upstream.h
├── ngx_http_upstream_round_robin.c
├── ngx_http_upstream_round_robin.h
├── ngx_http_variables.c
├── ngx_http_variables.h
└── ngx_http_write_filter_module.c

1 directory, 32 files
复制代码

从以上列出的文件可以出来,nginx源码所体现出的模块化,这样便于阅读,其次也可以看到对于http的一些解析、dns的负载均衡等封装与实现介于此。

小结

以上是针对于nginx源码整体上的认知,下一部分会对nginx的配置文件进行简单的讲解。

阅读优秀框架的源码,千万不要急躁,沉下来,像喝茶一样,慢慢品尝与欣赏...

下期我们再见...

参考

猜你喜欢

转载自juejin.im/post/7018372907780800526
今日推荐