nginx的ngx_module_s 模塊

特色:module和command:

  • 全部的模塊結構都是全局變量
  • module是配置的內存結構,全部的配置都存放在cycle->ctx中
  • command是配置文件的解析函數:block、指令值。
    • 解析配置文件的時候,調用指令解析函數cmd->set() 的方式解析值,替換其上下文配置。
    • 通常在指令讀取時,碰見block,會將下級模塊都初始化(即{}中的上下文配置初始化)

模塊加載:在ngx_cycle_init()中

  • 在nginx被make以後,會直接建立一個ngx_names[]數組的動態庫,而後經過dlope()將全部模塊都加入進去
  • 在初始化cycle的時候,,在ngx_init_cycle()中,會將 NGX_CORE_MODULE類型的module經過 create_conf()初始化這些模塊上下文ctx的地址空間
    • 例如:log、http、mail、stream、events的 create_conf() = NULL && init_conf() = NULL
    • 例如: openssl、thread_pool、regex存在create_conf()
/**
    regex模塊分配空間,並設爲默認值
*/
static void *
ngx_regex_create_conf(ngx_cycle_t *cycle)
{
    ngx_regex_conf_t  *rcf;

    rcf = ngx_pcalloc(cycle->pool, sizeof(ngx_regex_conf_t));
    if (rcf  NULL) {
        return NULL;
    }

    rcf->pcre_jit = NGX_CONF_UNSET;

    ngx_pcre_studies = ngx_list_create(cycle->pool, 8, sizeof(ngx_regex_elt_t));
    if (ngx_pcre_studies  NULL) {
        return NULL;
    }

    return rcf;
}
  • 讀取配置文件,經過command將須要的初始化和設置二級模塊建立,若是沒有碰見一級模塊指令。nginx

    • 例如:碰見一級events指令,則調用它的指令解析函數:ngx_events_block()
      • 初始化其二級模塊 (NGX_EVENT_MODULE類型) 的上下文配置create_conf() = ngx_event_core_create_conf(),由於不知道哪一個模塊將在配置中,須要給全部的這類模塊(編譯時已加載)分配內存空間
        • 初始化ngx_event_core_module的配置空間:ngx_event_core_create_conf()初始化下級模塊
        • 初始化ngx_epoll_module的配置空間:ngx_epoll_create_conf()
        • 初始化ngx_devpoll_module的配置空間:ngx_devpoll_create_conf()
        • 初始化ngx_eventport_module的配置空間:ngx_epoll_create_conf()
        • 初始化ngx_iocp_module的配置空間:ngx_iocp_create_conf()
        • 初始化ngx_kqueue_module的配置空間:ngx_kqueue_create_conf()
        • 初始化ngx_poll_module的配置空間:NULL
        • 初始化ngx_select_module的配置空間:NULL()
        • 初始化win32的ngx_select_module的配置空間:NULL()
      • 繼續解析文件:ngx_conf_parse(),解析 events{} 中的各指令,替換二級模塊上下文配置值
        • 碰見 (use epoll;),設置ngx_event_core_module模塊(event_core模塊)的上下文(ngx_event_init_conf)ctx.name=epoll
        • 碰見 (worker_connections 1024;),設置ngx_event_core_module模塊(event_core模塊)的上下文(ngx_event_init_conf)ctx.connections=1024
      • 調用ngx_event_core_module模塊的 init_conf() = ngx_event_core_init_conf(),將沒有初始化的參數初始化
      • 調用ngx_epoll_module模塊的 init_conf() = ngx_epoll_init_conf(),將沒有初始化的參數初始化
  • 檢測NGX_CORE_MODULE模塊的init_conf()來將上下文配置中沒有設置參數,設置爲默認值redis

    • 例如:log、http、mail、stream的init_conf() = NULL
    • 例如:events的init_conf() = ngx_event_init_conf()
  • 完成配置模塊上下文配置的初始化,在ngx_worker_process_init() 中調用模塊的 init_process() 啓動上面初始化的模塊(不過在源碼中只有 nginx_event_core_module有這個啓動函數ngx_event_process_init(),其它模塊都是NULL)json

/**
    初始化二級模塊(NGX_EVENT_MODULE類型)ngx_event_core_module模塊的上下文配置
*/
static void *
ngx_event_core_create_conf(ngx_cycle_t *cycle)
{
    ngx_event_conf_t  *ecf;

    ecf = ngx_palloc(cycle->pool, sizeof(ngx_event_conf_t));
    if (ecf  NULL) {
        return NULL;
    }

    ecf->connections = NGX_CONF_UNSET_UINT;
    ecf->use = NGX_CONF_UNSET_UINT;
    ecf->multi_accept = NGX_CONF_UNSET;
    ecf->accept_mutex = NGX_CONF_UNSET;
    ecf->accept_mutex_delay = NGX_CONF_UNSET_MSEC;
    ecf->name = (void *) NGX_CONF_UNSET;
    return ecf;
}
/***
    根據配置的信息來啓用(NGX_EVENT_MODULE類型)ngx_event_core_module剩下的上下文配置信息,並將其設置到cycle上
*/
static char *
ngx_event_core_init_conf(ngx_cycle_t *cycle, void *conf)
{
    ngx_event_conf_t  *ecf = conf;

    int                  fd;
    ngx_int_t            i;
    ngx_module_t        *module;
    ngx_event_module_t  *event_module;

    module = NULL;
    '根據編譯的時候,啓動了epoll、select、etc其中一種'
    #if (NGX_HAVE_EPOLL) && !(NGX_TEST_BUILD_EPOLL)
    
        fd = epoll_create(100);
    
        if (fd != -1) {
            (void) close(fd);
            module = &ngx_epoll_module;
    
        } else if (ngx_errno != NGX_ENOSYS) {
            module = &ngx_epoll_module;
        }
    
    #endif
    
    #if (NGX_HAVE_DEVPOLL) && !(NGX_TEST_BUILD_DEVPOLL)
    
        module = &ngx_devpoll_module;
    
    #endif
    
    #if (NGX_HAVE_KQUEUE)
    
        module = &ngx_kqueue_module;
    
    #endif
    
    #if (NGX_HAVE_SELECT)
    
        if (module  NULL) {
            module = &ngx_select_module;
        }
    
    #endif
    // 全部的 ngx_epoll_module 模塊
    if (module  NULL) {
        for (i = 0; cycle->modules[i]; i++) {

            if (cycle->modules[i]->type != NGX_EVENT_MODULE) {
                continue;
            }

            event_module = cycle->modules[i]->ctx;

            if (ngx_strcmp(event_module->name->data, event_core_name.data)  0)
            {
                continue;
            }

            module = cycle->modules[i];
            break;
        }
    }

    if (module  NULL) {
        ngx_log_error(NGX_LOG_EMERG, cycle->log, 0, "no events module found");
        return NGX_CONF_ERROR;
    }

    ngx_conf_init_uint_value(ecf->connections, DEFAULT_CONNECTIONS);
    cycle->connection_n = ecf->connections;

    ngx_conf_init_uint_value(ecf->use, module->ctx_index);

    event_module = module->ctx;
    ngx_conf_init_ptr_value(ecf->name, event_module->name->data);

    ngx_conf_init_value(ecf->multi_accept, 0);
    ngx_conf_init_value(ecf->accept_mutex, 0);
    ngx_conf_init_msec_value(ecf->accept_mutex_delay, 500);

    return NGX_CONF_OK;
}
/**
    初始化二級模塊(NGX_EVENT_MODULE類型)ngx_epoll_module的上下文配置
*/
static void *
ngx_epoll_create_conf(ngx_cycle_t *cycle)
{
    ngx_epoll_conf_t  *epcf;

    epcf = ngx_palloc(cycle->pool, sizeof(ngx_epoll_conf_t));
    if (epcf  NULL) {
        return NULL;
    }

    epcf->events = NGX_CONF_UNSET;
    epcf->aio_requests = NGX_CONF_UNSET;

    return epcf;
}
/**
    設置二級模塊(NGX_EVENT_MODULE類型)ngx_epoll_module的上下文配置
*/
static char *
ngx_epoll_init_conf(ngx_cycle_t *cycle, void *conf)
{
    ngx_epoll_conf_t *epcf = conf;

    ngx_conf_init_uint_value(epcf->events, 512);
    ngx_conf_init_uint_value(epcf->aio_requests, 32);

    return NGX_CONF_OK;
}

ngx_module_s:模塊結構

struct ngx_module_s {
    ngx_uint_t            ctx_index;    '模塊初始化內存的回調函數的索引,ngx_conf_s.ctx中的位置'
    ngx_uint_t            index;        '模塊初始化內存的回調函數的索引,ngx_conf_s.ctx中的位置'

    char                 *name;         //模塊名稱

    ngx_uint_t            spare0;
    ngx_uint_t            spare1;

    ngx_uint_t            version;      //模塊版本
    const char           *signature;

    'core模塊的上下文:名稱,模塊和命令基本信息的建立、初始化回調函數'
    void                 *ctx; 
    '指令上下文:名稱基本信息的初始化回調函數'
    ngx_command_t        *commands;     
    ngx_uint_t            type;         //該模塊實例的類型標識core,http,event和mail,

    ngx_int_t           (*init_master)(ngx_log_t *log); //主進程初始化時調用

    ngx_int_t           (*init_module)(ngx_cycle_t *cycle); //模塊初始化時調用

    ngx_int_t           (*init_process)(ngx_cycle_t *cycle);    //工做進程初始化時調用
    ngx_int_t           (*init_thread)(ngx_cycle_t *cycle);     //線程初始化時調用
    void                (*exit_thread)(ngx_cycle_t *cycle);     //線程退出時調用
    void                (*exit_process)(ngx_cycle_t *cycle);    //工做進程退出時調用

    void                (*exit_master)(ngx_cycle_t *cycle);     //主進程退出時調用
    //如下是預留成員
    uintptr_t             spare_hook0;
    uintptr_t             spare_hook1;
    uintptr_t             spare_hook2;
    uintptr_t             spare_hook3;
    uintptr_t             spare_hook4;
    uintptr_t             spare_hook5;
    uintptr_t             spare_hook6;
    uintptr_t             spare_hook7;
};
  • type值
模塊類型類型 模塊名稱 指令
NGX_CORE_MODULE errlog error_log
NGX_CORE_MODULE thread_pool thread_pool
NGX_CORE_MODULE openssl ssl_engine
NGX_CORE_MODULE http http
NGX_CORE_MODULE mail mail
NGX_CORE_MODULE google_perftools google_perftools_profiles
NGX_CORE_MODULE stream stream
NGX_CORE_MODULE core daemon、master_process、timer_resolution、pid、lock_file、worker_processes、debug_points、user、worker_priority、worker_cpu_affinity、worker_rlimit_nofile、worker_rlimit_core、worker_shutdown_timeout、working_directory、env、load_module
NGX_CONF_MODULE NULL include
  • *ctx參數在讀取配置文件碰見 NGX_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS 這種block指令時,替換掉。
ngx_core_module_t:核心模塊
typedef struct {
    ngx_str_t             name;
    void               *(*create_conf)(ngx_cycle_t *cycle);
    char               *(*init_conf)(ngx_cycle_t *cycle, void *conf);
} ngx_core_module_t;

ngx_command_s :指令結構

struct ngx_command_s {
    ngx_str_t             name;     //指令名稱
    ngx_uint_t            type;     // 指令類型
    //配置文件的指令解析函數
    char               *(*set)(ngx_conf_t *cf, ngx_command_t *cmd, void *conf); 
    //該字段被NGX_HTTP_MODULE類型模塊所用 (咱們編寫的基本上都是NGX_HTTP_MOUDLE,只有一些nginx核心模塊是非NGX_HTTP_MODULE),該字段指定當前配置項存儲的內存位置。
    //其實是使用哪一個內存池的問題。其實是使用哪一個內存池的問題。由於http模塊對全部http模塊所要保存的配置信息,劃分了main, server和location三個地方進行存儲,每一個地方都有一個內存池用來分配存儲這些信息的內存。
    //這裏可能的值爲 NGX_HTTP_MAIN_CONF_OFFSET、NGX_HTTP_SRV_CONF_OFFSET或NGX_HTTP_LOC_CONF_OFFSET。固然也能夠直接置爲0,就是NGX_HTTP_MAIN_CONF_OFFSET。
    ngx_uint_t            conf;     
    //指定該配置項值的精確存放位置,通常指定爲某一個結構體變量的字段偏移。
    //由於對於配置信息的存儲,通常咱們都是定義個結構體來存儲的。那麼好比咱們定義了一個結構體A,該項配置的值須要存儲到該結構體的b字段。
    // 那麼在這裏就能夠填寫爲offsetof(A, b)。對於有些配置項,它的值不須要保存或者是須要保存到更爲複雜的結構中時,這裏能夠設置爲0
    ngx_uint_t            offset;   
    void                 *post;     //該字段存儲一個指針。能夠指向任何一個在讀取配置過程當中須要的數據,以便於進行配置讀取的處理。大多數時候,都不須要,因此簡單地設爲0便可。
};
  • 指令類型type:
指令類型 說明
NGX_MAIN_CONF 例如:http、mail、events、error_log等
NGX_DIRECT_CONF 能夠出如今配置文件中最外層。例如已經提供的配置指令daemon,master_process等
NGX_ANY_CONF 該配置指令能夠出如今任意配置級別上
NGX_MAIN_CONF http、mail、events、error_log等
NGX_CONF_BLOCK 配置指令能夠接受的值是一個配置信息塊。也就是一對大括號括起來的內容。裏面能夠再包括不少的配置指令。好比常見的server指令就是這個屬性的
NGX_CONF_FLAG 配置指令能夠接受的值是」on」或者」off」,最終會被轉成bool值
NGX_CONF_ANY 配置指令能夠接受的任意的參數值。一個或者多個,或者」on」或者」off」,或者是配置塊
NGX_CONF_ANY 配置指令能夠接受的任意的參數值。一個或者多個,或者」on」或者」off」,或者是配置塊
HTTP模塊
NGX_HTTP_MAIN_CONF 能夠直接出如今http配置指令裏
NGX_HTTP_SRV_CONF 能夠出如今http裏面的server配置指令裏
NGX_HTTP_LOC_CONF 能夠出如今http server塊裏面的location配置指令裏
NGX_HTTP_UPS_CONF 能夠出如今http裏面的upstream配置指令裏
NGX_HTTP_SIF_CONF 能夠出如今http裏面的server配置指令裏的if語句所在的block中
NGX_HTTP_LMT_CONF 能夠出如今http裏面的limit_except指令的block中
NGX_HTTP_LMT_CONF 能夠出如今http裏面的limit_except指令的block中
NGX_HTTP_LMT_CONF 能夠出如今http裏面的limit_except指令的block中
NGX_HTTP_LIF_CONF 能夠出如今http server塊裏面的location配置指令裏的if語句所在的block中
nginx的配置指令的參數個數不能夠超過NGX_CONF_MAX_ARGS個,目前這個值被定義爲8,也就是不能超過8個參數值
NGX_CONF_NOARGS 配置指令不接受任何參數
NGX_CONF_TAKE1 配置指令接受1個參數
NGX_CONF_TAKE2 配置指令接受2個參數
NGX_CONF_TAKE3 配置指令接受3個參數
NGX_CONF_TAKE4 配置指令接受4個參數
NGX_CONF_TAKE5 配置指令接受5個參數
NGX_CONF_TAKE6 配置指令接受6個參數
NGX_CONF_TAKE8 配置指令接受7個參數
NGX_CONF_TAKE12 配置指令接受1個或者2個參數
NGX_CONF_TAKE13 配置指令接受1個或者3個參數
NGX_CONF_TAKE23 配置指令接受2個或者3個參數
NGX_CONF_TAKE123 配置指令接受1個或者2個或者3參數
NGX_CONF_TAKE1234 配置指令接受1個或者2個或者3個或者4個參數
NGX_CONF_1MORE 配置指令接受至少一個參數
NGX_CONF_2MORE 配置指令接受至少兩個參數
NGX_CONF_MULTI 配置指令能夠接受多個參數,即個數不定。
NGX_CONF_2MORE 配置指令接受至少兩個參數
NGX_CONF_2MORE 配置指令接受至少兩個參數

實例:core模塊加載

ngx_core_module
ngx_module_t  ngx_core_module = {
    NGX_MODULE_V1,
    &ngx_core_module_ctx,                  /* module context */
    ngx_core_commands,                     /* module directives */
    NGX_CORE_MODULE,                       /* module type */    //NGX_CORE_MODULE      0x45524F43
    NULL,                                  /* init master */
    NULL,                                  /* init module */
    NULL,                                  /* init process */
    NULL,                                  /* init thread */
    NULL,                                  /* exit thread */
    NULL,                                  /* exit process */
    NULL,                                  /* exit master */
    NGX_MODULE_V1_PADDING
};
// NGX_MODULE_V1
#define NGX_MODULE_V1                    
    NGX_MODULE_UNSET_INDEX, //  ngx_module_s.ctx_index = NGX_MODULE_UNSET_INDEX  (ngx_uint_t) -1
    NGX_MODULE_UNSET_INDEX, //  ngx_module_s.index = NGX_MODULE_UNSET_INDEX  (ngx_uint_t) -1                    
    NULL,                   //  ngx_module_s.name
    0,                      //  ngx_module_s.spare0
    0,                      //  ngx_module_s.spare1
    nginx_version,          //  ngx_module_s.nginx_version
    NGX_MODULE_SIGNATURE    //  ngx_module_s.signature

// 上個信號:NGX_MODULE_SIGNATURE
#define NGX_MODULE_SIGNATURE                                                  \
    NGX_MODULE_SIGNATURE_0 NGX_MODULE_SIGNATURE_1 NGX_MODULE_SIGNATURE_2      \
    NGX_MODULE_SIGNATURE_3 NGX_MODULE_SIGNATURE_4 NGX_MODULE_SIGNATURE_5      \
    NGX_MODULE_SIGNATURE_6 NGX_MODULE_SIGNATURE_7 NGX_MODULE_SIGNATURE_8      \
    NGX_MODULE_SIGNATURE_9 NGX_MODULE_SIGNATURE_10 NGX_MODULE_SIGNATURE_11    \
    NGX_MODULE_SIGNATURE_12 NGX_MODULE_SIGNATURE_13 NGX_MODULE_SIGNATURE_14   \
    NGX_MODULE_SIGNATURE_15 NGX_MODULE_SIGNATURE_16 NGX_MODULE_SIGNATURE_17   \
    NGX_MODULE_SIGNATURE_18 NGX_MODULE_SIGNATURE_19 NGX_MODULE_SIGNATURE_20   \
    NGX_MODULE_SIGNATURE_21 NGX_MODULE_SIGNATURE_22 NGX_MODULE_SIGNATURE_23   \
    NGX_MODULE_SIGNATURE_24 NGX_MODULE_SIGNATURE_25 NGX_MODULE_SIGNATURE_26   \
    NGX_MODULE_SIGNATURE_27 NGX_MODULE_SIGNATURE_28 NGX_MODULE_SIGNATURE_29   \
    NGX_MODULE_SIGNATURE_30 NGX_MODULE_SIGNATURE_31 NGX_MODULE_SIGNATURE_32   \
    NGX_MODULE_SIGNATURE_33 NGX_MODULE_SIGNATURE_34

// NGX_MODULE_V1_PADDING
#define NGX_MODULE_V1_PADDING  
    0,          // ngx_module_s.spare_hook0
    0,          // ngx_module_s.spare_hook1
    0,          // ngx_module_s.spare_hook2
    0,          // ngx_module_s.spare_hook3
    0,          // ngx_module_s.spare_hook4
    0,          // ngx_module_s.spare_hook5
    0,          // ngx_module_s.spare_hook6
    0           // ngx_module_s.spare_hook7
動態加載模塊:
  • configure生成一個咋objs/ngx_modules.c
#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_openssl_module;
extern ngx_module_t  ngx_regex_module;
extern ngx_module_t  ngx_events_module;
extern ngx_module_t  ngx_event_core_module;
extern ngx_module_t  ngx_epoll_module;
extern ngx_module_t  ngx_http_module;
extern ngx_module_t  ngx_http_core_module;
extern ngx_module_t  ngx_http_log_module;
extern ngx_module_t  ngx_http_upstream_module;
extern ngx_module_t  ngx_http_static_module;
extern ngx_module_t  ngx_http_autoindex_module;
extern ngx_module_t  ngx_http_index_module;
extern ngx_module_t  ngx_http_auth_basic_module;
extern ngx_module_t  ngx_http_access_module;
extern ngx_module_t  ngx_http_limit_conn_module;
extern ngx_module_t  ngx_http_limit_req_module;
extern ngx_module_t  ngx_http_geo_module;
extern ngx_module_t  ngx_http_map_module;
extern ngx_module_t  ngx_http_split_clients_module;
extern ngx_module_t  ngx_http_referer_module;
extern ngx_module_t  ngx_http_rewrite_module;
extern ngx_module_t  ngx_http_ssl_module;
extern ngx_module_t  ngx_http_proxy_module;
extern ngx_module_t  ngx_http_fastcgi_module;
extern ngx_module_t  ngx_http_uwsgi_module;
extern ngx_module_t  ngx_http_scgi_module;
extern ngx_module_t  ngx_http_memcached_module;
extern ngx_module_t  ngx_http_empty_gif_module;
extern ngx_module_t  ngx_http_browser_module;
extern ngx_module_t  ngx_http_upstream_hash_module;
extern ngx_module_t  ngx_http_upstream_ip_hash_module;
extern ngx_module_t  ngx_http_upstream_least_conn_module;
extern ngx_module_t  ngx_http_upstream_keepalive_module;
extern ngx_module_t  ngx_http_upstream_zone_module;
extern ngx_module_t  ndk_http_module;
extern ngx_module_t  ngx_coolkit_module;
extern ngx_module_t  ngx_http_set_misc_module;
extern ngx_module_t  ngx_http_form_input_module;
extern ngx_module_t  ngx_http_encrypted_session_module;
extern ngx_module_t  ngx_http_lua_upstream_module;
extern ngx_module_t  ngx_http_array_var_module;
extern ngx_module_t  ngx_http_memc_module;
extern ngx_module_t  ngx_http_redis2_module;
extern ngx_module_t  ngx_http_redis_module;
extern ngx_module_t  ngx_http_write_filter_module;
extern ngx_module_t  ngx_http_header_filter_module;
extern ngx_module_t  ngx_http_chunked_filter_module;
extern ngx_module_t  ngx_http_range_header_filter_module;
extern ngx_module_t  ngx_http_gzip_filter_module;
extern ngx_module_t  ngx_http_postpone_filter_module;
extern ngx_module_t  ngx_http_ssi_filter_module;
extern ngx_module_t  ngx_http_charset_filter_module;
extern ngx_module_t  ngx_http_userid_filter_module;
extern ngx_module_t  ngx_http_headers_filter_module;
extern ngx_module_t  ngx_http_echo_module;
extern ngx_module_t  ngx_http_xss_filter_module;
extern ngx_module_t  ngx_http_srcache_filter_module;
extern ngx_module_t  ngx_http_lua_module;
extern ngx_module_t  ngx_http_headers_more_filter_module;
extern ngx_module_t  ngx_http_rds_json_filter_module;
extern ngx_module_t  ngx_http_rds_csv_filter_module;
extern ngx_module_t  ngx_http_copy_filter_module;
extern ngx_module_t  ngx_http_range_body_filter_module;
extern ngx_module_t  ngx_http_not_modified_filter_module;

ngx_module_t *ngx_modules[] = {
    &ngx_core_module,
    &ngx_errlog_module,
    &ngx_conf_module,
    &ngx_openssl_module,
    &ngx_regex_module,
    &ngx_events_module,
    &ngx_event_core_module,
    &ngx_epoll_module,
    &ngx_http_module,
    &ngx_http_core_module,
    &ngx_http_log_module,
    &ngx_http_upstream_module,
    &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_ssl_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_hash_module,
    &ngx_http_upstream_ip_hash_module,
    &ngx_http_upstream_least_conn_module,
    &ngx_http_upstream_keepalive_module,
    &ngx_http_upstream_zone_module,
    &ndk_http_module,
    &ngx_coolkit_module,
    &ngx_http_set_misc_module,
    &ngx_http_form_input_module,
    &ngx_http_encrypted_session_module,
    &ngx_http_lua_upstream_module,
    &ngx_http_array_var_module,
    &ngx_http_memc_module,
    &ngx_http_redis2_module,
    &ngx_http_redis_module,
    &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,
    &ngx_http_echo_module,
    &ngx_http_xss_filter_module,
    &ngx_http_srcache_filter_module,
    &ngx_http_lua_module,
    &ngx_http_headers_more_filter_module,
    &ngx_http_rds_json_filter_module,
    &ngx_http_rds_csv_filter_module,
    &ngx_http_copy_filter_module,
    &ngx_http_range_body_filter_module,
    &ngx_http_not_modified_filter_module,
    NULL
};

char *ngx_module_names[] = {
    "ngx_core_module",
    "ngx_errlog_module",
    "ngx_conf_module",
    "ngx_openssl_module",
    "ngx_regex_module",
    "ngx_events_module",
    "ngx_event_core_module",
    "ngx_epoll_module",
    "ngx_http_module",
    "ngx_http_core_module",
    "ngx_http_log_module",
    "ngx_http_upstream_module",
    "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_ssl_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_hash_module",
    "ngx_http_upstream_ip_hash_module",
    "ngx_http_upstream_least_conn_module",
    "ngx_http_upstream_keepalive_module",
    "ngx_http_upstream_zone_module",
    "ndk_http_module",
    "ngx_coolkit_module",
    "ngx_http_set_misc_module",
    "ngx_http_form_input_module",
    "ngx_http_encrypted_session_module",
    "ngx_http_lua_upstream_module",
    "ngx_http_array_var_module",
    "ngx_http_memc_module",
    "ngx_http_redis2_module",
    "ngx_http_redis_module",
    "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",
    "ngx_http_echo_module",
    "ngx_http_xss_filter_module",
    "ngx_http_srcache_filter_module",
    "ngx_http_lua_module",
    "ngx_http_headers_more_filter_module",
    "ngx_http_rds_json_filter_module",
    "ngx_http_rds_csv_filter_module",
    "ngx_http_copy_filter_module",
    "ngx_http_range_body_filter_module",
    "ngx_http_not_modified_filter_module",
    NULL
};
  • 而後make生成一個 共享庫:ngx_modules.o

這還有問題數組

  • 在啓動的時候,初始化init_cycle,調用ngx_init_cycle
//加載模塊的基本信息,解析配置文件時初始化
    if (ngx_cycle_modules(cycle) != NGX_OK) {
        ngx_destroy_pool(pool);
        return NULL;
    }


    for (i = 0; cycle->modules[i]; i++) {
        if (cycle->modules[i]->type != NGX_CORE_MODULE) {
            continue;
        }

        module = cycle->modules[i]->ctx;

        if (module->create_conf) {
            rv = module->create_conf(cycle);
            if (rv  NULL) {
                ngx_destroy_pool(pool);
                return NULL;
            }
            cycle->conf_ctx[cycle->modules[i]->index] = rv;
        }
    }
相關文章
相關標籤/搜索