4. nginx的日志进程结构及热升级
nginx的进程结构¶
通过ps –ef | grep nginx可以看到共有2个进程,一个master进程,一个worker进程。
[root@localhost ~]# ps -ef|grep nginx|grep -v grep root 1562 1 0 21:43 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx nginx 1563 1562 0 21:43 ? 00:00:00 nginx: worker process
-
master进程:也是父进程,负责worker进程的管理。
-
worker进程:也是子进程,worker进程一般配置成与服务器的CPU核数相同,worker进程用来处理具体的请求的。
-
cache进程:也是子进程,包括cache manager和cache loader进程,主要是反向代理时做缓存使用。
-
各进程之间是共享内存的,使用信号控制
-
worker进程设置数量为与服务器的cpu核数一致,由于nginx是事件驱动模型,这样设置能够够好的利用cpu
使用信号管理Nginx的父子进程¶
发送信号命令:kill HUP pid
常见的一些信号发送命令以及对应关系
nginx的热升级流程¶
1 将旧的nginx文件换成新的nginx文件
2 向master进程发送USR2信号
3 master进程修改pid文件名,加后缀.oldbin
4 master进程用新nginx文件启动新的master进程
5 向老master进程发送WINCH信号,关闭老的worker
6 回滚;向老的master发送HUP,向新的master发送QUIT
具体步骤如下
1 查看当前版本 [root@localhost sbin]# ./nginx -V nginx version: nginx/1.14.2 2 下载最新版本并且解压编译安装得到二进制启动文件nginx 3 备份老的nginx二进制文件 cp nginx nginx.old 4 使用最新版本编译好的ngin二进制文件去替换老的nginx二进制文件 [root@localhost sbin]# ./nginx -v nginx version: nginx/1.18.0 [root@localhost sbin]# cp -r nginx /usr/local/nginx/sbin/ -f 5 给老的master进程发信号,新的master会启动 [root@localhost sbin]# ps -ef|grep nginx root 3141 1 0 19:38 ? 00:00:00 nginx: master process ./nginx nobody 3142 3141 0 19:38 ? 00:00:00 nginx: worker process nobody 3143 3141 0 19:38 ? 00:00:00 nginx: worker process root 3590 3115 0 20:31 pts/2 00:00:00 vim nginx_process.md root 6388 3748 0 20:44 pts/4 00:00:00 grep nginx [root@localhost sbin]# kill -USR2 3141 [root@localhost sbin]# ps -ef|grep nginx root 3141 1 0 19:38 ? 00:00:00 nginx: master process ./nginx nobody 3142 3141 0 19:38 ? 00:00:00 nginx: worker process nobody 3143 3141 0 19:38 ? 00:00:00 nginx: worker process root 3590 3115 0 20:31 pts/2 00:00:00 vim nginx_process.md root 6393 3141 0 20:45 ? 00:00:00 nginx: master process ./nginx nobody 6394 6393 0 20:45 ? 00:00:00 nginx: worker process root 6396 3748 0 20:45 pts/4 00:00:00 grep nginx 6 现在情况是新老master并存但是老的master以及worker目前已经不接受请求了 发送信号优雅关闭老的woker进程 kill -WINCH 3141 [root@localhost sbin]# ps -ef|grep nginx root 3141 1 0 19:38 ? 00:00:00 nginx: master process ./nginx root 3590 3115 0 20:31 pts/2 00:00:00 vim nginx_process.md root 6393 3141 0 20:45 ? 00:00:00 nginx: master process ./nginx nobody 6394 6393 0 20:45 ? 00:00:00 nginx: worker process root 6418 3748 0 20:49 pts/4 00:00:00 grep nginx 7现在发现老的worker进程没了,但是老的master进程还在,老的master进程自己不会死掉,保留是为了回滚使用 回滚 [root@localhost sbin]# kill -HUP 3141 [root@localhost sbin]# kill -QUIT 6393 [root@localhost sbin]# ps -ef|grep nginx root 3141 1 0 19:38 ? 00:00:00 nginx: master process ./nginx root 3590 3115 0 20:31 pts/2 00:00:00 vim nginx_process.md nobody 6427 3141 0 20:51 ? 00:00:00 nginx: worker process nobody 6428 3141 0 20:51 ? 00:00:00 nginx: worker process root 6434 3748 0 20:52 pts/4 00:00:00 grep nginx 8 回滚成功 9将老的二进制文件nginx改回来
reload重载配置文件流程¶
-
master进程发送HUP信号(relaod)
-
master进程校验配置语法是否正确
-
master进程打开新的监听端口
-
master进程用新的配置文件启动新的worker进程
-
master进程向老的worker进程发送QUIT信号
-
老的worker进程关闭监听句柄,处理完当前链接后结束进程