NGINX 进程通信机制

本文地址:http://blog.csdn.net/spch2008/article/details/38945033


nginx的进程通信分为三种类别:linux 系统与nginx 通信, master 进程与worker进程通信, worker进程间通信。

master进程管理worker进程,本文将追溯nginx 的退出过程。


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 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值