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新的请求了

转载于:https://www.cnblogs.com/davidwang456/p/3565653.html

nginx多进程模型之配置热加载---转相关推荐

  1. Nacos Spring Cloud 实现配置热加载

    0x01:安装 Nacos 下载安装包, https://github.com/alibaba/nacos/releases 从下载 nacos-server-$version.zip 安装包. 解压 ...

  2. 后端技术:SpringBoot配置热加载工具(devtools)笔记

    今天给大家介绍IDEA开发工具如何配置devtools热加载工具. 1.devtools原理介绍 spring-boot-devtools是spring为开发者提供的热加载工具包. 主要原理是使用了两 ...

  3. 关于在Intellij IDEA工具中配置热加载问题

    第一步,创建一个maven项目,然后在pom.xml文件中添加依赖(上图内容). 第二步:来到intellij idea主页面,点击File->Settings->Build->co ...

  4. 夜神模拟 配置 热加载

    1.修改dev  setting 修改本机IP:8081 修改为 代码更新 加载

  5. idea修改代码后没有重新编译_SpringBoot中实现代码修改之后的自动更新与热加载...

    在实际的开发过程中,我们经常修改代码之后,手动的重启项目,查看修改效果.那么有没有一种方式能够快速的.自动的帮我们将修改代码自动更新,避免手动重启,从而提高开发效率呢?是有的,对于这个功能很多人对功能 ...

  6. spring-boot-devtools热加载不起作用

    在开发过程中,希望修改时能够及时更新修改,即热加载,但是spring-boot-devtools不起作用.这主要是两个原因导致. 一.spring-boot-maven-plugin插件没有配置,如下 ...

  7. nginx reload热加载实现

    nginx reload热加载实现 1.向master进程发送HUP信号(reload 命令),master进程中的ngx_reconfigure设置1  2.master进程校验配置语法是否正确  ...

  8. springboot基于Elasticsearch6.x版本进行ES同义词、停用词(停止词)插件配置,远程词典热加载及数据库词典热加载总结,es停用词热更新,es同义词热更新

    前言:ES版本差异较大,建议跨版本的同学,可以先了解一下版本区别,建议不要跨版本使用插件或者进行项目调试. 本总结主要基于6.x版本的6.5.1(6.2.2实测可用),分词器为IK,下载地址:http ...

  9. 为什么 NGINX 的 reload 命令不是热加载?

    这段时间在 Reddit 看到一个讨论,为什么 NGINX 不支持热加载?乍看之下很反常识,作为世界第一大 Web 服务器,不支持热加载?难道大家都在使用的 nginx -s reload 命令都用错 ...

最新文章

  1. java多模块maven_Maven和Java多版本模块
  2. 08 | 替换策略: 缓存满了怎么办?
  3. Qt文档阅读笔记-Broadcast Receiver Example解析
  4. aix Mysql-Rpm puppet puppetAgent
  5. catia文本时怎么换行_【二次开发】CATIA二维图 环形文字工具
  6. 第七届蓝桥杯javaB组真题解析-抽签(第五题)
  7. 2020中国移动创客马拉松大赛移动云专题赛决赛成功举办
  8. 2012Google校园招聘笔试题
  9. 韩顺平_JAVA_视频教程_下载(打开迅雷,直接复制链接地址即可下载)
  10. 经济学中VCG机制介绍与机制设计(mechanism design)
  11. cvc 降噪_CVC降噪和DSP降噪有什么区别?
  12. 【PS】制作水彩画效果
  13. 目前人工智能应用领域比较多,主要包含哪些应用领域?
  14. 【笔试or面试】美团2014校园招聘
  15. 四、RocketMq本地集群搭建:多master-slaver异步
  16. 计算机程序设计论文2万字,【程序设计论文】核心素养下的计算机程序设计教学(共4049字)...
  17. 文储研习社第20期 | 关于对区块链培训的一些思考
  18. 4.案例 - NIO实现TCP通信
  19. 4K、2K、1080P、720P是什么? 4K电视机、拍照手机、录像机等设备的分辨率又是多少?
  20. mysql数据库 mdf 文件_如何连接到MDF数据库文件?

热门文章

  1. linux 防火墙开启1521端口,linux防火墙开放1521端口
  2. php不能加载oci8,无法加载动态库'oci8.so'(PHP 7.2)
  3. 加拿大留学商科好还是计算机科学好,去加拿大读商科专业就是要选择这些才最好!...
  4. 关系到了冰点_疫情下半场,如何修复跌至冰点的亲子关系,让自己和家人活出幸福感?...
  5. android原生组件,XUI: 一个简洁而优雅的Android原生UI框架,解放你的双手!
  6. 门限的限意思是什么_门限是什么意思_门限英文翻译
  7. is属性用法 vue_Vue中is属性的用法 可以动态切换组件
  8. ios模拟器装ipa包_在iOS开发的时候如何在模拟器中安装APP
  9. yolov3 数据预处理
  10. Leetcode 69 x的平方根 (每日一题 20210805)