nginx进程结构
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升级时候用 |
[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 配置文件重载的核心原理
- 语法检查: 在进行配置文件重载之前,Nginx 首先会检查新的配置文件的语法和合法性。这是为了防止错误的配置导致服务器无法启动或异常运行。
- 备份旧配置: Nginx 会在进行重载操作前,备份当前正在使用的配置文件。这样,在重载后如果出现问题,可以方便地回滚至旧的配置,确保系统的稳定性。
- 加载新配置: 一旦新配置文件通过语法检查,Nginx 会将新的配置加载到内存中,但此时并不会立即应用到服务器。
- 发送信号给旧进程: Nginx 主进程会发送一个信号给旧的 worker 进程,要求它们完成未完成的请求并退出。这确保了旧的请求能够平稳地完成,同时不再接受新的请求。
- 启动新 worker 进程: 当旧的 worker 进程完成退出后,Nginx 会启动新的 worker 进程,新进程将基于加载到内存中的新配置运行。
- 旧进程退出: 在新的 worker 进程准备就绪后,旧的主进程会退出,完成整个配置文件重载过程。
热升级流程
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` # 等待请求处理结束后再退出