NGINX
2020-01-17 09:53:20 7 举报
nginx启动代码流程图
作者其他创作
大纲/内容
是
ngx_add_inherited_sockets
如果有信号,则进入ngx_signal_process方法。如:/nginx -s stop
进入进程主循环:1、若NGX_PROCESS_SINGLE = 1 则调用ngx_single_process_cycle() 进入进程循环2、否则为master-worker模式,调用 ngx_master_process_cycle()进入进程循环
重新执行文件打开权限设置用户设置等
网络事件,定时器等
进入
创建pid文件
完成全局变量cycle的初始化
设置读事件回调,并回调
ngx_single_process_cycle()
ngx_terminate || ngx_quit
ngx_http_core_run_phases
否
ngx_worker_process_init
若为rewrite,则修改http所执行的11个阶段的下标为rewrite的对应阶段若不是则重头执行设置r->write_event_handler = ngx_http_core_run_phases,并回调
ngx_setproctitle
checker
delay 时间矫正 ngx_reap 子进程意外结束 ngx_terminate 强制退出 ngx_quit 退出 ngx_reconfigure重新加载配置文件 ngx_restart 重启 ngx_reopen 重新打开所有文件 ngx_change_binary 平滑升级 ngx_noaccept 所有子进程不接收新链接
初始化listening_t,设置ls->handler = ngx_http_init_connection
nginx_init_cycle
for:exit_process
ngx_http_init_connection
解析nginx.conf
将临时的init_cycle转移到cycle,并进行更为细致的初始化:creat_conf --> 解析配置文件(set回调)-->init_conf-->目录创建、文件打开、共享内存初始化、listening监听
ngx_event_process_posted(ngx_post_events)
启动worker进程
for:创建一个location trees
每个模块中加入到某个阶段执行的handler
遍历所有module,退出
fork一个work
j进入
ngx_start_worker_processes
初始化init_cycle Nginx的全局变量
是否退出
ngx_set_environment
多进程启动
继承了socket的套接字。主要作用是热启动的时候需要平滑过渡
全局变量
单进程启动
ngx_worker_process_cycle
ngx_master_process_exit
ngx_process_events_and_timers
ngx_reconfigure
ngx_getpid
ngx_http_wait_request_handler
一个http开始,初始化connection,读写时间回调的初始化
ngx_signal_process
初始化并更新时间
ngx_process_events
ngx_event_process_posted(ngx_post_accept_events)
master主循环
模块编号
事件处理 延迟队列
NGX_PROCESS_SINGLE
ngx_reopen
ngx_timer_resolution
前置的初始化模块,对模块进行编号处理
设置11个阶段的checker方法,该方法里会调用handler
重新加载配置?
while : 循环执行所有checker
获取环境变量
for:调用所有http模块的creat_main/srv/loc回调,merge回调
解析http请求报文头,存储至request_t
ngx_http_init_phases
回调
对main/srv/loc三个级别的config分配空间
ngx_save_argv
是否reopen?
ngx_http_add_listening
每个http模块中自定义 初始化工作
设置写事件回调并调用
取值
ngx_http_process_request_line
热切换,保证切换之后的套接字不丢失。
初始化一致性hash表,主要作用是加快查询
ngx_log_init
解析http请求报文体,存储至key/value结构中
负载均衡:使用ngx_accept_disabled作为阈值,只有某个worker的连接数到达7/8时才会启动惊群:使用加速机制,只有worker获取到锁,才可以epoll_wait,如果某worker获得锁的时间太长,则将他的其他事件加入到post队列,延迟处理
解析命令行中的参数
for:ngx_spawn_processes
处理http请求,重新设置读写回调函数为ngx_http_request_handler
ngx_os_init()
for:调用所有http模块的creat_main/srv/loc回调
修改读事件回调,并回调
time / flag 计算
ngx_http_process_request_header
主流程
for:init_process
调用event_module_t的process_events并计算其其执行耗时delay非NGX_POST_EVENTS,立即处理,否则加入post队列
ngx_crc32_table_init
for:调用所有http模块的preconfiguration回调
ngx_argv
执行handler
Nginx有平滑重启的功能,让用户无感知并且不中断。
得到核心模块ngx_core_conf_t的配置文件指针
信号集设置,设置为Block,设置完清空
ngx_init_cycle
赋值
将ngx_get_options中获得这些参数取值赋值到ngx_cycle中
ngx_cycle
ngx_conf_parse
开始真正创建多个Nginx的子进程。进入进程循环
启动cache_manager进程
初始化日志
init_cycle
ngx_start_cache_manager_processes
ngx_http_handler
采用这一步添加继承的Socket套接字, 套接字会放在NGINX的全局环境变量中 继承来的socket将会放到init_cycle的listening数组中。 NGINX环境变量中,每个socket中间用冒号或分号隔开。NGINX=\"16000:16500:16600;\" 设置ngx_inherited=1
初始化http 11个阶段的Handle数组,将http请求进行了阶段划分
解析配置前的回调
修改master进程名字
ngx_create_pidfile
空间回收关闭套接字结束进程
ngx_exitingngx_terminatengx_quitngx_reopen
设置handler回调,对特定location中特定配置的请求处理
ngx_master_process_cycle()
ngx_http_block
accept延迟队列
ngx_process_options
ngx_get_conf
执行set回调以http为例:调用 ngx_http_block
for:调用所有http模块的postconfiguration回调
ngx_time_init
EXIT
ngx_http_optimize_servers
ngx_http_process_request
ngx_master_process_cycle或ngx_single_process_cycle
ngx_http_init_phase_handlers
遍历所有module,并初始化
负载均衡/惊群效应处理
每个阶段都有自己的checker
获取当前进程的pid,用于发送重启,关闭等信号命令。
sigprocmark/sigemptyset
ngx_http_init_listening
保存Nginx命令行中的参数和变量
ngx_get_options
0 条评论
下一页