Nginx学习(11)—— Nginx源码架构、configure是怎么执行的(编译的具体细节)

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

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值