您的位置:首页 > 运维架构 > Nginx

nginx 进程结构和高可用,热重载,热升级原理

2019-05-11 10:24 531 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/weixin_44093297/article/details/90085038

nginx 进程结构图:
nginx 实际上是一个父进程 下开启多个子进程(之所以不采用多线程模式,因为线程共享同一个地址空间, 当第三方模块引发地址空间段错误,地址越界,会导致进程nginx 挂掉, 违反高可靠性).

  1. 父进程master 只做控制器,做子进程 worker 的管理. 不做其他功能(减少挂掉可能性)
  2. 子进程woker是实际处理请求的程序, worker 要与系统cpu核数一致, 并且与cpu绑定,以方便更好的使用cpu缓存, 减少缓存失效的命中率.
  3. master 进程内还有cache 缓存空间, 用来缓存反向代理请求, 由子进程 cache loader 载入cache manager 管理.
  4. master 进程内的共享内存, 用来做子进程之间的通信

nginx 高可用的真相:
实际上nginx 的高可用完全依靠master ; nginx 对 worker 的控制是通过获取CHLD信号来达成的. worker 挂掉的同时,会给 master 父进程发送一个 CHLD 信号, master 收到这个信号就会立即新启动一个新 worker 进程来替代挂掉的 worker 进程, 所以要保持 master 功能的简洁 .

热重载原理
执行 nginx -s reload , 实际上先新开启相同数量的 worker 子进程来替代 原来的worker 进程, 但是不是马上关闭老 worker 进程, 只是把老 worker 进程接受请求的通道切换给新 worker , 在老 worker 处理完原已经接受的所有请求后, 再关闭 worker . 这样就很平滑的过度给了新 worker .

热升级和回滚
热升级: 执行 kill -USR2 要升级的 nginx master 进程ID , 这个时候系统首先会去修改老pid文件 , 加后缀 .oldbin, 接着利用新nginx新启动一个新的 master , 并向老 master 发送 QUIT 信号, 此时请求通道从老 master 切换对接新 master , 老 master 不再接受任何 请求 , 等到老 master 内请求处理完毕之后, 关闭所有老 master 中的所有子程序. 但是老 master 不会关闭(保证可以回滚).
回滚: 回滚原理与热升级原理基本相同.

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: