博客园不常在线

有问题联系微信

微信号

微信公众号

Nginx系列:详解进程结构和热部署

nginx进程结构

image

linux 信号量管理机制

[root@VM-8-17-centos nginx]# kill -l 
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

常用信号量

代码 编号 备注
SIGCHLD Kill -17 $PID 当子进程挂掉的时候,父进程会收到子进程的SIGCHLD信号
SIGQUIT Kill -3 $PID 和SIGINT类似, 但由QUIT字符(通常是Ctrl-/)来控制.
进程在因收到SIGQUIT退出时会产生core文件, 在这个意义上类似于一个程序错误信号
SIGTERM kill -15 $PID 程序结束(terminate)信号, 与SIGKILL不同的是该信号可以被阻塞和处理。(并不会立马结束)
SIGKILL Kill -9 $PID 用来立即结束程序的运行. 本信号不能被阻塞、处理和忽略。
SIGHUP Kill -1 $PID 平滑重启,重新加载配置文件 (平滑重启,修改配置文件之后不用重启服务器。
直接kill -PUT 进程号即可)
SIGUSR1 Kill -10 $PID 留给用户使用,重新读取日志文件,在切割日志时用途较大
(停止写入老日志文件,打开新日志文件,之所以这样是因为老日志文件就算修改的文件名,
由于inode的原因,nginx还会一直往老的日志文件写入数据)
SIGUSR2 Kill -12 $PID 留给用户使用,平滑升级可执行程序 ,nginx升级时候用
SIGWINCH Kill -28 $PID 窗口大小改变时发出,平滑升级可执行程序 ,nginx升级时候用

image

[root->mcode-server->~]# ps -ef  | grep nginx 
root      8225     1  0 21:58 ?        00:00:00 nginx: master process /usr/sbin/nginx
nginx     8226  8225  0 21:58 ?        00:00:00 nginx: worker process
nginx     8227  8225  0 21:58 ?        00:00:00 nginx: worker process
root      8503  7810  0 22:08 pts/0    00:00:00 grep --color=auto nginx
[root->mcode-server->~]# kill -15 8225
[root->mcode-server->~]# ps -ef  | grep nginx 
root      8509  7810  0 22:08 pts/0    00:00:00 grep --color=auto nginx
[root->mcode-server->~]# ps -ef  | grep nginx 
root      8561     1  0 22:09 ?        00:00:00 nginx: master process /usr/sbin/nginx
nginx     8563  8561  0 22:09 ?        00:00:00 nginx: worker process
nginx     8573  8561  0 22:10 ?        00:00:00 nginx: worker process
root      8621  7810  0 22:11 pts/0    00:00:00 grep --color=auto nginx
[root->mcode-server->~]# kill -s SIGTERM 8561
[root->mcode-server->~]# ps -ef  | grep nginx 
root      8784  7810  0 22:17 pts/0    00:00:00 grep --color=auto nginx
[root->mcode-server->~]# systemctl  start nginx 
[root->mcode-server->~]# ps -ef  | grep nginx 
root      8801     1  0 22:17 ?        00:00:00 nginx: master process /usr/sbin/nginx
nginx     8802  8801  0 22:17 ?        00:00:00 nginx: worker process
nginx     8803  8801  0 22:17 ?        00:00:00 nginx: worker process
root      8805  7810  0 22:17 pts/0    00:00:00 grep --color=auto nginx
[root->mcode-server->~]# kill -s SIGHUP 8801
[root->mcode-server->~]# ps -ef  | grep nginx 
root      8801     1  0 22:17 ?        00:00:00 nginx: master process /usr/sbin/nginx
nginx     8810  8801  0 22:18 ?        00:00:00 nginx: worker process
nginx     8811  8801  0 22:18 ?        00:00:00 nginx: worker process
root      8813  7810  0 22:18 pts/0    00:00:00 grep --color=auto nginx
[root->mcode-server->~]# nginx -s reload 
[root->mcode-server->~]# ps -ef  | grep nginx 
root      8801     1  0 22:17 ?        00:00:00 nginx: master process /usr/sbin/nginx
nginx     8900  8801  0 22:21 ?        00:00:00 nginx: worker process
nginx     8901  8801  0 22:21 ?        00:00:00 nginx: worker process
root      8903  7810  0 22:21 pts/0    00:00:00 grep --color=auto nginx

Nginx 配置文件重载的核心原理

  1. 语法检查: 在进行配置文件重载之前,Nginx 首先会检查新的配置文件的语法和合法性。这是为了防止错误的配置导致服务器无法启动或异常运行。
  2. 备份旧配置: Nginx 会在进行重载操作前,备份当前正在使用的配置文件。这样,在重载后如果出现问题,可以方便地回滚至旧的配置,确保系统的稳定性。
  3. 加载新配置: 一旦新配置文件通过语法检查,Nginx 会将新的配置加载到内存中,但此时并不会立即应用到服务器。
  4. 发送信号给旧进程: Nginx 主进程会发送一个信号给旧的 worker 进程,要求它们完成未完成的请求并退出。这确保了旧的请求能够平稳地完成,同时不再接受新的请求。
  5. 启动新 worker 进程: 当旧的 worker 进程完成退出后,Nginx 会启动新的 worker 进程,新进程将基于加载到内存中的新配置运行。
  6. 旧进程退出: 在新的 worker 进程准备就绪后,旧的主进程会退出,完成整个配置文件重载过程。

image

热升级流程

1、将旧nginx文件替换成新nginx文件

mv /server/application/nginx/sbin/nginx /server/application/nginx/sbin/nginx_$(date +%F)
cp /server/download/nginx-1.25.2/objs/nginx /server/application/nginx/sbin/

2、向老master进程发送USR2信号

kill -USR2 `cat /var/run/nginx.pid`

3、master进程修改pid文件名,加后缀.oldbin(保存老pid文件)

ll /var/run/nginx.pid* # 会出现一个nginx.pid.oldbin

4、master进程用新nginx文件启动新master进程。(目前为止有两个master进程)

ps -ef  | grep nginx 

5、向老master进程发送WINCH信号,关闭老worker

 kill -WINCH `cat /var/run/nginx.pid.oldbin`

6、回滚:向老master发送HUP,向新master发送QUIT。

kill -HUP `cat /var/run/nginx.pid.oldbin` # 使用HUP重新加载配置文件,使用新的配置,并逐步关闭旧进程
kill -QUIT `cat /var/run/nginx.pid.oldbin` # 等待请求处理结束后再退出
posted @ 2023-07-27 20:59  Code技术分享  阅读(9)  评论(0编辑  收藏  举报