`
Poechant
  • 浏览: 229557 次
博客专栏
Bebe66e7-3a30-3fc9-aeea-cfa3b474b591
Nginx高性能Web服务...
浏览量:24324
5738817b-23a1-3a32-86de-632d7da73b1e
Cumulus实时媒体服务...
浏览量:22104
社区版块
存档分类
最新评论

解剖Nginx·自动脚本篇(4)工具型脚本系列

 
阅读更多

解剖 Nginx·自动脚本篇(4)工具型脚本系列

  • Author: Poechant
  • Blog:blog.CSDN.net/Poechant
  • Email: zhongchao.ustc#gmail.com (#->@)
  • Date: March 12th, 2012
  • Copyright © 柳大·Poechant

目录

  1. auto/have 向自动配置头文件追加可用宏定义(objs/ngx_auto_config.h
  2. auto/nohave 向自动配置头文件追加不可用宏定义(objs/ngx_auto_config.h
  3. auto/define 向自动配置脚本追加 K-V 宏定义(objs/ngx_auto_config.h),表示“设置了 K,其值为 V”
  4. auto/have_headers 向自动头头文件(objs/ngx_auto_header.h
  5. auto/feature
  6. auto/types/sizeof 生成测试程序并检测指定类型的大小
  7. auto/types/typedef
  8. auto/types/value

1 auto/have

  • 主要功能:向自动配置头文件中标示有指定的参数的宏定义。
  • 处理变量:$have
  • 作用对象:

    • 作用对象:$NGX_AUTO_CONFIG_H变量所表示的自动生成头文件。
    • 默认对象:objs/ngx_auto_config.h
      cat << END >> $NGX_AUTO_CONFIG_H
      #ifndef $have
      #define $have  1
      #endif
      END
    
  • 示例:

如果have值为SOME_FLAG,则引用该脚本而运行后,objs/ngx_auto_config.h中将追加如下内容:

#ifndef SOME_FLAG
#define SOME_FLAG 1
#endif

2 auto/nohave

auto/have脚本类似。

  • 主要功能:向自动配置头文件中标示没有指定的参数的宏定义。
  • 处理变量:$have
  • 作用对象:

    • 作用对象:$NGX_AUTO_CONFIG_H变量所表示的自动生成头文件。
    • 默认对象:objs/ngx_auto_config.h
      cat << END >> $NGX_AUTO_CONFIG_H
      #ifndef $have
      #define $have  0
      #endif
      END
    
  • 示例:

如果have值为SOME_FLAG,则引用该脚本而运行后,objs/ngx_auto_config.h中将追加如下内容:

#ifndef SOME_FLAG
#define SOME_FLAG 0
#endif

3 auto/define

  • 主要功能:向自动配置头文件中标示指定参数的值
  • 处理变量:havevalue
  • 作用对象:

    • 作用对象:$NGX_AUTO_CONFIG_H变量所表示的自动生成头文件。
    • 默认对象:objs/ngx_auto_config.h
      cat << END >> $NGX_AUTO_CONFIG_H
      #ifndef $have
      #define $have  $value
      #endif
      END
    
  • 示例:

如果have值为SOME_FLAGvalue值为1234,则引用该脚本而运行后,objs/ngx_auto_config.h中将追加如下内容:

#ifndef SOME_FLAG
#define SOME_FLAG 1234
#endif

4 auto/have_headers

  • 主要功能:向自动头头文件中标示指定参数存在
  • 处理变量:havevalue
  • 作用对象:

    • 作用对象:$NGX_AUTO_HEADERS_H变量所表示的自动生成头文件。
    • 默认对象:objs/ngx_auto_headers.h
      cat << END >> $NGX_AUTO_HEADERS_H
      #ifndef $have
      #define $have  1
      #endif
      END
    
  • 注意:auto/have_headersauto/have的不同,前者是向objs/ngx_auto_config.h写,后者是向objs/ngx_auto_headers.h写。

5 auto/feature

  • 主要功能:
  • 处理变量:
    • $ngx_n
    • $ngx_feature
    • $ngx_c
    • ngx_feature_name
    • $ngx_feature_path
    • $ngx_feature_inc_path
    • $ngx_temp
    • $ngx_feature_incs
    • $ngx_feature_test
    • $ngx_feature_libs
    • $ngx_have_feature
  • 作用对象:
    • 作用对象:
    • 默认对象:

5.1 输出检查提示

还记得在《精读Nginx源码·自动脚本篇(2)设置初始变量脚本 auto/init》一文中关于ngx_nngx_c两个变量吗?在auto/feature中的第一句是:

echo $ngx_n "checking for $ngx_feature ...$ngx_c"

就是echo一句checking for $ngx_feature,然后换行。当然存在ngx_nngx_c都为空的情况,这时真就没有主动换行了。

然后向NGX_AUTOCONF_ERR表示的文件添加自动配置错误信息。该文件是在auto/init文件中初始化的(参见《精读Nginx源码·自动脚本篇(2)设置初始变量脚本 auto/init》),其值为NGX_AUTOCONF_ERR=$NGX_OBJS/autoconf.err,默认情况下为objs/autoconf.err

5.2 初始化ngx_found
ngx_found=no

5.3 初始化ngx_have_feature

if test -n "$ngx_feature_name"; then
    ngx_have_feature=`echo $ngx_feature_name \
                   | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`
fi

test -n是测试参数的长度是否为 0。那么如果ngx_feature_name为空,则不会执行if内的语句,否则将把ngx_have_feature命名为ngx_feature_name的大写版(tr命令将小写全部改为大写)。

5.4 初始化ngx_feature_inc_path

if test -n "$ngx_feature_path"; then
    for ngx_temp in $ngx_feature_path; do
        ngx_feature_inc_path="$ngx_feature_inc_path -I $ngx_temp"
    done
fi

test -n是测试参数的长度是否为 0。如果ngx_feature_path/path/to/one /path/to/two /path/to/three,则ngx_feature_inc_path将被置为-I /path/to/one -I /path/to/two -I /path/to/three

5.5 生成自动测试程序

自动测试源码文件是在auto/init脚本中初始化为$NGX_OBJS/autotest的,默认为objs/autotest。加上后缀名则为objs/autotest.c

cat << END > $NGX_AUTOTEST.c
#include <sys/types.h>
$NGX_INCLUDE_UNISTD_H
$ngx_feature_incs
int main() {
    $ngx_feature_test;
    return 0;
}
END

其中ngx_feature_incsngx_feature_test算是auto/feature脚本的参数。

5.6 编译自动测试程序

CC是在脚本auto/options中初始化的, 为CC=${CC:-gcc}。该段代码的功能是生成编译命令。

ngx_test="$CC $CC_TEST_FLAGS $CC_AUX_FLAGS $ngx_feature_inc_path \
      -o $NGX_AUTOTEST $NGX_AUTOTEST.c $NGX_TEST_LD_OPT $ngx_feature_libs"

ngx_feature_inc_path=

运行测试程序。

eval "/bin/sh -c \"$ngx_test\" >> $NGX_AUTOCONF_ERR 2>&1"

5.7 根据ngx_feature_run处理

这一段稍长,下面逐步解释:

Bash 编程中所有布尔表达式都是用中括号括起来的。-x参数表示Test if file exists and is executable。所以如果NGX_AUTOTEST表示的文件存在则执行then

if [ -x $NGX_AUTOTEST ]; then
    case "$ngx_feature_run" in

如果ngx_feature_run的值为yes,由于-c,则将NGX_AUTOTEST文件的内容当做命令执行,其输出到标准输出及错误输出的结果都被重定向到NGX_AUTOCONF_ERR中。

        yes)
            # /bin/sh is used to intercept "Killed" or "Abort trap" messages
            if /bin/sh -c $NGX_AUTOTEST >> $NGX_AUTOCONF_ERR 2>&1; then
                echo " found"
                ngx_found=yes

如果ngx_feature_name长度不为零,则have设置为$ngx_have_feature的值,并引用auto/have脚本向objs/ngx_auto_config.h写入宏定义。

                if test -n "$ngx_feature_name"; then
                    have=$ngx_have_feature . auto/have
                fi

如果NGX_AUTOTEST表示的值为空或者表示的命令执行错误,则执行else

            else
                echo " found but is not working"
            fi
        ;;

如果ngx_feature_run的值为value,则执行NGX_AUTOTEST所表示的命令。

        value)
            # /bin/sh is used to intercept "Killed" or "Abort trap" messages
            if /bin/sh -c $NGX_AUTOTEST >> $NGX_AUTOCONF_ERR 2>&1; then
                echo " found"
                ngx_found=yes

objs/ngx_auto_config.h文件写入:

                cat << END >> $NGX_AUTO_CONFIG_H
                    #ifndef $ngx_feature_name
                    #define $ngx_feature_name  `$NGX_AUTOTEST`
                    #endif
                END
            else
                echo " found but is not working"
            fi
        ;;

如果ngx_feature_runbug,则与上一种情况类似。

        bug)
            # /bin/sh is used to intercept "Killed" or "Abort trap" messages
            if /bin/sh -c $NGX_AUTOTEST >> $NGX_AUTOCONF_ERR 2>&1; then
                echo " not found"

            else
                echo " found"
                ngx_found=yes

                if test -n "$ngx_feature_name"; then
                    have=$ngx_have_feature . auto/have
                fi
            fi
        ;;

如果是其他情况,则若ngx_feature_name不为空则将ngx_have_feature相关的宏写入objs/ngx_auto_config.h职工。

        *)
            echo " found"
            ngx_found=yes

            if test -n "$ngx_feature_name"; then
                have=$ngx_have_feature . auto/have
            fi
        ;;

    esac

如果NGX_AUTOTEST表示的文件不存在或不可执行,则执行下面的else中的几句echo

else
    echo " not found"

    echo "----------"    >> $NGX_AUTOCONF_ERR
    cat $NGX_AUTOTEST.c  >> $NGX_AUTOCONF_ERR
    echo "----------"    >> $NGX_AUTOCONF_ERR
    echo $ngx_test       >> $NGX_AUTOCONF_ERR
    echo "----------"    >> $NGX_AUTOCONF_ERR
fi

5.8 删除NGX_AUTOSET测试程序可执行文件

rm $NGX_AUTOTEST*

-

转载请注明来自“钟超的CSDN博客”:Blog.CSDN.net/Poechant

-

分享到:
评论

相关推荐

    nginx一键安装包含自动安装脚本

    **Nginx 一键安装与自动化脚本** 在IT行业中,服务器配置和管理是一项重要的任务,尤其是在处理Web服务时。Nginx是一款高性能的HTTP和反向代理服务器,以其高效、稳定和轻量级的特性而广受欢迎。本文将详细讨论如何...

    nginx 自动化安装脚本

    nginx 自动化安装脚本,下载直接运行安装就可以,还集成了限制国家ip模块

    ubuntu自动安装nginx php脚本

    ubuntu自动安装nginx php脚本ubuntu自动安装nginx php脚本

    window下nginx启动脚本

    nginx配置修改后运行此脚本启动nginx。 其脚本的作用往往是简化了启动的便利

    nginx自动化安装shell脚本

    nginx自动化安装shell脚本

    Centos7系统自动安装nginx脚本

    Centos7系统自动安装nginx脚本, 由于每次安装新的环境如果需要 Nginx 的话都需要进行一次手动安装,为了减轻重复工作,书写自动安装 Nginx 安装脚本

    nginx 启动脚本

    这篇博客将深入探讨Nginx的启动脚本,了解其工作原理以及如何自定义和管理这些脚本。 【描述】:虽然没有提供具体的描述,但可以推测博客可能涉及了Nginx启动脚本的创建、使用和自定义过程。通常,Nginx的启动脚本...

    windows启动nginx.bat脚本

    windows启动nginx脚本

    一键安装Nginx脚本+源码

    `install_nginx-v2.sh` 脚本通常是为了简化 Nginx 的安装过程而编写的,它会自动完成下载、编译、配置和安装等步骤。这种自动化方式对于初学者或者需要快速部署环境的开发者来说非常方便,减少了手动操作的复杂性和...

    自动化脚本一键生成Nginx https证书证书格式为pem

    对于自动化脚本,可以使用ACME协议与Let's Encrypt交互,例如使用`certbot`工具。 4. **转换证书格式**:如果你从非PEM格式的证书,如DER或CRT,需要将其转换为PEM。可以使用`openssl x509 -in certificate.crt -...

    linux安装nginx一键脚本(自己用过)

    linux安装nginx一键脚本(自己用过,完美可用),这个文件是nginx.sh,可以在linux的小黑框中,先上传到服务器自己想安装的目录,然后找到找到这个目录再找到这个文件,执行sh nginx.sh即可自动安装。

    Nginx日志自动归档备份shell脚本log.sh

    Nginx日志自动归档备份shell脚本log

    Linux自动化脚本安装Nginx使用说明

    在Linux环境中,shell脚本是常用的一种自动化工具,它允许我们编写一系列命令并一次性执行,大大提高了工作效率。要创建一个自动化安装Nginx的脚本,你需要熟悉bash shell语法,包括变量、条件语句、循环以及函数等...

    nginx添加站点脚本

    Nginx通过配置不同的站点来管理多个网站的运行,而“添加站点脚本”就是一种自动化创建和管理Nginx站点配置的工具。下面我们将深入探讨Nginx站点脚本的工作原理以及如何使用它。 ### 1. Nginx的基本概念 Nginx是一...

    Nginx脚本

    **Nginx脚本详解** Nginx,作为一款高性能的HTTP和反向代理服务器,以其轻量级、高并发的特性在Web服务领域广泛应用。它不仅能够处理静态内容,还可以通过配置执行一些动态处理任务,例如使用脚本来实现自定义逻辑...

    检测网站状态网站挂了自动重启nginx服务脚本 运行多年无人值守

    4. **重启Nginx**:一旦达到预定的重启条件,脚本会利用系统提供的工具(如`systemctl restart nginx`或`service nginx restart`)来停止并重新启动Nginx服务,期待恢复服务运行。 5. **日志和通知**:为了便于追踪...

    nginx一键安装脚本

    nginx一键安装脚本

    nginx自动安装

    本教程将详细介绍如何在Linux系统上通过自动化脚本来快速安装Nginx,旨在简化传统手动安装过程,提高效率。 一、Nginx简介 Nginx(发音为"engine x")是一款反向代理、负载均衡器以及HTTP缓存服务器,以其事件驱动...

    nginx_nginx安装脚本_

    1. **自动化流程**:手动安装Nginx涉及多个步骤,包括下载源码、编译、配置等,而脚本可以自动化这些过程,节省时间和减少出错可能性。 2. **简化复杂性**:对于不熟悉Linux系统或Nginx配置的用户,安装脚本提供了一...

    自动reload nginx解决nginx对动态域名不重新解析的Shell脚本

    为了解决这个问题,我们可以编写一个Shell脚本来定期检查IP变化并自动执行`nginx -s reload`命令来强制Nginx重新加载配置。 ### Shell脚本工作原理 1. **检测IP变化**:首先,脚本会定期读取动态DNS服务提供的API...

Global site tag (gtag.js) - Google Analytics