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数组。
- typedef struct {
- int signo; // 信号值
- char *signame; // 信号值对应的字面名
- char *name; // nginx下的别名
- void (*handler)(int signo); // 信号处理函数
- } 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类型。代码如下:
- casengx_signal_value(NGX_RECONFIGURE_SIGNAL):
- ngx_reconfigure = 1;
- action = ", reconfiguring";
- break;
我们发现当前进程中的全局变量ngx_reconfigure被置成了1,这样在ngx_master_process_cycle的for循环中检测到ngx_reconfigure ==1,就开始做重加载配置的操作了。
后续的动作就很明显了。通过ngx_start_worker_processes开启新进程,而之前的进程则通过ngx_signal_worker_processes,来发送信号来“优雅”的关闭,所谓优雅的关闭,是指当前真正处理请求的进程会等到处理完之后再退出,同时当前的进程停止listen,不再accept新的请求了
nginx多进程模型之配置热加载---转的更多相关文章
- 如何用Python实现配置热加载?
背景 由于最近工作需求,需要在已有项目添加一个新功能,实现配置热加载的功能.所谓的配置热加载,也就是说当服务收到配置更新消息之后,我们不用重启服务就可以使用最新的配置去执行任务. 如何实现 下面我分别 ...
- Aspnetcore下面服务器热更新与配置热加载
原文:Aspnetcore下面服务器热更新与配置热加载 Asp.net的热更新方案Appdomain在aspnetcore中不被支持了 新的方案如下: 配置文件更新选项 reloadOnChange ...
- 在线配置热加载配置 go-kratos.dev 监听key
paladin https://v1.go-kratos.dev/#/config-paladin example Service(在线配置热加载配置) # service.go type Servi ...
- (译文)开始学习Webpack-应用TypeScript,配置热加载和Source Map
项目初始化:采用TypeScript 我们的版本是: $ node --version v8.5.0 $ npm --version 5.5.1 npm版本升级了,因为npm最近带来了新特性,本地会生 ...
- springboot idea 配置热加载
在idea 配置springboot的热加载,只需要三步: 第一步.引用jar包 <dependency> <groupId>org.springframework.boot& ...
- 关于在Intellij IDEA工具中配置热加载问题
第一步,创建一个maven项目,然后在pom.xml文件中添加依赖(上图内容). 第二步:来到intellij idea主页面,点击File->Settings->Build->co ...
- idea配置热加载
第一步:添加依赖 spring-boot项目中引入如下依赖 <dependency> <groupId>org.springframework.boot</groupId ...
- nginx热加载、热升级、回滚
修改完配置文件后使用 nginx -s reload 命令进行热加载 编译好新的 nginx 二进制文件后,运行nginx 开启nginx服务,然后使用 kill -USR2 新的nginx_mast ...
- SpringBoot入门笔记(三)、热加载
1.配置热加载环境,在pom.xml添加如下代码 <build> <!--springloader plugin --> <plugins> <plugin& ...
随机推荐
- bzoj3714: [PA2014]Kuglarz
[PA2014]KuglarzTime Limit: 20 Sec Memory Limit: 128 MBSubmit: 553 Solved: 317[Submit][Status][Discus ...
- mysql 全文查找fulltext
从 Mysql 4.0 开始就支持全文索引功能,但是 Mysql 默认的最小索引长度是 4.如果是英文默认值是比较合理的,但是中文绝大部分词都是2个字符,这就导致小于4个字的词都不能被索引,全文索引功 ...
- Unity3D Script Keynote
[Unity3D Script Keynote] 1.创建GameObject if(GUILayout.Button("创建立方体",GUILayout.Height(50))) ...
- TcxDBTreeList导出EXCEL
function ExportExcel(tree: TcxDBTreeList; const fileName: string = '1.xls'): Boolean;var sd: TSave ...
- C++ 类的静态成员详细讲解[转]
在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用.所以在所有对象中都可以共享它.使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节 ...
- Oracle主键自增的实现
create sequence seq_字段名_表名 minvalue 1 maxvalue 999999999999999999999999999 start with 1 increment by ...
- C#FTP下载文件出现远程服务器返回错误: (500) 语法错误,无法识别命令
如果下载多个文件的时候,有时候莫名其妙的出现500服务器错误,很有可能是没有设置KeepAlive 属性导致的. 出现应用程序未处理的异常:2015/1/6 11:40:56 异常类型:WebExce ...
- 【转】 Volley NegativeArraySizeException 解决
http://blog.csdn.net/very_caiing/article/details/46241531 今天在百度统计看项目上有一个crash比较高的bug: Java.lang.Nega ...
- until与till的用法归纳
until与till的用法归纳 崔荣斌 until和till两者都可作介词.连词,一般情况下可以互换使用.用于肯定句时,主句的动词只用延续性的,它所表示的动作一直延续到till或until表示的时间为 ...
- CSS规则整理
一. 善用css缩写规则 /*注意上.右.下.左的书写顺序*/1. 关于边距(4边):1px 2px 3px 4px (上.右.下.左)1px 2px 3px (省略的左等于右)1px 2px (省略 ...