1 / 16
文档名称:

Nginx源码分析:3张图看懂启动及进程工作原理.doc

格式:doc   大小:19KB   页数:16页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

Nginx源码分析:3张图看懂启动及进程工作原理.doc

上传人:学习好资料 2021/10/10 文件大小:19 KB

下载得到文件列表

Nginx源码分析:3张图看懂启动及进程工作原理.doc

相关文档

文档介绍

文档介绍:Nginx源码分析:3张图看懂启动及进程工作原理
编者按:高可用架构分享及传播在架构领域具有典型意义的文章,本文由陈科在高可用架构群分享。转载请注明来自高可用架构公众号「ArchNotes」。
导读:很多工程师及架构师都希望了解及掌握高性能服务器开发,阅读优秀源代码是一种有效的方式,nginx 是业界知名的高性能 Web 服务器实现,如何有效的阅读及理解 nginx?本文用图解的方式帮助大家来更好的阅读及理解 nginx 关键环节的实现。
陈科,十年行业从业经验,曾在浙江电信、阿里巴巴、华为、五八同城任开发工程及架构师等职,目前负责河狸家后端架构和运维。博客地址:
图一:nginx 启动及内存申请过程分析任何程序都离不开启动和配置解析。ngx 的代码离不开 ngx_cycle_s 和 ngx_pool_s 这两个核心数据结构,所以我们在启动之前先来分析下。内存申请过程分为 3 步
假如申请的内存小于当前块剩余的空间,则直接在当前块中分配。假如当前块空间不足,则调用 ngx_palloc_block 分配一个新块然后把新块链接到 中,然后分配数据。假如申请的大小大于当前块的最大值,则直接调用 ngx_palloc_large 分配一个大块,并且链接到 pool→large 链表中
内存分配过程图解如下(图片来自网络)
为了更好理解上面的图,可以参看文末附 2 的几个数据结构:ngx_pool_s 及 ngx_cycle_s。
知道了这两个核心数据结构之后,我们正式进入 main 函数,main 函数执行过程如下调用 ngx_get_options() 解析命令参数;调用 ngx_time_init() 初始化并更新时间,如全局变量ngx_cached_time;调用 ngx_log_init() 初始化日志,如初始化全局变量 ngx_prefix,打开日志文件 ;清零全局变量 ngx_cycle,并为 创建大小为 1024B 的内存池;调用 ngx_save_argv() 保存命令行参数至全局变量 ngx_os_argv、ngx_argc、ngx_argv 中;调用 ngx_process_options() 初始化 ngx_cycle 的 prefix, conf_prefix, conf_file, conf_param 等字段;调用 ngx_os_init() 初始化系统相关变量,如内存页面大小 ngx_pagesize , ngx_cacheline_size , 最大连接数 ngx_max_sockets 等; 调用 ngx_crc32_table_init() 初始化 CRC 表 ( 后续的 CRC 校验通过查表进行,效率高 ); 调用 ngx_add_inherited_sockets() 继承 sockets:解析环境变量 NGINX_VAR = 'NGINX' 中的 sockets,并保存至 数组; 设置 ngx_inherited = 1;调用 ngx_set_inherited_sockets() 逐一对 数组中的 sockets 进行设置;初始化每个 module 的 index,并计算 ngx_max_module;调用 ngx_init_cycle() 进行初始化;该初始化主要对 ngx_cycle 结构进行;若有信号,则进入 ngx_signal_process() 处理;调用 ngx_init_signals() 初始化信号;主要完成信号处理程序的注册; 若无继承 sockets,且设置了守护进程标识,则调用 ngx_daemon() 创建守护进程;调用 ngx_create_pidfile() 创建进程记录文件;( 非 NGX_PROCESS_MASTER = 1 进程,不创建该文件 )进入进程主循环;若为 NGX_PROCESS_SINGLE=1模式,则调用 ngx_single_process_cycle() 进入进程循环;否则为 master-worker 模式,调用 ngx_master_process_cycle() 进入进程循环;
在 main 函数执行过程中,有一个非常重要的函数 ngx_init_cycle,这个阶段做了什么呢?下面分析 ngx_init_cycle,初始化过程:
更新 timezone 和 time创建内存池给 cycle 指针分配内存保存安装路径,配置文件,启动参数等初始化打开文件句柄初始化共享