【Nginx 源码学习】Nginx 架构设计与主流程分析

upstream 的流程后面单出一篇。


启动流程


在这里插入图片描述

main 入口

int ngx_cdecl main(int argc, char *const *argv)

{

//1、声明一波对象,打印一些基本信息,初始化一些东西

//2、通过 ngx_save_argv(&init_cycle, argc, argv),将 argv 参数拷贝到一份内存中

if (ngx_save_argv(&init_cycle, argc, argv) != NGX_OK) {

return 1;

}

/*

argv 参数是什么?就是管理者想nginx传入的信号,如 nginx -s reload之类的

在后面还能找到信号捕捉函数,我已经把源码也铺开了,后面再看

*/

//然后继续init

//3、信号捕捉

if (ngx_signal) {

return ngx_signal_process(cycle, ngx_signal);

}

//继续配置

/…/

#if !(NGX_WIN32)

if (ngx_init_signals(cycle->log) != NGX_OK) {

return 1;

}

if (!ngx_inherited && ccf->daemon) {

// 4、创建守护进程

if (ngx_daemon(cycle->log) != NGX_OK) {

return 1;

}

ngx_daemonized = 1;

}

if (ngx_inherited) {

ngx_daemonized = 1;

}

#endif

/…/

//5、启动进程循环咯

if (ngx_process == NGX_PROCESS_SINGLE) {

ngx_single_process_cycle(cycle);

} else {

ngx_master_process_cycle(cycle);

}

return 0;

}


ngx_master_process_cycle 进入多进程模式

/**

  • Nginx的多进程运行模式

*/

void ngx_master_process_cycle(ngx_cycle_t *cycle) {

char *title;

u_char *p;

size_t size;

ngx_int_t i;

ngx_uint_t n, sigio;

sigset_t set;

struct itimerval itv;

ngx_uint_t live;

ngx_msec_t delay;

ngx_listening_t *ls;

ngx_core_conf_t *ccf;

/* 设置能接收到的信号 */

sigemptyset(&set);

sigaddset(&set, SIGCHLD);

sigaddset(&set, SIGALRM);

sigaddset(&set, SIGIO);

sigaddset(&set, SIGINT);

sigaddset(&set, ngx_signal_value(NGX_RECONFIGURE_SIGNAL));

sigaddset(&set, ngx_signal_value(NGX_REOPEN_SIGNAL));

sigaddset(&set, ngx_signal_value(NGX_NOACCEPT_SIGNAL));

sigaddset(&set, ngx_signal_value(NGX_TERMINATE_SIGNAL));

sigaddset(&set, ngx_signal_value(NGX_SHUTDOWN_SIGNAL));

sigaddset(&set, ngx_signal_value(NGX_CHANGEBIN_SIGNAL));

if (sigprocmask(SIG_BLOCK, &set, NULL) == -1) {

ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,

“sigprocmask() failed”);

}

sigemptyset(&set);

size = sizeof(master_process);

for (i = 0; i < ngx_argc; i++) {

size += ngx_strlen(ngx_argv[i]) + 1;

}

/* 保存进程标题 */

title = ngx_pnalloc(cycle->pool, size);

if (title == NULL) {

/* fatal */

exit(2);

}

p = ngx_cpymem(title, master_process, sizeof(master_process) - 1);

for (i = 0; i < ngx_argc; i++) {

*p++ = ’ ';

p = ngx_cpystrn(p, (u_char *) ngx_argv[i], size);

}

ngx_setproctitle(title);

/* 获取核心配置 ngx_core_conf_t */

ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);

/* 启动工作进程 - 多进程启动的核心函数 */

ngx_start_worker_processes(cycle, ccf->worker_processes,

NGX_PROCESS_RESPAWN);

ngx_start_cache_manager_processes(cycle, 0);

ngx_new_binary = 0;

delay = 0;

sigio = 0;

live = 1;

/* 主线程循环 */

for (;😉 {

/* delay用来设置等待worker推出的时间,master接受了退出信号后,

  • 首先发送退出信号给worker,而worker退出需要一些时间*/

if

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值