/** 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
檢測NGX_CORE_MODULE模塊的init_conf()來將上下文配置中沒有設置參數,設置爲默認值redis
完成配置模塊上下文配置的初始化,在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; }
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; };
模塊類型類型 | 模塊名稱 | 指令 |
---|---|---|
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 | ||
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 |
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;
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便可。 };
指令類型 | 說明 |
---|---|
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 | 配置指令接受至少兩個參數 |
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
#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 };
這還有問題數組
//加載模塊的基本信息,解析配置文件時初始化 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; } }