nginx的优秀不仅体现在程序结构以及代码风格上,并且nginx的源码组织也简洁明了,目录结构层次结构清晰。nginx的源码目录与nginx的模块化以及功能的划分是紧密结合,这也使得我们可以很方便地找到相关功能的代码。
下面首先看下nginx源码的目录:
.
├── auto 自动检测系统环境以及编译相关的脚本
│ ├── cc 关于编译器相关的编译选项的检测脚本
│ ├── lib nginx编译所需要的一些库的检测脚本
│ ├── os 与平台相关的一些系统参数与系统调用相关的检测
│ └── types 与数据类型相关的一些辅助脚本
├── conf 存放默认配置文件,在make install后会拷贝到安装目录中
├── contrib 存放一些实用工具,如geo配置生成工具(geo2nginx.pl)
├── html 存放默认的网页文件(如index/50x.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根目录下还有变更文档CHANGES和证书LICENSE以及README。还有最重要的configure文件。编译成功之后会生成可执行文件的目录objs。
configure原理:
configure脚本将根据我们输入的选项、系统环境参与来生成所需的文件(包含源文件与Makefile文件)。configure会调用一系列auto脚本来实现编译环境的初始化。下面是configure文件:
#!/bin/sh
LC_ALL=C
export LC_ALL
#其作用是在shell中去除本地化的设置,并对所有子shell这么做。
. auto/options
. auto/init
. auto/sources
#依次交由auto目录下面的option、init、sources来处理
#auto/options主是处理用户输入configure时的附加可选项。然后输出帮助信息。
#auto/init负责初始化一些临时文件的路径,检查echo的兼容性,并创建Makefile文件。
定义不同功能或系统所需要的文件的变量
test -d $NGX_OBJS || mkdir $NGX_OBJS
echo > $NGX_AUTO_HEADERS_H
echo > $NGX_AUTOCONF_ERR
echo "#define NGX_CONFIGURE \"$NGX_CONFIGURE\"" > $NGX_AUTO_CONFIG_H
if [ $NGX_DEBUG = YES ]; then
have=NGX_DEBUG . auto/have
fi
# NGX_DEBUG是在auto/options文件中处理的,如果有--with-debug选项,则其值是YES
if test -z "$NGX_PLATFORM"; then
echo "checking for OS"
NGX_SYSTEM=`uname -s 2>/dev/null`
NGX_RELEASE=`uname -r 2>/dev/null`
NGX_MACHINE=`uname -m 2>/dev/null`
echo " + $NGX_SYSTEM $NGX_RELEASE $NGX_MACHINE"
NGX_PLATFORM="$NGX_SYSTEM:$NGX_RELEASE:$NGX_MACHINE";
case "$NGX_SYSTEM" in
MINGW32_*)
NGX_PLATFORM=win32
;;
esac
else
echo "building for $NGX_PLATFORM"
NGX_SYSTEM=$NGX_PLATFORM
fi
# 检测当前系统信息
. auto/cc/conf
# 编译器选项
if [ "$NGX_PLATFORM" != win32 ]; then
. auto/headers
fi
# 头文件加入并测试
. auto/os/conf
# 操作系统相关的配置的检测
if [ "$NGX_PLATFORM" != win32 ]; then
. auto/unix
fi
# unix体系操作系统下的通用配置检测
. auto/modules
. auto/lib/conf
# 检查所需要的第三方库支持
case ".$NGX_PREFIX" in
.)
NGX_PREFIX=${NGX_PREFIX:-/usr/local/nginx}
have=NGX_PREFIX value="\"$NGX_PREFIX/\"" . auto/define
;;
.!)
NGX_PREFIX=
;;
*)
have=NGX_PREFIX value="\"$NGX_PREFIX/\"" . auto/define
;;
esac
if [ ".$NGX_CONF_PREFIX" != "." ]; then
have=NGX_CONF_PREFIX value="\"$NGX_CONF_PREFIX/\"" . auto/define
fi
have=NGX_SBIN_PATH value="\"$NGX_SBIN_PATH\"" . auto/define
have=NGX_CONF_PATH value="\"$NGX_CONF_PATH\"" . auto/define
have=NGX_PID_PATH value="\"$NGX_PID_PATH\"" . auto/define
have=NGX_LOCK_PATH value="\"$NGX_LOCK_PATH\"" . auto/define
have=NGX_ERROR_LOG_PATH value="\"$NGX_ERROR_LOG_PATH\"" . auto/define
have=NGX_HTTP_LOG_PATH value="\"$NGX_HTTP_LOG_PATH\"" . auto/define
have=NGX_HTTP_CLIENT_TEMP_PATH value="\"$NGX_HTTP_CLIENT_TEMP_PATH\""
. auto/define
have=NGX_HTTP_PROXY_TEMP_PATH value="\"$NGX_HTTP_PROXY_TEMP_PATH\""
. auto/define
have=NGX_HTTP_FASTCGI_TEMP_PATH value="\"$NGX_HTTP_FASTCGI_TEMP_PATH\""
. auto/define
have=NGX_HTTP_UWSGI_TEMP_PATH value="\"$NGX_HTTP_UWSGI_TEMP_PATH\""
. auto/define
have=NGX_HTTP_SCGI_TEMP_PATH value="\"$NGX_HTTP_SCGI_TEMP_PATH\""
. auto/define
. auto/make
# 生成objs/makefile文件
. auto/lib/make
# 生成关于库的编译选项到makefile文件
. auto/install
# 生成与安装相关的makefile文件内容,并生成最外层的makefile文件
# STUB
. auto/stubs
have=NGX_USER value="\"$NGX_USER\"" . auto/define
have=NGX_GROUP value="\"$NGX_GROUP\"" . auto/define
. auto/summary
# 汇总信息
shell语言说明:
1、fi与if对称地相对应。esac与case对称地相对应。
2、对于重定向,cat << END >> $NGX_AUTO_CONFIG_H,指的是当遇到字符串“END”时,则把之前的文本重定向追加到$NGX_AUTO_CONFIG_H中去。
本文参考自:http://tengine.taobao.org/book/chapter_09.html