社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  NGINX

Nginx源码分析之---辅助脚本

郑尔多斯 • 6 年前 • 640 次点击  
阅读 4

Nginx源码分析之---辅助脚本

微信公众号:郑尔多斯
关注可了解更多的Nginx知识。任何问题或建议,请公众号留言;
关注公众号,有趣有内涵的文章第一时间送达!

辅助脚本

我们在前面的几篇文章中详细的分析了auto/optionsauto/init,auto/sources脚本源码,除此之外,nginx还有一些其他的辅助脚本,用于完成一些特定的功能。我总结了一下在nginx中遇到的辅助脚本,如下图所示:

nginx辅助脚本
nginx辅助脚本

我们本篇文章以及后续的两到三篇文章就详细的分析一下这些辅助脚本的功能。
本文详细分析上图中的前三个脚本。

auto/define脚本

功能

该脚本用于向NGX_AUTO_CONFIG_H头文件中增加一个宏定义,并且设置这个宏的名称。

参数

have:宏的名称
value:宏的值

脚本内容
1cat << END >> $NGX_AUTO_CONFIG_H
2
3#ifndef $have
4#define $have  $value
5 #endif
6
7END
复制代码
示例

configure文件中,有如下的代码:

1have=NGX_PREFIX value="\"$NGX_PREFIX/\"" . auto/define
复制代码

这行脚本就是根据我们传递的NGX_PREFIX的值,向头文件中增加内容,比如我们调用configure的时候如下:

1./configure --prefix=/usr/local/nginx
复制代码

那么上面的语句就会变成:

1have=NGX_PREFIX  value="/usr/local/nginx" .auto/define
复制代码

那么就会向NGX_AUTO_CONFIG_H头文件中写入下面的内容:

1#ifndef NGX_PREFIX
2#define NGX_PREFIX  "/usr/local/nginx"
3#endif
复制代码

就这样,通过auto/define脚本,nginx可以把我们的配置参数和c的源码结合起来。反正对于我来说,第一个看到这样的形式,非常的新颖。

auto/have脚本

功能

和上面的auto/define脚本类似,auto/have也是向NGX_AUTO_CONFIG_H头文件中增加一个宏定义,但是这里增加的宏的值都是1,不会又自定义的值。

参数

have:宏的名称

脚本内容
1cat << END >> $NGX_AUTO_CONFIG_H
2
3#ifndef $have
4#define $have  1
5#endif
6
7END
复制代码
示例

我们从configure脚本中发现如下的内容:

1if [ $NGX_DEBUG = YES ]; then
2    have=NGX_DEBUG . auto/have
3fi
复制代码

这里的意思就是,如果我们在configure的时候设置了DEBUG模式,那么就会向NGX_AUTO_CONFIG_H头文件中增加如下代码:




    
1#ifndef NGX_DEBUG
2#define NGX_DEBUG 1
3#endif
复制代码

这就表明我们打开了DEBUG模式。

auto/nohave

功能

auto/have的功能恰恰相反,auto/nohave的功能如下:
如果NGX_AUTO_CONFIG_H头文件中已经定义了一个宏,那么auto/nohave就会通过把这个宏的值设置为0从而取消这个宏定义。

参数

have:宏的名称

脚本内容
1cat << END >> $NGX_AUTO_CONFIG_H
2
3#ifndef $have
4#define $have  0
5#endif
6
7END
复制代码
示例

auto/modules中有如下的代码:

1if


    
 [ $HTTP != YES ]; then
2    have=NGX_CRYPT . auto/nohave
3    CRYPT_LIB=
4fi
复制代码

这里的判断很简单,如果HTTP变量的值不是YES的话,就向NGX_AUTO_CONFIG_H文件中写入如下内容:

1#ifdef HTTP
2#define HTTP 0
3#endif
复制代码

这样,就相当于取消了HTTP宏的定义。

auto/have_headers脚本

功能

和前面的auto/have脚本类似,auto/have是向NGX_AUTO_HEADERS_H头文件中增加一个宏定义,增加的宏的值都是1
划重点了,它和auto_have的不同之处在于,auto_have是向NGX_AUTO_CONFIG_H文件中增加的宏定义,而auto/have_headers是向NGX_AUTO_CONFIG_H中增加的宏定义。

参数

have:宏的名称

脚本内容
1cat << END >> $NGX_AUTO_HEADERS_H
2
3#ifndef $have
4#define $have  1
5#endif
6
7END
复制代码
示例

auto/os/linux脚本中有如下的内容:

1have=NGX_LINUX . auto/have_headers
复制代码

显然这里是判断当前的操作系统类型的,如果是Linux的话,就会向NGX_AUTO_HEADERS_H中增加如下内容:

1#ifndef NGX_LINUX
2#define NGX_LINUX 1
3#endif
复制代码

总结

本文详细的分析了auto/define, auto/have, auto/nohave三个辅助脚本的功能。下面总结一下:

auto/defnie: 定义一个宏,并且可以自定义这个宏的值。

auto/have: 如果一个宏之前没有被定义过,那么就定义该宏,并且把值设置为1,其实就是一个bool标识,标识某个功能已经被打开,比如我们例子中的debug功能。

auto/nohave: 它和auto/have脚本的功能恰恰相反。如果我们已经打开了某一个宏(比如nginx 默认打开的那些功能),现在我们取消这个宏的定义,也是一个bool类型,表示我们关闭了某个功能。

auto/have_headers: auto_have是向NGX_AUTO_CONFIG_H文件中增加的宏定义,而auto/have_headers是向NGX_AUTO_CONFIG_H中增加的宏定义,二者其他功能相同。

后面的文章我们会接着分析nginx的其他辅助脚本,敬请期待。顺便关注我的个公众号(Nginx源码分析)。



喜欢本文的朋友们,欢迎长按下图关注订阅号郑尔多斯,更多精彩内容第一时间送达
郑尔多斯
郑尔多斯
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/35999
 
640 次点击