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. int    signo;                  // 信号值
  3. char  *signame;               // 信号值对应的字面名
  4. char  *name;                 // nginx下的别名
  5. void (*handler)(int signo);  // 信号处理函数
  6. } ngx_signal_t;

我们看到”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. ngx_reconfigure = 1;
  3. action = ", reconfiguring";
  4. break;

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

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

最新文章

  1. 使用JSLint提高JS代码质量
  2. iOS中的小知识点
  3. 用 C# 实现一个简单的 Rest Service 供外部调用
  4. jdbc 配置
  5. Squish License
  6. C语言第七节流程控制
  7. linux初学 :简易的shell脚本
  8. 正确编写Designated Initializer的几个原则
  9. 【锋利的JQuery-学习笔记】添加提示图片
  10. 让wordpress分类和标签的描述支持HTML代码
  11. 学习使用Vim(二)——User Manuals, Getting Started
  12. LED大屏发布系统
  13. 给我的cnblogs主页做一个响应式布局模板
  14. Python字符串和列表的内置方法
  15. 【做题】HDU6331 Walking Plan——矩阵&分块
  16. DevExpress01、独立使用的控件
  17. mogodb的安装与配置
  18. 浮动元素垂直居中,bootstrap栅格布局垂直居中
  19. File中mkdir()和mkdirs()的区别
  20. C++——类继承以及类初始化顺序

热门文章

  1. 使用MockMvc测试Spring mvc Controller
  2. return View()
  3. 转】MyEclipse使用总结——MyEclipse文件查找技巧
  4. MFC如何添加系统消息处理函数?
  5. JavaScript学习——内置属性
  6. HDU 4497 GCD and LCM (数学,质数分解)
  7. HeapAlloc、GlobalAlloc和new等内存分配有什么区别么?
  8. T4 模板入门
  9. Vagrant 快速入门
  10. 对Slony-I中wait on的理解