您的位置:首页 > 运维架构 > Shell

Nginx源码结构和编译配置configure shell

2013-11-05 10:35 465 查看
    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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: