热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

文章2:nginx启动过程之main函数

欢迎转载,转载请注明出处http:blog.csdn.netyankai0219articledetails8453253本文主要是nginx启动过程中关于main函数部分的初始化。1)n
欢迎转载,转载请注明出处http://blog.csdn.net/yankai0219/article/details/8453253 本文主要是nginx启动过程中关于main函数部分的初始化。

1)ngx_get_options:获得运行时的一些选项。

  -g ngx_conf_params                                               
运行命令 执行完ngx_get_options后,全局变量
./nginx -c /usr/local/nginx/conf/nginx.conf u_char* ngx_conf_file = " /usr/local/nginx/conf/nginx.conf"
$./nginx -s stop   u_char * ngx_signal = "stop"
$./nginx -s reload   u_char * ngx_signal = "reload"
 $./nginx -t -c /usr/local/nginx/conf/nginx.conf  
$./nginx -h    ngx_show_version = 1   ngx_show_help = 1;
$./nginx -V ngx_show_version = 1; ngx_show_cOnfigure= 1;
$./nginx -p /usr/local/nginx ngx_prefix = /usr/local/nginx 。ngx_prefix指定Nginx工作目录。其error.log及nginx.conf都会在该目录下被找到。ngx_prefix会在多处使用:1)ngx_log_init中2)在ngx_process_options中会其ngx_prefix的取值赋值给ngx_cycle的conf_prefix和prefix成员变量。

2)ngx_process_options

用来将ngx_get_options中获得这些参数取值赋值到ngx_cycle中。包括:ngx_cycle中的conf_prefix,prefix,conf_file,conf_param,log->log_level等。

3)全局变量 volatile ngx_cycle_t * ngx_cycle处理。

          
ngx_cycle = &init_cycle;

4)ngx_save_argv将argc 和*argv[]的信息保存到ngx_argv和ngx_argc中,其中argv数组的每个元素会对应的保存到ngx_argv数组中。这算是一个备份存储,方便以后master进程做热代码替换之用。

$./nginx -p /usr/local/nginx 则ngx_argv数组保存argv中信息,ngx_argc保存argc信息。则ngx_argc = 3   ngx_argv[0] = /usr/local/nginx/sbin/nginx
 ngx_argv[1]=-p
ngx_argv[2]=/usr/local/nginx

5)ngx_os_init进行系统的一些初始化工作。

     获得ngx_pagesize,ngx_ncpu,ngx_max_sockets,ngx_inherited_nonblocking等信息。

6)ngx_add_inherited_sockets

将继承的套接字添加到ngx_cycle的listening array中。但是啥是继承套接字啊 不知道了~~参考文章nginx源码分析—处理继承的sockets and 运行和控制 Nginx - 命令行参数和信号 继承套接字用于程序的热启动。

7)这个for循环非常重要,

因为它确定了每个module在ngx_module数组中的位置。ngx_module_t中index指示这个module在ngx_module数组中的位置。nginx在编译的时候会生成一个目录objs,该目录下有一个文件ngx_modules.c,该文件中 有ngx_module[]数组。比如ngx_core_module的index为0.

 ngx_max_module = 0;
    for (i = 0; ngx_modules[i]; i++) {
        ngx_modules[i]->index = ngx_max_module++;
    }

8)ngx_init_cycle(&init_cycle);

这是初始化过程中非常重要的一个初始化函数。
 cycle = ngx_init_cycle(&init_cycle);
 ngx_cycle = cycle;
ngx_init_cycle主要做了以下工作,利用old_cycle创建一个新的new_cycle。
1)将old_cycle中成员变量赋值给new_cycle的成员变量
2)为new_cycle中的一些成员变量分配空间
3)依次调用NGX_CORE_MODULE模块的create_conf钩子函数,
4)调用ngx_conf_param和ngx_conf_parse函数解析,将配置文件nginx.conf中关于CORE模块的指令存入相应的变量中。
5)打开cycle_open_files中文件
6)创建共享内存区
7)操作监听套接字。非常关键的一步。
8)调用每个模块的init_module钩子函数
9)关闭和删除old_cycle中的一些成员。
主要就是做了这么几件事情:(1)CORE模块配置的文件的解析,将其存入程序的相应变量中(2)创建共享内存区 (3)监听套接字的处理 (4)调用每个模块的init_module函数

9)ngx_signal_process 

主要是处理来自于$./nginx -s xxx的参数。详见文章2:Nginx与信号相关的内容首先:从存放pid的文件中读取pid 然后关闭文件其次:进入ngx_os_signal_process          遍历signal数组,找到匹配的信号并通过kill 将信号传递给进程,让进程根据信号做相应处理。kill并不是杀死的意思,kill是传递信号的意思。
if (ngx_signal) {
        return ngx_signal_process(cycle, ngx_signal);
    }

10)ngx_init_signal函数

通过sigaction函数设置signal数组中与指定信号相关联的处理动作。这儿详见文章2:nginx中与信号相关的内容

11)ngx_daemon函数

     对于没有继承套接字并且配置文件中daemon on;时,调用ngx_daemon,创建守护进程。这儿是创建守护进程的标准做法。在APUE中有说明。

12)ngx_create_pidfile函数

 13)ngx_process

的获取在main函数中
if (ccf->master && ngx_process == NGX_PROCESS_SINGLE) {
        ngx_process = NGX_PROCESS_MASTER;
    }
最后根据ngx_process是单进程还是多进程,分别调用不同的cycle
if (ngx_process == NGX_PROCESS_SINGLE) {
        ngx_single_process_cycle(cycle);

    } else {
        ngx_master_process_cycle(cycle);
    }

          


参考文章 http://www.alidata.org/archives/1092            http://www.alidata.org/archives/1148                 http://blog.csdn.net/livelylittlefish/article/details/7243718            http://blog.csdn.net/livelylittlefish/article/details/7247080 

推荐阅读
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了C函数ispunct()的用法及示例代码。ispunct()函数用于检查传递的字符是否是标点符号,如果是标点符号则返回非零值,否则返回零。示例代码演示了如何使用ispunct()函数来判断字符是否为标点符号。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
author-avatar
霜霜c
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有