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

nginx的启动初始化过程(一)相关推荐

  1. Nginx源码分析-启动初始化过程(一)

    Nginx的启动初始化在src/core/nginx.c的main函数中完成,当然main函数是整个Nginx的入口,除了完成启动初始化任务以外,也必定是所有功能模块的入口之处.Nginx的初始化工作 ...

  2. nginx启动初始化过程(二)

    前面提到nginx启动过程中,关键部分是ngx_init_cycle.ngx_init_cycle()函数究竟做了哪些工作.ngx_cycle_t结构定义在src/core/ngx_core.h文件中 ...

  3. wordpress启动初始化过程

    2019独角兽企业重金招聘Python工程师标准>>> wordpress是免费开源的用php开发的博客平台,功能十分强大,中文友好,使用mysql数据库,安装非常方便.但是功能强大 ...

  4. 操作系统实验(2)—— Linux启动初始化过程设计探析实验

  5. nginx源码分析(2)——http模块的初始化过程

    前一篇文章介绍了nginx的启动初始化过程,包括了所有模块的初始化过程,比如http模块.事件模块等.这里再详细介绍一下http模块的启动过程,还记得在前一篇文章中提到过ngx_conf_parse函 ...

  6. linux如何查看nginx是否启动

    Nginx是一个高性能的反向代理服务器,现在一般作为我们网站或其他Web服务的第一层代理,用户在浏览器请求首先经过的就是Nginx服务. 如果Nginx服务没有启动或异常结束,将会影响Web服务的正常 ...

  7. php 怎么看nginx,查看nginx是否启动

    查看nginx是否启动? 下面我将在Linux中查看Nginx是否启动的过程记录,分享出来. 通过进程判断 第一种方法:查看进程列表并过滤 Linux每个应用运行都会产生一个进程,那么我们就可以通过查 ...

  8. SpringBoot启动流程分析(四):IoC容器的初始化过程

    SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...

  9. 启动期间的内存管理之初始化过程概述----Linux内存管理(九)

    转载地址:https://blog.csdn.net/gatieme/article/details/52403148 日期 内核版本 架构 作者 GitHub CSDN 2016-09-01 Lin ...

最新文章

  1. DirectSound的应用
  2. Node.js 安装及环境配置之 Windows 篇
  3. Feb 26 Programming Notes
  4. 自定义对话框 提示:Unable to add window token null is not for an application
  5. ubuntu下集群设置静态ip
  6. 王者归来!iPhone 13热销立功 苹果重夺销量全球第一
  7. pe我的手机服务器存档文件,我的世界手机版怎么导出存档 pe版怎么把存档给别人用...
  8. 网线连接电脑共享文件传递
  9. 谈谈我的微软特约稿:《SQL Server 2014 新特性:IO资源调控》
  10. kaggle比赛:房价预测(基于MXNet框架)
  11. select下拉复选
  12. 华为云数据迁移工具解决方案:阿里云迁移到华为云
  13. android 画圆形 bitmap,在android中画圆形图片的几种办法
  14. 截取邮箱后缀名,拼接访问邮箱地址
  15. 手工植锡、焊接BGA芯片
  16. 物联网云平台DTU Modbus协议 上位机 下位机 源码 源代码 程序
  17. 江西省2021年工业互联网安全技术技能大赛
  18. html5如何快速选择工具使用技巧,写给PS新手们 五种快速抠图技巧连连看
  19. python实现蓝桥杯真题:猜美国数学家维纳的年龄
  20. 新东方东方优播iOS面试经历

热门文章

  1. 【SQL Server学习笔记】变更数据捕获(Change Data Capture)
  2. 学python有哪些书推荐-有哪些Python学习路线值得推荐?线路及书籍推荐都在这里...
  3. python编程语言的缺点-常见的AI编程语言优缺点比较,程序员千万不要入错行!...
  4. python培训中心-吴中区Python培训中心
  5. python使用界面-(八)Python 图形化界面设计
  6. python复数类型-python复数类型
  7. python入门买什么书-关于 Python 的经典入门书籍有哪些?
  8. python语言编程环境-day02--编程语言的分类与Python开发环境的搭建
  9. python绘制动态图-Python利用Echarts绘制动态交互图:快速入门
  10. python哪一版好用-python IDE有哪些?哪个好用?