(如下学习笔记内容均摘自参考连接,仅供我的查阅)html
1、inotify文件系统监控特性linux
Inotify 是一个 Linux 内核特性,它监控文件系统,而且及时向专门的应用程序发出相关的事件警告,好比删除、读、写和卸载操做等。inotify是Linux内核提供的一个文件系统变化通知机制,从2.6.13版本的内核开始提供,好比你在建立一个文件时它能够通知你哪一个文件被建立了,删除文件时通知你哪一个文件被删除了,修改文件时通知你哪一个文件被修改了,关闭文件时哪一个文件被关闭了,是可写关闭仍是不可写关闭等等。nginx
2、Nginx配置热更新git
NginX采用Master/Worker的多进程模型,Master进程负责整个NginX进程的管理。主要包括:热更新、停机、日志重启等。github
NginX的配置修改以后,在不影响当前服务的状况下进行更新。docker
信号: HUP后端
过程: 分为Master部分和Worker部分。服务器
Matser进程:app
1> 经过ngx_signal_hanlder解析出获取的信号,置ngx_reconfigure=1,标识Master要进行配置热更新操做。负载均衡
2> 调用ngx_init_cycle初始化新的cycle(从新加载nginx.conf以及各模块的初始化)。
3> 调用ngx_start_worker_process启动新的Worker子进程,子进程标识just_respwan=1(NGX_PROCESS_JUST_RESPAWN)表示刚启动,区分新旧进程。
4> 调用ngx_start_cache_manager启动新的cache manager子进程和cache loader子进程。子进程标识just_respawn=1(NGX_PROCESS_JUST_RESPAWN)表示刚启动,区分新旧进程。
5> 睡眠100毫秒以后,调用ngx_signal_worker_process优雅的关闭老的worker、cache manager和cache loader进程。注意:只向just_respawn=0的进程进行发送信号。
Worker进程:
1> 经过ngx_signal_handler解析出为QUIT信号,置ngx_quit=1
2> 调用ngx_close_listening_sockets关闭监听端口。设置ngx_exting=1
3> 若是定时器红黑树中为空,执行ngx_worker_process_exit退出。
3. Nginx可执行程序热更新
Nginx可执行程序升级后,在不影响当前服务的状况下进行更新。
步骤1:信号:USR2
过程:
Master进程:
1> 经过ngx_signal_handler解析获取信号,置ngx_change_binary=1。
2> 调用ngx_new_binary=ngx_exec_new_binary 函数启动新的binary的NginX。(期间:须要进行老的环境变量的拷贝、socket句柄的传递、pid文件的拷贝等)。
此时,系统中同时存在两个Nginx(新、老)同时提供服务。
Woker进程:
无操做
步骤2:信号:WINCH
过程:
Master进程:
1> 经过ngx_signal_handler解析获取信号,置ngx_noaccept=1。
2> 置ngx_noaccepting=1,调用ngx_signal_worker_processes向子进程发送QUIT信号。即Worker进程优雅的退出。
若是此时没啥问题就能够直接关闭老的NginX Master进程了。(若是有问题,还有相似过程的回滚操做...)
3、Nginx可执行程序热更新流程步骤
步骤一、升级nginx二进制文件,须要先将新的nginx可执行文件替换原有旧的nginx文件,而后给nginx master进程发送USR2信号,告知其开始升级可执行文件;nginx master进程会将老的pid文件增长.oldbin后缀,而后拉起新的master和worker进程,并写入新的master进程的pid。
步骤二、在此以后,全部工做进程(包括旧进程和新进程)将会继续接受请求。这时候,须要发送WINCH信号给nginx master进程,master进程将会向worker进程发送消息,告知其须要进行graceful shutdown,worker进程会在链接处理完以后进行退出。
步骤三、通过一段时间以后,将会只会有新的worker进程处理新的链接。
注意,旧master进程并不会关闭它的listen socket;由于若是出问题后,须要回滚,master进程须要法从新启动它的worker进程。
步骤四、若是升级成功,则能够向旧master进程发送QUIT信号,中止老的master进程;若是新的master进程(意外)退出,那么旧master进程将会去掉本身的pid文件的.oldbin后缀。
nginx热更新相关信号
master进程相关信号
USR2 升级可执行文件
WINCH 优雅中止worker进程
QUIT 优雅中止master进程
worker进程相关信号
TERM, INT 快速退出进程
QUIT 优雅中止进程
什么是graceful shutdown
本文中的graceful shutdown是指server再也不处理新的链接,可是进程不会当即退出,待全部链接断开后再退出进程。
总结一下在nginx 二进制文件热升级时用的命令
cd /usr/local/nginx
cp nginx nginx_bak
mv /data/nginx/nginx ./nginx #须要使用mv来更新二进制文件
./nginx -t #尝试启动,查看其加载配置文件等初始化功能是否正常
netstat -anp | grep -E "80|443" | grep nginx #检查链接状态
kill -USR2 `cat /usr/local/nginx/nginx.pid` #升级nginx可执行文件,此时会有两组nginx master和worker进程
kill -WINCH `cat /usr/local/nginx/nginx.pid.oldbin` #新的可执行文件启动ok,且可以正常处理数据流,告知老的master进程去通知其worker进程进行优雅退出
...
kill -QUIT `cat /usr/local/nginx/nginx.pid.oldbin` #待全部的老的nginx worker进程优雅退出后(处理完链接),中止老的master进程
TODO:nginx还会有依赖的so文件的热升级–其实更应该属于后台进程的so文件热升级流程,我在使用它的时候也踩过坑–主要缘由仍是操做不规范,对so其加载运行原理不够熟悉致使
热升级
实际上,静态语言后端server有一套固定的热升级(单进程)流程,其基本流程以下:
若须要支持热升级的是多进程,那么nginx的热升级过程是最值得参考的
一、经过调用 fork/exec 启动新的版本的进程,
二、子进程调用接口获取从父进程继承的 socket 文件描述符从新监听 socket
三、在此过程当中,不会对用户请求形成任何中断。
nginx的热升级流程也是相似,只不过因为nginx工做是多进程,故它会先启动新版本的一组master/worker进程;而后中止老的worker进程,让其不处理链接,由新的worker进程来处理链接;升级完毕后,便可退出老的master进程,热升级完成。
4、Nginx upstream中 backup备份服务器的做用
Nginx 的 upstream 配置的时候,能够配置备份服务器 backup。
upstream backend {
server 192.168.198.128:8080 weight=1;
server 192.168.198.128:8090 weight=4;
server 192.168.198.128:8091 backup;
}
backup : marks the server as a backup server. It will be passed requests when the primary servers are unavailable.(标记为备用服务器。当主服务器不可用之后,请求会被传给这些服务器。)
这意思就是,只有当你的服务器挂掉的时候才会使用备份服务器,正常状况下不会访问到备份服务器。
在全部正常服务器都挂掉时,系统依然高可用,这就是备份服务器的用处!
5、《Kubernetes集群中的Nginx配置热更新方案》原理:
Nginx自身是支持配置热更新的,经过nginx -s reload命令能够实现这一点。咱们要实现的就是:当Kubernetes集群中的Service发生变化时,好比新建立一个Service或删除了一个Service,这些Service在Nginx反向代理中的路由配置须要同步更新并生效。所以,这个过程的场景大体以下:
5.1管理员经过命令或程序经过API操做K8s集群建立或删除Service;
5.2监听API Server Event的某个程序获取该Event,并从API Server读取最新Service数据,从新生成/etc/nginx/conf.d/default.conf;
5.3 /etc/nginx/conf.d/default.conf文件的变更触发文件变动事件,监听该事件的脚本调用“nginx -s reload”命令实现Nginx的配置热更新。
6、Nginx Proxy
nginx-proxy sets up a container running nginx and docker-gen. docker-gen generates reverse proxy configs for nginx and reloads nginx when containers are started and stopped.
See Automated Nginx Reverse Proxy for Docker for why you might want to use this.
Usage
To run it:
$ docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy
Then start any containers you want proxied with an env var VIRTUAL_HOST=subdomain.youdomain.com
$ docker run -e VIRTUAL_HOST=foo.bar.com ...
参考连接:
inotify
https://baike.baidu.com/item/inotify/8361039
inotify -- Linux 2.6 内核中的文件系统变化通知机制(2005年)
https://www.ibm.com/developerworks/cn/linux/l-inotifynew/
inotify-tools命令使用讲解(安装及监控例子)
https://www.cnblogs.com/wajika/p/6396748.html
Nginx中文文档
http://nginx.org/en/docs/http/ngx_http_upstream_module.html
http://tengine.taobao.org/nginx_docs/cn/docs/
http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_core_module.html#server
http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_upstream_module.html
http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_proxy_module.html
http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_index_module.html
http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_access_module.html
http://tengine.taobao.org/nginx_docs/cn/docs/control.html
NginX进程管理-热更新
https://blog.csdn.net/huzelin1008/article/details/43193991
nginx-proxy
https://github.com/jwilder/nginx-proxy
http://jasonwilder.com/blog/2014/03/25/automated-nginx-reverse-proxy-for-docker/
Kubernetes集群中的Nginx配置热更新方案
https://tonybai.com/2016/11/17/nginx-config-hot-reloading-approach-for-kubernetes-cluster/
利用 Nginx 负载均衡实现 Web 服务器更新不影响访问
https://blog.csdn.net/liyongshun82/article/details/52787115
从nginx热更新聊一聊Golang中的热更新(上)
https://blog.csdn.net/qq_15437667/article/details/83513457
nginx多进程模型之配置热加载
https://blog.csdn.net/brainkick/article/details/7176405
HAProxy文档
https://cbonte.github.io/haproxy-dconv/1.8/intro.html
HAProxy用法详解 全网最详细中文文档
http://www.ttlsa.com/linux/haproxy-study-tutorial/
https://www.cnblogs.com/puremans/p/6428644.html