nginx 通过ngx_get_conf获取conf信息,ngx_set_worker_processes通过cmd->set(cf, cmd, conf)被调用

1.获取conf信息:

ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);

ngx_get_conf的原型为:
#define ngx_get_conf(conf_ctx, module) conf_ctx[module.index]

所以module.index实际上是ngx_core_module.NGX_MODULE_V1.NGX_MODULE_UNSET_INDEX

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 /
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_UNSET_INDEX,
NULL,
0,
0,
nginx_version,
NGX_MODULE_SIGNATURE

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_uint_t            conf;
		ngx_uint_t            offset;
		void                 *post;
	};

由于:typedef struct ngx_module_s ngx_module_t;
所以ngx_core_module原型为:

struct ngx_module_s {
ngx_uint_t ctx_index;
ngx_uint_t index; //typedef uintptr_t ngx_uint_t;

char                 *name;

ngx_uint_t            spare0;
ngx_uint_t            spare1;

ngx_uint_t            version;
const char           *signature;

void                 *ctx;
ngx_command_t        *commands;
ngx_uint_t            type;

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_conf_t原型为:
typedef struct {
ngx_flag_t daemon;
ngx_flag_t master;

ngx_msec_t                timer_resolution;

ngx_int_t                 worker_processes;
ngx_int_t                 debug_points;

ngx_int_t                 rlimit_nofile;
off_t                     rlimit_core;

int                       priority;

ngx_uint_t                cpu_affinity_auto;
ngx_uint_t                cpu_affinity_n;
ngx_cpuset_t             *cpu_affinity;

char                     *username;
ngx_uid_t                 user;
ngx_gid_t                 group;

ngx_str_t                 working_directory;
ngx_str_t                 lock_file;

ngx_str_t                 pid;
ngx_str_t                 oldpid;

ngx_array_t               env;
char                    **environment;

} ngx_core_conf_t;

conf_ctx原型其实是一个空的4阶指针:

struct ngx_cycle_s {
void ****conf_ctx;
ngx_pool_t *pool;

ngx_log_t                *log;
ngx_log_t                 new_log;

ngx_uint_t                log_use_stderr;  /* unsigned  log_use_stderr:1; */

ngx_connection_t        **files;
ngx_connection_t         *free_connections;
ngx_uint_t                free_connection_n;

ngx_module_t            **modules;
ngx_uint_t                modules_n;
ngx_uint_t                modules_used;    /* unsigned  modules_used:1; */

ngx_queue_t               reusable_connections_queue;

ngx_array_t               listening;
ngx_array_t               paths;
ngx_array_t               config_dump;
ngx_list_t                open_files;
ngx_list_t                shared_memory;

ngx_uint_t                connection_n;
ngx_uint_t                files_n;

ngx_connection_t         *connections;
ngx_event_t              *read_events;
ngx_event_t              *write_events;

ngx_cycle_t              *old_cycle;

ngx_str_t                 conf_file;
ngx_str_t                 conf_param;
ngx_str_t                 conf_prefix;
ngx_str_t                 prefix;
ngx_str_t                 lock_file;
ngx_str_t                 hostname;

};

struct ngx_cycle_s {
void ****conf_ctx;
ngx_pool_t *pool;

ngx_log_t                *log;
ngx_log_t                 new_log;

ngx_uint_t                log_use_stderr;  /* unsigned  log_use_stderr:1; */

ngx_connection_t        **files;
ngx_connection_t         *free_connections;
ngx_uint_t                free_connection_n;

ngx_module_t            **modules;
ngx_uint_t                modules_n;
ngx_uint_t                modules_used;    /* unsigned  modules_used:1; */

ngx_queue_t               reusable_connections_queue;

ngx_array_t               listening;
ngx_array_t               paths;
ngx_array_t               config_dump;
ngx_list_t                open_files;
ngx_list_t                shared_memory;

ngx_uint_t                connection_n;
ngx_uint_t                files_n;

ngx_connection_t         *connections;
ngx_event_t              *read_events;
ngx_event_t              *write_events;

ngx_cycle_t              *old_cycle;

ngx_str_t                 conf_file;
ngx_str_t                 conf_param;
ngx_str_t                 conf_prefix;
ngx_str_t                 prefix;
ngx_str_t                 lock_file;
ngx_str_t                 hostname;

};

2.ngx_set_worker_processes通过cmd->set(cf, cmd, conf)调用。

  /**
         * 配置文件设置值;
         * conf为配置的指针地址;
         * cmd为命令结构;
         * conf为配置指针地址 一般情况下 conf为模块自定义的配置文件数据结构地址
         *
         */

rv = cmd->set(cf, cmd, conf);

typedef struct ngx_command_s ngx_command_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_uint_t conf;
ngx_uint_t offset;
void *post;
};
static ngx_command_t ngx_core_commands[] = {

{ ngx_string(“worker_processes”),
NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,
ngx_set_worker_processes,
0,
0,
NULL },
}

static char *
ngx_set_worker_processes(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{
ngx_str_t *value;
ngx_core_conf_t *ccf;

ccf = (ngx_core_conf_t *) conf;

if (ccf->worker_processes != NGX_CONF_UNSET) {
    return "is duplicate";
}

value = cf->args->elts;

if (ngx_strcmp(value[1].data, "auto") == 0) {
    ccf->worker_processes = ngx_ncpu;
    return NGX_CONF_OK;
}

ccf->worker_processes = ngx_atoi(value[1].data, value[1].len);

if (ccf->worker_processes == NGX_ERROR) {
    return "invalid value";
}

return NGX_CONF_OK;

}

你可能感兴趣的:(nginx,运维,服务器)