跳转至

4. nginx的日志进程结构及热升级

nginx的进程结构

hello

通过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
- nginx是多进程结构,多进程结构设计是为了保证nginx的高可用高可靠,包含:

  • master进程:也是父进程,负责worker进程的管理。

  • worker进程:也是子进程,worker进程一般配置成与服务器的CPU核数相同,worker进程用来处理具体的请求的。

  • cache进程:也是子进程,包括cache manager和cache loader进程,主要是反向代理时做缓存使用。

  • 各进程之间是共享内存的,使用信号控制

  • worker进程设置数量为与服务器的cpu核数一致,由于nginx是事件驱动模型,这样设置能够够好的利用cpu

使用信号管理Nginx的父子进程

发送信号命令:kill HUP pid

常见的一些信号发送命令以及对应关系 cmd

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进程关闭监听句柄,处理完当前链接后结束进程