闲不下来-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都有哪些组件,都包含了哪些功能,因此我画了一个图方便理解。
- 核心模块功能:为其他模块提供一些基本功能:字符串处理、时间管理、文件读写等功能(无论什么框架源码,都会包含一些基本的工具或者处理等功能的实现);
- 配置解析:主要包括文件语法检查、配置参数解析、参数初始化等功能;(一般优秀的框架都会提供给用户对应的使用配置,因此这部分是必需品)
- 内存管理:内存池管理、共享内存的分配、缓冲区管理等功能;(内存管理是任何框架的保证)
- 事件驱动:进程创建与管理、信号接收与处理、所有事件驱动模型的实现、高级 IO 等功能;(nginx的核心,包括redis的核心也如此)
- 日志管理:错误日志的生成与管理、任务日志的生成与管理等功能;(耳熟能详的日志管理,没有它,我们怎么排查错误呀)
- HTTP 服务:提供 Web 服务,包括客户度连接管理、客户端请求处理、虚拟主机管理、服务器组管理等功能;(nginx所干的事情,不就是如此吗?)
- Mail 服务:与 HTTP 服务类似,但是增加了邮件协议的实现;(比如25、465等)
core
core 目录中的源码定义了 nginx 服务器最基本的数据结构以及最基本的核心模块(核心模块为其他模块提供了公共调用的基本功能)。首先看下该核心模块的源码结构:
注意:部分xxx.h省略,只是因为有c在,h有些是配对的,并且图片过大的话,体验不太友好...
从这部分图可以看出,nginx核心目录主要包含一些高效的数据结构和一些配置、日志、连接、内存等一些管理文件。
后续会针对该部分进行详细的介绍
event
event 目录里面包含一种子目录 module 以及一些文件,除了 module 子目录,其他文件提供了事件驱动模型相关数据结构的定义、初始化、事件接收、传递、管理功能以及事件驱动模型调用功能。module 子目录里面的源码实现了Nginx 支持的事件驱动模型:AIO、epoll、kqueue、select、/dev/poll、poll 等事件驱动模型;
注意:部分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的配置文件进行简单的讲解。
阅读优秀框架的源码,千万不要急躁,沉下来,像喝茶一样,慢慢品尝与欣赏...
下期我们再见...