Nginx学习(1)

来源:互联网 发布:税友软件深圳分公司 编辑:程序博客网 时间:2024/05/19 06:38

前言

一直打算深入学习一下开源项目,这一个月来的任务对于修改IPMI开源软件也确实增长了对于开源项目的认识,期间碰到与解决的问题也让我收获不小。这一块可以说是为我学习Nginx开了个好头。

为什么学习Nginx?当然是随主流,毕竟群众的眼睛是雪亮的。基本上,我能搜到的被推荐的开源项目,Nginx基本都在推荐之列。不犹豫,就是它了。


Configure详解

在编译安装Nginx时,我们需要使用configure命令做大量"幕后“工作,包括检测操作系统内核和已经安装的软件,参数解析,中间目录生成以及根据各种参数生成的.c文件、Makefile文件等。


一、命令参数(略)

Configure包含的参数使用以下命令查看:

./configure --help

主要分为五大类:

1,路径相关;2,编译相关;3,依赖软件相关;4,模块相关;5,其他;


二、Configrue执行流程

Configure本身是一个Shell脚本,中间会调用<nginx-source-path>/auto/目录下别的脚本执行。其内容如下:

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. #!/bin/sh  
  2.   
  3. # Copyright (C) Igor Sysoev  
  4. # Copyright (C) Nginx, Inc.  
  5.   
  6. # 设置环境变量。这里是为了去除所有本地化设置,让命令正确执行  
  7. LC_ALL=C  
  8. export LC_ALL  
  9.   
  10. # 处理configure命令的参数。options脚本将会定义后续工作将会用到的变量,之后进行相应设置。  
  11. . auto/options  
  12.   
  13. # 初始化后续产生的文件路径。比如Makefile,默认情况下<nginx-source-path>/objs/  
  14. . auto/init  
  15.   
  16. # 分析nginx源码结构,构造后续的Makefile文件  
  17. . auto/sources  
  18.   
  19. # 编译过程中所有生成目标文件存放的文件夹  
  20. test -d $NGX_OBJS || mkdir $NGX_OBJS  
  21.   
  22. # 建立ngx_auto_hearder.h、autoconf.err等必要的编译文件  
  23. echo > $NGX_AUTO_HEADERS_H  
  24. echo > $NGX_AUTOCONF_ERR  
  25.   
  26. # 向ngx_auto_config.h文件写入命令行带的参数  
  27. echo "#define NGX_CONFIGURE \"$NGX_CONFIGURE\"" > $NGX_AUTO_CONFIG_H  
  28.   
  29. # 判断DEBUG标志,如果有,则在ngx_auto_config.h中写入DEBUG宏  
  30. if [ $NGX_DEBUG = YES ]; then  
  31.     have=NGX_DEBUG . auto/have  
  32. fi  
  33.   
  34. # 开始检查操作系统参数是否支持后续编译  
  35. if test -z "$NGX_PLATFORM"; then  
  36.     echo "checking for OS"  
  37.   
  38.     NGX_SYSTEM=`uname -s 2>/dev/null`  
  39.     NGX_RELEASE=`uname -r 2>/dev/null`  
  40.     NGX_MACHINE=`uname -m 2>/dev/null`  
  41.   
  42. # 输出操作系统名称、内核版本、32/64内核  
  43.     echo " + $NGX_SYSTEM $NGX_RELEASE $NGX_MACHINE"  
  44.   
  45.     NGX_PLATFORM="$NGX_SYSTEM:$NGX_RELEASE:$NGX_MACHINE";  
  46.   
  47.     case "$NGX_SYSTEM" in  
  48.         MINGW32_*)  
  49.             NGX_PLATFORM=win32  
  50.         ;;  
  51.     esac  
  52.   
  53. else  
  54.     echo "building for $NGX_PLATFORM"  
  55.     NGX_SYSTEM=$NGX_PLATFORM  
  56. fi  
  57.   
  58. # 检查并设置编译器,如gcc时候安装,gcc版本时候支持后续编译nginx  
  59. . auto/cc/conf  
  60.   
  61. # 对于非Windows系统定义一些必要头文件,并检查其是否存在,以此决定configure后续步骤是否可执行。  
  62. # 注: 检查某头文件是否存在或者某特性的类似操作,这里都是通过生成一个最简单的main函数C程序,该程序包含响应的头文件,然后编译检查其是否通过。具体的结果记录在autoconf.err文件中。  
  63. if [ "$NGX_PLATFORM" != win32 ]; then  
  64.     . auto/headers  
  65. fi  
  66.   
  67. # 对于当前操作系统,定义特定的操作系统相关方法并检查当前环境是否支持。比如对于linux,设置进程优先级,使用sendfile系统调用  
  68. . auto/os/conf  
  69.   
  70. # 定义类UNIX操作系统的头文件和系统调用等,并检查当前环境是否支持  
  71. if [ "$NGX_PLATFORM" != win32 ]; then  
  72.     . auto/unix  
  73. fi  
  74.   
  75. # !!!重要!!!  
  76. # 生成ngx_modules.c文件,此文件会被编译进nginx,它唯一定义ngx_modules数组。此数组指明nginx运行期间有哪些模块会参与到请求处理中。数组中的顺序就是模块优先级的顺序。    
  77. . auto/modules  
  78.   
  79. # 检查nginx在链接期间需要连接的第三方静态库、动态库或目标文件是否存在  
  80. . auto/lib/conf  
  81.   
  82. # 处理nginx安装后的路径  
  83. case ".$NGX_PREFIX" in  
  84.     .)  
  85.         NGX_PREFIX=${NGX_PREFIX:-/usr/local/nginx}  
  86.         have=NGX_PREFIX value="\"$NGX_PREFIX/\"" . auto/define  
  87.     ;;  
  88.   
  89.     .!)  
  90.         NGX_PREFIX=  
  91.     ;;  
  92.   
  93.     *)  
  94.         have=NGX_PREFIX value="\"$NGX_PREFIX/\"" . auto/define  
  95.     ;;  
  96. esac  
  97.   
  98. # 处理nginx安装后conf文件的路径  
  99. if [ ".$NGX_CONF_PREFIX" != "." ]; then  
  100.     have=NGX_CONF_PREFIX value="\"$NGX_CONF_PREFIX/\"" . auto/define  
  101. fi  
  102.   
  103. # 处理nginx安装后,二进制文件、pid、lock等其他文件路径  
  104. have=NGX_SBIN_PATH value="\"$NGX_SBIN_PATH\"" . auto/define  
  105. have=NGX_CONF_PATH value="\"$NGX_CONF_PATH\"" . auto/define  
  106. have=NGX_PID_PATH value="\"$NGX_PID_PATH\"" . auto/define  
  107. have=NGX_LOCK_PATH value="\"$NGX_LOCK_PATH\"" . auto/define  
  108. have=NGX_ERROR_LOG_PATH value="\"$NGX_ERROR_LOG_PATH\"" . auto/define  
  109.   
  110. have=NGX_HTTP_LOG_PATH value="\"$NGX_HTTP_LOG_PATH\"" . auto/define  
  111. have=NGX_HTTP_CLIENT_TEMP_PATH value="\"$NGX_HTTP_CLIENT_TEMP_PATH\""  
  112. . auto/define  
  113. have=NGX_HTTP_PROXY_TEMP_PATH value="\"$NGX_HTTP_PROXY_TEMP_PATH\""  
  114. . auto/define  
  115. have=NGX_HTTP_FASTCGI_TEMP_PATH value="\"$NGX_HTTP_FASTCGI_TEMP_PATH\""  
  116. . auto/define  
  117. have=NGX_HTTP_UWSGI_TEMP_PATH value="\"$NGX_HTTP_UWSGI_TEMP_PATH\""  
  118. . auto/define  
  119. have=NGX_HTTP_SCGI_TEMP_PATH value="\"$NGX_HTTP_SCGI_TEMP_PATH\""  
  120. . auto/define  
  121.   
  122. # 创建编译时使用的Makefile文件  
  123. . auto/make  
  124.   
  125. # 为Makefile加入需要链接的第三方静态库、动态库或者目标文件  
  126. . auto/lib/make  
  127.   
  128. # 为Makefile加入install功能  
  129. . auto/install  
  130.   
  131. # STUB 在ngx_auto_config.h中加入NGX_SUPPRESS_WARN、NGX_SMP宏  
  132. . auto/stubs  
  133.   
  134. # 在ngx_auto_config.h文件指定NGX_USER和NGX_GROUP宏,如果执行configure时无指定参数,则默认nobody,即默认以nobody用户运行进程  
  135. have=NGX_USER value="\"$NGX_USER\"" . auto/define  
  136. have=NGX_GROUP value="\"$NGX_GROUP\"" . auto/define  
  137.   
  138. # 显示configure执行结果  
  139. . auto/summary  


三、Configure生成文件

Configure执行成功会生成objs目录,如下图:


重点在ngx_modeles.c文件,其中定义了ngx_modules数组,它指明每个模块在Nginx中的优先级。当一个请求同时符合多个模块处理规则时,将按照此数组中的顺序选择最靠前的模块优先处理。


总结

Configurex所做工作:寻找Nginx所依赖软件,针对不同操作系统做的优化,生成Makefile,ngx_XXX.h文件,ngx_modules.c文件。其中,ngx_modules.c文件决定运行时所有模块的优先级。对于不需要的模块,即不会加入ngx_modules数组,也就不会编进Nginx中,体现了其轻量级概念。

0 0
原创粉丝点击