您的位置:首页 > 运维架构 > Nginx

nginx的启动初始化过程(一)

2015-01-13 21:00 162 查看
nginx的启动初始化在src/core/nginx.c的main函数中完成,也是整个nginx的入口。nginx的初始化主要围绕一个类型为ngx_cycle_t的全局变量ngx_cycle展开。

main函数做的第一件事是对参数选项进行处理,如下

if (ngx_get_options(argc, argv) != NGX_OK) {

        return 1;

    }

nginx用此函数对参数选项进行解析,从而采取相应的动作,如显示版本,测试配置等功能。

ngx_time_init();

#if (NGX_PCRE)

    ngx_regex_init();

#endif

ngx_pid = ngx_getpid();

    log = ngx_log_init(ngx_prefix);

    if (log == NULL) {

        return 1;

    }

上述几行代码主要完成nginx在时间和日志等方面的初始化工作。

init_cycle.pool = ngx_create_pool(1024, log);

    if (init_cycle.pool == NULL) {

        return 1;

    }

上面是创建内存池。

if (ngx_save_argv(&init_cycle, argc, argv) != NGX_OK) {

        return 1;

    }

将命令行参数保存到ngx_os_argv,ngx_argc,ngx_argv这几个全局变量中,方便以后master进程做热代码替换之用。

if (ngx_process_options(&init_cycle) != NGX_OK) {

        return 1;

    }

主要处理prefix前缀。

if (ngx_os_init(log) != NGX_OK) {

        return 1;

    }

完成操作系统的一些信息获取,如内存页面大小 ,系统限制资源等信息。所有的这些会保存到全局变量中,使得后续访问。

if (ngx_crc32_table_init() != NGX_OK) {

        return 1;

    }

初始化一个循环冗余校验的表。由此可以看出后续的循环冗余校验将采用高效的查表法。

if (ngx_add_inherited_sockets(&init_cycle) != NGX_OK) {

        return 1;

    }

完成socket的继承,继承来的socket会放到init_cycle的listening数组中。完成继承同时设置全局变量ngx_inherited为1

ngx_max_module = 0;

    for (i = 0; ngx_modules[i]; i++) {

        ngx_modules[i]->index = ngx_max_module++;

    }

设置模块的索引,ngx_modules数组是在自动编译时自动生成的,在objs/ngx_modules.c文件中。同时借助ngx_max_module对所有模块统计,确定有多少模块。ngx_modules的数组如下:

ngx_module_t *ngx_modules[] = {

    &ngx_core_module,

    &ngx_errlog_module,

    &ngx_conf_module,

    &ngx_events_module,

    &ngx_event_core_module,

    &ngx_epoll_module,

    &ngx_regex_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_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_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_copy_filter_module,

    &ngx_http_range_body_filter_module,

    &ngx_http_not_modified_filter_module,

    NULL

};

cycle = ngx_init_cycle(&init_cycle);

这里初始化init_cycle,是nginx启动初始化的核心之处。

if (ngx_init_signals(cycle->log) != NGX_OK) {

        return 1;

    }

注册一堆信号处理程序,需要注册的信号及对应的信号处理函数被放在一个类型为ngx_signal_t的数组signals中,数组定义在src/os/unix/ngx_process.c文件中,

ngx_signal_t中定义了信号值、信号名、信号对应的动作名、信号处理函数。

 if (!ngx_inherited && ccf->daemon) {

        if (ngx_daemon(cycle->log) != NGX_OK) {

            return 1;

        }

        ngx_daemonized = 1;

    }

ngx_daemon是用来实现守护进程的函数。

if (ngx_create_pidfile(&ccf->pid, cycle->log) != NGX_OK) {

        return 1;

    }

创建记录进程id的文件,这个文件里面就一个pid。查看ngx_create_pidfile函数中有这样一段代码

if (ngx_process > NGX_PROCESS_MASTER) {

        return NGX_OK;

    }

说明不是master进程时,就不创建这样的一个文件。

if (ngx_process == NGX_PROCESS_SINGLE) {

        ngx_single_process_cycle(cycle);

    } else {

        ngx_master_process_cycle(cycle);

    }

这样就完成nginx的启动初始化过程了,即将开始进程相关的工作了,这是最重要的是ngx_master_process_cycle这个过程,当中实现了master-worker模式的进程模型,也是生成环境下nginx的常用 模型。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: