nginx 进程结构图:
nginx 实际上是一个父进程 下开启多个子进程(之所以不采用多线程模式,因为线程共享同一个地址空间, 当第三方模块引发地址空间段错误,地址越界,会导致进程nginx 挂掉, 违反高可靠性).
- 父进程master 只做控制器,做子进程 worker 的管理. 不做其他功能(减少挂掉可能性)
- 子进程woker是实际处理请求的程序, worker 要与系统cpu核数一致, 并且与cpu绑定,以方便更好的使用cpu缓存, 减少缓存失效的命中率.
- master 进程内还有cache 缓存空间, 用来缓存反向代理请求, 由子进程 cache loader 载入cache manager 管理.
- 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 不会关闭(保证可以回滚).
回滚: 回滚原理与热升级原理基本相同.