Nginx启动过程
nginx 启动
调用 ngx_get_options() 解析命令参数;
调用 ngx_time_init() 初始化并更新时间,如全局变量ngx_cached_time;
调用 ngx_log_init() 初始化日志,如初始化全局变量 ngx_prefix,打开日志文件 ngx_log_file.fd;
清零全局变量 ngx_cycle,并为 ngx_cycle.pool 创建大小为 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_cycle.listening 数组;
设置 ngx_inherited = 1;
调用 ngx_set_inherited_sockets() 逐一对 ngx_cycle.listening 数组中的 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 进程,不创建该文件 )
进入进程主循环;
master 进程工作原理
设置 work 进程退出等待时间
挂起,等待新的信号来临
更新时间
如果有 worker 进程因为 SIGCHLD 信号退出了,则重启 worker 进程
master 进程退出。如果所有 worker 进程都退出了,并且收到 SIGTERM 信号或 SIGINT 信号或 SIGQUIT 信号等,master 进程开始处理退出
处理SIGTERM信号
处理SIGQUIT信号,并且关闭socket
处理SIGHUP信号
平滑升级,重启worker进程
不是平滑升级,需要重新读取配置
处理重启 10处理SIGUSR1信号 重新打开所有文件 11处理SIGUSR2信号 热代码替换,执行新的程序 12处理SIGWINCH信号,不再处理任何请求
worker 进程工作原理
先在 ngx_processes 数组中找坑位if (ngx_processes[s].pid == -1) {break;}
进程相关结构初始化工作
1)创建管道 ( socketpair )
2)设置管道为非阻塞模式
3)设置管道为异步模式
4)设置异步 I/O 的所有者
5)如果 exec 执行的时候本 fd 不传递给 exec 创建的进程
fork 创建子进程。创建成功后,子进程执行相关逻辑:proc(cycle, data)。
设置 ngx_processes[s] 相关属性
通知子进程新进程创建完毕 ngx_pass_open_channel(cycle, &ch);
master 和 worker 通信原理
评论(0)