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

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的常用 模型。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kgduu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值