• nginx多进程模型之配置热加载---转


    http://blog.csdn.net/brainkick/article/details/7176405

    前言:

           服务器程序通常都会通过相应的配置文件来控制服务器的工作。很多情况下,配置文件会经常地被修改,在使其生效时,我们都希望不重启程序,不影响服务器的正常服务。所以所谓的配置文件”热加载”就成了一项非常重要的功能,而这方面,nginx给我们树立了非常好的榜样,值得我们去学习和借鉴。

    分析:

           在nginx正常服务时,我们在nginx的程序程序目录执行./nginx –sreload,来实现重新加载配置文件。-s的作用是向master进程发送信号,除了reload功能之外,还可以使用stop,reopen等,具体地可以通过-h来查看。

    当执行了./nginx –s reload之后,通过ngxs_signal来保存”reload”字符串,然后通过ngx_signal_process 来向当期正在运行的nginxmaster进程发送信号。代码如下:

    if (ngx_signal) {

           return  ngx_signal_process(cycle, ngx_signal);

    }

    通过读代码我们看到,向当前运行的nginx进程发送信号,实际上就是重启一份nginx,不过这个nginx并不会作为一个server启动起来,它替我们发送完信号之后就退出了。所以对于nginx的一些控制有些是不需要我们使用kill来操作的,nginx帮我们做了一下封装,我们使用的时候也就方便了。

    具体地,nginx是如何帮我们发送信号的呢?其实很简单,我们知道nginx有个pid文件,里面记录了,当前正在运行的nginxmaster进程的pid,所以程序会通过这个文件得到进程的pid,和信号字符串对应的signo,最后使用kill来完成信号的发送。

    Nginx初始化阶段通过ngx_init_signals函数来初始化信号操作。在ngx_process.c中定义了一个signals数组。

    1. typedef struct {  
    2.   
    3.     int    signo;                  // 信号值  
    4.   
    5.     char  *signame;               // 信号值对应的字面名  
    6.   
    7.     char  *name;                 // nginx下的别名  
    8.   
    9.     void (*handler)(int signo);  // 信号处理函数  
    10.   
    11. } ngx_signal_t;  
    12.   
    13.    

    我们看到”reload”其实是SIGHUP信号的封装,也就是说我们可以直接通过kill向nginx发送SIGHUP信号来完成reload操作。

    这里我们重点关注信号处理函数:ngx_signal_handler。

    所以当我们执行nginx –s reload时,ngx_signal_handler就会执行了。

    在ngx_signal_handler中,ngx_process表示当前进程的类型,在信号处理时,对于不同的进程,处理是不一样的,这里通过switch case来作区分。我们主要关注masterprocess,即NGX_PROCESS_MASTER类型。代码如下:

    1. casengx_signal_value(NGX_RECONFIGURE_SIGNAL):  
    2.   
    3.     ngx_reconfigure = 1;  
    4.   
    5.     action = ", reconfiguring";  
    6.   
    7. break;  

    我们发现当前进程中的全局变量ngx_reconfigure被置成了1,这样在ngx_master_process_cycle的for循环中检测到ngx_reconfigure ==1,就开始做重加载配置的操作了。

             后续的动作就很明显了。通过ngx_start_worker_processes开启新进程,而之前的进程则通过ngx_signal_worker_processes,来发送信号来“优雅”的关闭,所谓优雅的关闭,是指当前真正处理请求的进程会等到处理完之后再退出,同时当前的进程停止listen,不再accept新的请求了

  • 相关阅读:
    C++ template —— 模板中的名称(三)
    关于烂代码的那些事(下)
    关于烂代码的那些事(中)
    关于烂代码的那些事(上)
    比尔的村庄:创业是选择做赚钱的事,还是值钱的事?
    C++ template —— 深入模板基础(二)
    依赖倒置,控制反转,依赖注入
    JAVA中限制接口流量、并发的方法
    SVN同步时忽略特定文件或文件夹
    MySQL中查询表及索引大小的方法
  • 原文地址:https://www.cnblogs.com/davidwang456/p/3565653.html
Copyright © 2020-2023  润新知