Aprendizaje de Nginx (11): arquitectura del código fuente de Nginx y cómo se ejecuta la configuración (detalles específicos de la compilación)

Estructura del directorio del código fuente de Nginx

El directorio de código fuente de nginx está estrechamente integrado con la modularización y división funcional de nginx, lo que también nos facilita encontrar el código para funciones relacionadas. Primero echemos un vistazo a la estructura de directorios del código fuente de nginx.

Utilice el comando de árbol para echar un vistazo :
Insertar descripción de la imagen aquí

Los detalles del directorio principal son los siguientes :

  • auto: detecta automáticamente el entorno del sistema y compila scripts relacionados.
    • cc: script de detección de opciones de compilación relacionadas con el compilador.
    • lib: scripts de detección para algunas bibliotecas necesarias para la compilación de nginx.
    • os: Detección de algunos parámetros del sistema relacionados con la plataforma y llamadas al sistema.
    • tipos: algunos scripts auxiliares relacionados con los tipos de datos.
  • conf: almacena el archivo de configuración predeterminado. Después de realizar la instalación, se copiará al directorio de instalación.
  • contrib: almacena algunas herramientas prácticas, como la herramienta de generación de configuración geográfica (geo2nginx.pl).
  • html: almacena los archivos de la página web predeterminada. Después de realizar la instalación, se copiarán en el directorio de instalación.
  • hombre: manual de hombre nginx.
  • src: almacena el código fuente de nginx.
    • núcleo: el código fuente principal de nginx, incluida la definición de estructuras de datos comunes, y el código central para la inicialización y operación de nginx, como la función principal.
    • evento: Encapsulación del mecanismo de procesamiento de eventos del sistema y código relacionado con la implementación del temporizador.
      • Módulos: Modularización de diferentes métodos de procesamiento de eventos, como select, poll, epoll, kqueue, etc.
    • http: nginx como código relacionado con el servidor http.
      • módulos: Contiene varios módulos funcionales de http.
    • Correo: Código relacionado con nginx como servidor proxy de correo.
    • misc: algo de código auxiliar, que prueba la compatibilidad del encabezado de C++ y la compatibilidad con google_perftools.
    • os: encapsula principalmente las funciones del sistema proporcionadas por varias estructuras del sistema y proporciona una interfaz de llamada del sistema unificada al mundo exterior.

El principio de configuración en Nginx.

El proceso de compilación de Nginx comienza con la configuración: el script de configuración generará los archivos necesarios (incluidos los archivos fuente y los archivos Makefile) según las opciones que ingresamos y el entorno del sistema. configure llamará a una serie de scripts automáticos para inicializar el entorno de compilación

autoscrito

El script automático consta de una serie de scripts, algunos de los cuales implementan algunas funciones comunes que son llamadas por otros scripts (como have) y otros implementan algunas funciones específicas (como la opción).

Combinado con código de configuración para analizar :

. auto/options
. auto/init
. auto/sources

Estas son las primeras tres líneas que el código fuente de configuración comienza a ejecutarse y son procesadas por opción, init y fuentes en el directorio auto a su vez.

  • auto/options: Procesa principalmente las opciones de configuración ingresadas por el usuario y genera los valores de algunas variables globales a partir de las opciones, que se usarán en otros archivos. Este archivo también generará información de ayuda para la configuración.

    ##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: el directorio de este archivo es para inicializar la ruta de algunos archivos temporales, verificar la compatibilidad de eco y crear Makefile.

    # Copyright (C) Igor Sysoev
    # Copyright (C) Nginx, Inc.
    
    
    NGX_MAKEFILE=$NGX_OBJS/Makefile
    NGX_MODULES_C=$NGX_OBJS/ngx_modules.c
    
    NGX_AUTO_HEADERS_H=$NGX_OBJS/ngx_auto_headers.h
    NGX_AUTO_CONFIG_H=$NGX_OBJS/ngx_auto_config.h
    
    NGX_AUTOTEST=$NGX_OBJS/autotest
    NGX_AUTOCONF_ERR=$NGX_OBJS/autoconf.err
    
    # STUBs
    NGX_ERR=$NGX_OBJS/autoconf.err
    MAKEFILE=$NGX_OBJS/Makefile
    
    
    NGX_PCH=
    NGX_USE_PCH=
    
    
    # check the echo's "-n" option and "\c" capability
    
    if echo "test\c" | grep c >/dev/null; then
    
        if echo -n test | grep n >/dev/null; then
            ngx_n=
            ngx_c=
    
        else
            ngx_n=-n
            ngx_c=
        fi
    
    else
        ngx_n=
        ngx_c='\c'
    fi
    
    
    # create Makefile
    
    cat << END > Makefile
    
    default:	build
    
    clean:
    	rm -rf Makefile $NGX_OBJS
    
    .PHONY:	default clean
    END
    
  • auto/sources: Su función principal es definir variables para archivos requeridos por diferentes funciones o sistemas. Según funciones se dividen en CORE, REGEX, EVENT, UNIX, FREEBSD, HTTP, etc.
    Cada función estará compuesta por cuatro variables. "_MODULES" indica los módulos relacionados con esta función, que eventualmente se enviarán al archivo ngx_modules.c, es decir, módulos generados dinámicamente que deben compilarse en nginx; "INCS" indica del que depende esta función
    El directorio del código fuente se utilizará al buscar archivos de encabezado. En las opciones de compilación, aparecerá en "-I"; "
    DEPS" muestra los nombres de los archivos de los que se debe depender en el Makefile, que Es decir, al compilar, debe verificar si hay actualizaciones de estos archivos. Hora;
    "SRCS" indica que esta función es necesaria para compilar los archivos fuente requeridos.
    Tome el núcleo en auto/sources como ejemplo :

    CORE_MODULES="ngx_core_module ngx_errlog_module ngx_conf_module"
    
    CORE_INCS="src/core"
    
    CORE_DEPS="src/core/nginx.h \
               src/core/ngx_config.h \
               ···"
               
    CORE_SRCS="src/core/nginx.c \
               src/core/ngx_log.c \
               ···"
    
  • auto/have: la función de esta herramienta es definir el valor de la variable $have y la macro como 1, y enviarlo al archivo auto_config. Por lo general, utilizamos esta herramienta para controlar si se activa una determinada función. Antes de utilizar esta herramienta, es necesario definir el nombre de la macro, que es la variable $have.

    # Copyright (C) Igor Sysoev
    # Copyright (C) Nginx, Inc.
    
    cat << END >> $NGX_AUTO_CONFIG_H
    
    #ifndef $have
    #define $have  1
    #endif
    
    END
    

Mire el archivo de configuración nuevamente :

# NGX_DEBUG是在auto/options文件中处理的,如果有--with-debug选项,则其值是YES
if [ $NGX_DEBUG = YES ]; then
    have=NGX_DEBUG . auto/have
fi

Se puede ver que la configuración define NGX_DEBUG a través de have: a través de la definición de macro, se envía al archivo de encabezado de configuración y luego, en el programa, se puede juzgar si la macro está definida para implementar una lógica diferente. (En realidad, este código indica si se debe habilitar la depuración del código fuente de nginx)

Continuar configurando :

# 编译器选项
. auto/cc/conf
# 头文件支持宏定义
if [ "$NGX_PLATFORM" != win32 ]; then
	. auto/headers
fi
# 操作系统相关的配置的检测
. auto/os/conf
# unix体系下的通用配置检测
if [ "$NGX_PLATFORM" != win32 ]; then
	. auto/unix
fi

Se llaman a su vez a varios otros archivos en auto para detectar el entorno, incluidos compiladores y sistemas operativos.

  • auto/feature: la configuración de nginx detectará automáticamente las características de diferentes plataformas, basándose en la implementación de auto/feature. La idea central de esta herramienta es generar un pequeño programa C representativo, luego configurar las opciones de compilación, compilar y conectar el programa y luego analizar los resultados.

    • Por ejemplo :
      si desea detectar si existe una determinada biblioteca, llame a una función en la biblioteca en un pequeño programa C y luego compile y vincule. Si ocurre un error, significa que el entorno de la biblioteca es anormal. Si el la compilación es exitosa y el funcionamiento es normal, entonces la detección del entorno de la biblioteca es normal. Cuando escribimos módulos de terceros de nginx, a menudo usamos esta herramienta para detectar el entorno, por lo que esta herramienta funciona durante todo el proceso de configuración.
      Auto/feature se utiliza en auto/unix para detectar si el sistema operativo actual admite la llamada a la función de encuesta :
      ngx_feature="poll()"
      ngx_feature_name=
      ngx_feature_run=no
      ngx_feature_incs="#include <poll.h>"
      ngx_feature_path=
      ngx_feature_libs=
      ngx_feature_test="int n; struct pollfd pl;
      pl.fd = 0;
      pl.events = 0;
      pl.revents = 0;
      n = poll(&pl, 1, 0);
      if (n == -1) return 1"
      . auto/feature
      if [ $ngx_found = no ]; then
      	# 如果没有找到poll,就设置变量的值
      	EVENT_POLL=NONE
      fi
      
      Antes de llamar a auto/feature, debe establecer los valores de varias variables de parámetros de entrada, y luego los resultados se almacenarán en la variable $ngx_found y se generará la definición de macro para indicar la compatibilidad con esta función.
      $ngx_feature 		特性名称
      $ngx_feature_name 	特性的宏定义名称,如果特性测试成功,则会定义该宏定义
      $ngx_feature_path 	编译时要查找头文件目录
      $ngx_feature_test 	要执行的测试代码
      $ngx_feature_incs 	在代码中要include的头文件
      $ngx_feature_libs 	编译时需要link的库文件选项
      $ngx_feature_run 	编译成功后,对二进制文件需要做的动作,可以是yes value bug 其它
      
      $ngx_found 			如果找到,并测试成功,其值为yes,否则其值为no
      

    Veamos el código automático/de función :

    # 初始化输出结果为no
    ngx_found=no
    
    # 将特性名称小写转换成大写
    if test -n "$ngx_feature_name"; then
        ngx_have_feature=`echo $ngx_feature_name \
                       | tr abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ`
    fi
    
    # 将所有include目录转换成编译选项
    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
    
    # 生成临时的小段c程序代码。
    # $ngx_feature_incs变量是程序需要include的头文件
    # $ngx_feature_test是测试代码
    cat << END > $NGX_AUTOTEST.c
    
    #include <sys/types.h>
    $NGX_INCLUDE_UNISTD_H
    $ngx_feature_incs
    
    int main(void) {
        $ngx_feature_test;
        return 0;
    }
    
    END
    
    # 编译命令
    # 编译之后的目标文件是 $NGX_AUTOTEST,后面会判断这个文件是否存在来判断是否编译成功
    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=
    
    # 执行编译过程
    # 编译成功后,会生成$NGX_AUTOTEST命名的文件
    eval "/bin/sh -c \"$ngx_test\" >> $NGX_AUTOCONF_ERR 2>&1"
    
    # 如果文件存在,则编译成功
    if [ -x $NGX_AUTOTEST ]; then
    
        case "$ngx_feature_run" in
        
    		# 需要运行来判断是否支持特性
    		# 测试程序能否正常执行(即程序退出后的状态码是否是0),如果正常退出,则特性测试成功,设置ngx_found为
            yes)
            	# 如果程序正常退出,退出码为0,则程序执行成功,我们可以在测试代码里面手动返回非0来表示程序出错
                # /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
    				
    				# 添加宏定义,宏的值为1
                    if test -n "$ngx_feature_name"; then
                        have=$ngx_have_feature . auto/have
                    fi
    
                else
                    echo " found but is not working"
                fi
            ;;
    
    		# 需要运行程序来判断是否支持特性,如果支持,将程序标准输出的结果作为宏的值
            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
    
    				# 与yes不一样的是,value会将程序从标准输出里面打印出来的值,设置为ngx_feature_name宏变量的值
    				# 在此种情况下,程序需要设置ngx_feature_name变量名
                    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
            ;;
    
    		# 与yes正好相反
            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
            ;;
    
    		# 不需要运行程序,最后定义宏变量
            *)
                echo " found"
                ngx_found=yes
    
                if test -n "$ngx_feature_name"; then
                    have=$ngx_have_feature . auto/have
                fi
            ;;
    
        esac
    
    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
    
    # 最后删除生成的临时文件
    rm -rf $NGX_AUTOTEST*
    
  • auto/cc/conf: este paso es principalmente para detectar el compilador y configurar opciones relacionadas con el compilador. Primero llama a auto/cc/name para obtener el nombre del compilador y luego ejecuta diferentes archivos relacionados con el compilador de acuerdo con la selección del compilador, como gcc y ejecuta auto/cc/gcc para configurar algunas opciones relacionadas con el compilador.

  • auto/include: esta herramienta se utiliza para detectar si el archivo de encabezado es compatible. Los archivos de encabezado que deben detectarse se colocan en $ngx_include. Si es compatible, el valor de la variable $ngx_found es sí y se generará la definición macro de NGX_HAVE_{ngx_include}.

  • auto/headers: Definiciones de macros para generar archivos de encabezado. La definición generada se coloca en objs/ngx_auto_headers.h.

    ngx_include="unistd.h";      . auto/include
    ngx_include="inttypes.h";    . auto/include
    ngx_include="limits.h";      . auto/include
    ngx_include="sys/filio.h";   . auto/include
    ngx_include="sys/param.h";   . auto/include
    ngx_include="sys/mount.h";   . auto/include
    ngx_include="sys/statvfs.h"; . auto/include
    ngx_include="crypt.h";       . auto/include
    
  • auto/os/conf: detecta las características de diferentes plataformas de sistemas operativos y establece diferentes variables CORE_INCS, CORE_DEPS y CORE_SRCS para diferentes sistemas operativos. El soporte multiplataforma de nginx se refleja aquí.

  • auto/unix: Detección de configuración general o llamadas al sistema para sistemas Unix, como detección de llamadas al sistema de procesamiento de eventos como encuesta.

Continuar configurando :

# 生成模块列表
. auto/modules
# 配置库的依赖
. auto/lib/conf
  • auto/modules: este script genera diferentes listas de módulos según diferentes condiciones. El archivo de lista de módulos de salida final está en objs/ngx_modules.c (el código ngx_modules.c generado es el siguiente)

    #include <ngx_config.h>
    #include <ngx_core.h>
    extern ngx_module_t ngx_core_module;
    extern ngx_module_t ngx_errlog_module;
    extern ngx_module_t ngx_conf_module;
    extern ngx_module_t ngx_emp_server_module;
    ...
    ngx_module_t *ngx_modules[] = {
          
          
    	&ngx_core_module,
    	&ngx_errlog_module,
    	&ngx_conf_module,
    	&ngx_emp_server_module,
    	...
    	NULL
    };
    

    Este archivo determinará el orden de todos los módulos, lo que afectará directamente la funcionalidad final. Este archivo cargará nuestro módulo de terceros, que es a lo que debemos prestar atención.
    Echemos un vistazo a parte del contenido en auto/modules :

    if test -n "$DYNAMIC_ADDONS"; then
    
        echo configuring additional dynamic modules
    
        for ngx_addon_dir in $DYNAMIC_ADDONS
        do
            echo "adding module in $ngx_addon_dir"
    
            ngx_module_type=
            ngx_module_name=
            ngx_module_incs=
            ngx_module_deps=
            ngx_module_srcs=
            ngx_module_libs=
            ngx_module_order=
            ngx_module_link=DYNAMIC
    
            if test -f $ngx_addon_dir/config; then
                . $ngx_addon_dir/config
    			# 执行第三方模块的配置
                echo " + $ngx_addon_name was configured"
    
            else
                echo "$0: error: no $ngx_addon_dir/config was found"
                exit 1
            fi
        done
    fi
    

    Este código implementa la poderosa escalabilidad de nginx.
    Para cargar un módulo de terceros, la variable $ngx_addon_dir se agrega a la línea de comando cuando se ejecuta configure. En el código, podemos ver que se agrega a cada módulo de terceros ejecutando el parámetro del archivo de configuración –add-module en su directorio Es una lista de directorios, cada directorio representa un módulo de terceros.
    Entonces podemos ejecutar nuestra propia lógica de detección en el archivo de configuración, como detectar dependencias de biblioteca, agregar opciones de compilación, etc.

  • auto/lib/conf: este archivo detectará las bibliotecas básicas necesarias para la compilación de nginx, como el soporte de detección para la biblioteca PCRE requerida por el módulo de reescritura.

La siguiente configuración define algunas constantes macro, principalmente relacionadas con las rutas de los archivos :

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

if [ ".$NGX_ERROR_LOG_PATH" = "." ]; then
    have=NGX_ERROR_LOG_STDERR . auto/have
fi

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

El trabajo final de configure es generar el Makefile :

# 生成objs/makefile文件
. auto/make

# 生成关于库的编译选项到makefile文件
. auto/lib/make

# 生成与安装相关的makefile文件内容,并生成最外层的makefile文件
. auto/install

# STUB
. auto/stubs

have=NGX_USER value="\"$NGX_USER\"" . auto/define
have=NGX_GROUP value="\"$NGX_GROUP\"" . auto/define

if [ ".$NGX_BUILD" != "." ]; then
    have=NGX_BUILD value="\"$NGX_BUILD\"" . auto/define
fi

# 编译的最后阶段,汇总信息
. auto/summary

Orden de compilación del módulo

El orden de los módulos nginx es muy importante y afectará directamente la función del programa. Además, nginx y algunos módulos también tienen sus propios requisitos de orden específicos. Por ejemplo, el módulo ngx_http_write_filter_module debe ejecutarse en el último paso del módulo de filtro. Si desea verificar el orden de ejecución de los módulos, puede encontrarlo en el archivo objs/ngx_modules.c. Este archivo se genera después de la configuración.

Ejemplo de archivo Objs/ngx_modules.c :

ngx_module_t *ngx_modules[] = {
    
    
	// 全局core模块
	&ngx_core_module,
	&ngx_errlog_module,
	&ngx_conf_module,
	&ngx_emp_server_module,
	&ngx_emp_server_core_module,
	// event模块
	&ngx_events_module,
	&ngx_event_core_module,
	&ngx_kqueue_module,
	// 正则模块
	&ngx_regex_module,
	// http模块
	&ngx_http_module,
	&ngx_http_core_module,
	&ngx_http_log_module
	&ngx_http_upstream_module,
	// http handler模块
	&ngx_http_static_module,
	&ngx_http_autoindex_module,
	&ngx_http_index_module,
	&ngx_http_auth_basic_module,
	&ngx_http_access_module,
	&ngx_http_limit_conn_module,
	&ngx_http_limit_req_module,
	&ngx_http_geo_module,
	&ngx_http_map_module,
	&ngx_http_split_clients_module,
	&ngx_http_referer_module,
	&ngx_http_rewrite_module,
	&ngx_http_proxy_module,
	&ngx_http_fastcgi_module,
	&ngx_http_uwsgi_module,
	&ngx_http_scgi_module,
	&ngx_http_memcached_module,
	&ngx_http_empty_gif_module,
	&ngx_http_browser_module,
	&ngx_http_upstream_ip_hash_module,
	&ngx_http_upstream_keepalive_module,
	//此处是第三方handler模块
	
	// http filter模块
	&ngx_http_write_filter_module,
	&ngx_http_header_filter_module,
	&ngx_http_chunked_filter_module,
	&ngx_http_range_header_filter_module,
	&ngx_http_gzip_filter_module,
	&ngx_http_postpone_filter_module,
	&ngx_http_ssi_filter_module,
	&ngx_http_charset_filter_module,
	&ngx_http_userid_filter_module,
	&ngx_http_headers_filter_module,
	// 第三方filter模块
	&ngx_http_copy_filter_module,
	&ngx_http_range_body_filter_module,
	&ngx_http_not_modified_filter_module,
	NULL
}

El orden del módulo de controlador http y el módulo de filtro http es muy importante, nos centramos principalmente en estos dos tipos de módulos.

  • Módulo de controlador http :
    para los controladores antes de la fase de contenido y los controladores en la misma fase, los módulos se ejecutan secuencialmente.
    Por ejemplo, en el código de muestra anterior, ambos módulos ngx_http_auth_basic_module y ngx_http_access_module están en la fase de acceso. Dado que ngx_http_auth_basic_module está al frente, se ejecutarán primero.
    Dado que solo habrá una ejecución de la fase de contenido, no hay ningún problema de orden. Además, el módulo de controlador de terceros que cargamos siempre se ejecuta en último lugar.

  • Módulo de filtro http :
    el módulo de filtro organizará todos los controladores de filtro en una cadena inversa, de modo que se ejecuten al principio y al final.
    En el ejemplo anterior, ngx_http_write_filter_module se ejecuta en último lugar y ngx_http_not_modified_filter_module se ejecuta primero.

    Nota : El módulo de filtro de terceros que cargamos se ejecuta después del módulo copy_filter y antes del módulo headers_filter.


¡Finalizar!

Supongo que te gusta

Origin blog.csdn.net/Stars____/article/details/129874565
Recomendado
Clasificación