NGINX 进程通信机制

nginx的进程通信分为三种类别:linux 系统与nginx 通信, master 进程与worker进程通信, worker进程间通信。 master进程管理worker进程 ### Linux信号 linux 系统与nginx是通过信号才进行通信的,通过信号控制nginx重启、关闭以及加载配置文件等。 ### 信号发送流程 #### 1.发送信号 `./nginx –s quit` 向master进程发送信号 这里有一点是:执行 ./nginx –s quit 实际上是新开了一个master进程,只不过它半路夭折了,即向原master发送信号后,它就死掉啦。它存在的意义就是向原master发送信号。 #### 2.获取参数 nginx 通过 -s 知道用户要给nginx 发送信号,会有相应的动作。 ngx_get_options case 's': if (*p) { ngx_signal = (char *) p; } if (ngx_strcmp(ngx_signal, "stop") == 0 || ngx_strcmp(ngx_signal, "quit") == 0 || ngx_strcmp(ngx_signal, "reopen") == 0 || ngx_strcmp(ngx_signal, "reload") == 0) { ngx_process = NGX_PROCESS_SIGNALLER; goto next; } #### 3.获取pid 要发送信号,需要知道master进程的pid,那如何获得呢?nginx 启动的时候将其写入了本地文件中。 ngx_int_t ngx_signal_process(ngx_cycle_t *cycle, char *sig) { ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module); file.name = ccf->pid; file.fd = ngx_open_file(file.name.data, NGX_FILE_RDONLY, NGX_FILE_OPEN, NGX_FILE_DEFAULT_ACCESS); n = ngx_read_file(&file, buf, NGX_INT64_LEN + 2, 0); pid = ngx_atoi(buf, ++n); return ngx_os_signal_process(cycle, sig, pid); } file.name即为配置文件中指定pid所在的文件,该文件存放master的pid。通过配置文件中的pid字段,指明存放进程id文件的地址。 #### 4.发送信号 ngx_int_t ngx_os_signal_process(ngx_cycle_t *cycle, char *name, ngx_int_t pid) { ngx_signal_t *sig; for (sig = signals; sig->signo != 0; sig++) { if (ngx_strcmp(name, sig->name) == 0) { if (kill(pid, sig->signo) != -1) { return 0; } } } return 1; } 根据name到ngx_signal_t的名字中去匹配,找到信号,然后通过kill向master发送消息。
联系我们

邮箱 626512443@qq.com
电话 18611320371(微信)
QQ群 235681453

Copyright © 2015-2022

备案号:京ICP备15003423号-3