
1.2 Nginx源码结构
本书以Nginx 1.16.0为例,介绍Nginx源码和实现原理。读者可以从Nginx官方网站下载各个版本的Nginx,目前的最新版本是Nginx 1.17.4(2019-10-19)。Nginx源码src文件夹的目录结构如图1-2所示。

图1-2 Nginx源码src文件夹目录
1)core文件夹用于存储Nginx核心代码,其中有Nginx内部自定义的数据结构,例如字符串、数组、链表、散列表、队列、基数树以及红黑树等。另外还有Nginx核心结构体[1],例如用于与客户端连接的ngx_connection_t,用于配置解析的ngx_conf_t,用于缓存的ngx_buf_t。Nginx入口函数main位于nginx.c文件中。该文件夹还有很多其他内容,此处就不一一列举了。
2)event文件夹存储事件处理模块相关的代码。如图1-3所示,modules存储了I/O多路复用相关的代码,例如select、epoll、poll、kqueue等。Nginx可以根据不同的系统选择不同的方案以实现性能最大化。

图1-3 Nginx源码src/event文件夹目录
3)http文件夹包含Nginx处理HTTP请求时所需要的相关模块代码。Nginx 1.9.5版本用ngx_http_v2_module模块替换了ngx_http_spdy_module模块,自此正式支持HTTP 2.0协议,其相关实现也在该文件夹内。
4)除了可以作为HTTP服务器外,Nginx还可以作为邮件服务器。相关实现可以参考mail文件夹,由于其使用较少,本书将不展开介绍。
5)misc文件夹包含两个文件:ngx_cpp_test_module.cpp与ngx_google_perftools_module.c。其中,ngx_cpp_test_module.cpp用于测试Nginx中引用的头文件是否与C++兼容,ngx_google_perftools_module.c用于支持gperftools的实现。gperftools是谷歌开源的性能分析工具,读者可以自行查阅相关资料,本书不再介绍。
6)os文件夹包含跨平台实现的相关代码。
7)stream文件夹包含Nginx支持TCP反向代理功能的具体实现。
除了src文件夹外,Nginx源码中还有一些其他的文件夹,例如auto文件夹内存储了一些脚本,这些脚本在执行configure时使用,conf文件夹内存储了Nginx所需的配置文件,并给出了配置文件示例nginx.conf,这里就不一一介绍了。
[1]编辑注:本书涉及的“结构体”也有称作“结构”,意思相同。