Nginx的源码目录结构
nginx的源码目录与nginx的模块化以及功能的划分是紧密结合,这也使得我们可以很方便地找到相关功能的代码。我们先来看一下nginx源码的目录结构。
使用tree命令看一下:

主要目录详情如下:
- auto:自动检测系统环境以及编译相关的脚本。
- cc:关于编译器相关编译选项的检测脚本。
- lib:nginx编译所需要的一些库的检测脚本。
- os:与平台相关的一些系统参数与系统调用相关的检测。
- types:与数据类型相关的一些辅助脚本。
- conf:存放默认配置文件,在make install后,会拷贝到安装目录中去。
- contrib:存放一些实用工具,如geo配置生成工具(geo2nginx.pl)。
- html:存放默认的网页文件,在make install后,会拷贝到安装目录中去。
- man:nginx的man手册。
- src:存放nginx的源代码。
- core:nginx的核心源代码,包括常用数据结构的定义,以及nginx初始化运行的核心代码如main函数。
- event:对系统事件处理机制的封装,以及定时器的实现相关代码。
- modules:不同事件处理方式的模块化,如select、poll、epoll、kqueue等。
- http:nginx作为http服务器相关的代码。
- modules:包含http的各种功能模块。
- mail:nginx作为邮件代理服务器相关的代码。
- misc:一些辅助代码,测试c++头的兼容性,以及对google_perftools的支持。
- os:主要是对各种不同体系统结构所提供的系统函数的封装,对外提供统一的系统调用接口。
Nginx中configure的原理
Nginx的编译流程从configure开始:configure脚本将根据我们输入的选项、系统环境参与来生成所需的文件(包含源文件与Makefile文件)。configure会调用一系列auto脚本来实现编译环境的初始化
auto脚本
auto脚本由一系列脚本组成,他们有一些是实现一些通用功能由其它脚本来调用(如have),有一些则是完成一些特定的功能(如option)。
结合configure的代码来分析:
. auto/options
. auto/init
. auto/sources
这是configure源码开始执行的前三行,依次交由auto目录下面的option、init、sources来处理。
-
auto/options:主是处理用户输入的configure选项,并由选项生成一些全局变量的值,这些值在其它文件中会用到。该文件也会输出configure的帮助信息
##1. 设置选项对应的shell变量以及他们的初始值 help=no NGX_PREFIX= NGX_SBIN_PATH= NGX_CONF_PREFIX= NGX_CONF_PATH= NGX_ERROR_LOG_PATH= NGX_PID_PATH= NGX_LOCK_PATH= NGX_USER= NGX_GROUP= ... ## 2, 处理每一个选项值,并设置到对应的全局变量中 for option do opt="$opt `echo $option | sed -e \"s/\(--[^=]*=\)\(.* .*\)/\1'\2'/\"`" # 得到此选项的value部分 case "$option" in -*=*) value=`echo "$option" | sed -e 's/[-_a-zA-Z0-9]*=//'` ;; *) value="" ;; esac # 根据option内容进行匹配,并设置相应的选项 case "$option" in --help) help=yes ;; --prefix=) NGX_PREFIX="!" ;; --prefix=*) NGX_PREFIX="$value" ;; --sbin-path=*) NGX_SBIN_PATH="$value" ;; --conf-path=*) NGX_CONF_PATH="$value" ;; --error-log-path=*) NGX_ERROR_LOG_PATH="$value";; --pid-path=*) NGX_PID_PATH="$value" ;; --lock-path=*) NGX_LOCK_PATH="$value" ;; --user=*) NGX_USER="$value" ;; --group=*) NGX_GROUP="$value" ;; ... *) # 没有找到的对应选项 echo "$0: error: invalid option \"$option\"" exit 1 ;; esac done ## 3. 对选项进行处理 # 如果有--help,则输出帮助信息 if [ $help = yes ]; then cat << END --help print this message --prefix=PATH set installation prefix --sbin-path=PATH set nginx binary pathname --conf-path=PATH set nginx.conf pathname --error-log-path=PATH set error log pathname --pid-path=PATH set nginx.pid pathname --lock-path=PATH set nginx.lock pathname --user=USER set non-privileged user for worker processes --group=GROUP set non-privileged group for worker processes END exit 1 fi # 默认文件路径 NGX_CONF_PATH=${NGX_CONF_PATH:-conf/nginx.conf} NGX_CONF_PREFIX=`dirname $NGX_CONF_PATH` NGX_PID_PATH=${NGX_PID_PATH:-logs/nginx.pid} NGX_LOCK_PATH=${NGX_LOCK_PATH:-logs/nginx.lock} ... -
auto/init:该文件的目录在于初始化一些临时文件的路径,检查echo的兼容性,并创建Makefile。
# Copyright (C) Igor Sysoev # Copyright (C) Nginx, Inc. NGX_MAKEFILE=$NGX_OBJ

文章详细介绍了Nginx的源码目录结构,包括auto目录下的configure及相关脚本,如options、init、sources等,以及它们在编译过程中的作用。同时,文章阐述了configure脚本如何处理用户选项,初始化编译环境,并通过auto脚本进行系统环境检测。此外,还讨论了模块编译的顺序及其对程序功能的影响。
736

被折叠的 条评论
为什么被折叠?



