>
nginx進(jìn)程結(jié)構(gòu)

linux 信號量管理機(jī)制
[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 | 當(dāng)子進(jìn)程掛掉的時候,父進(jìn)程會收到子進(jìn)程的SIGCHLD信號 |
| SIGQUIT | Kill -3 $PID | 和SIGINT類似, 但由QUIT字符(通常是Ctrl-/)來控制. 進(jìn)程在因收到SIGQUIT退出時會產(chǎn)生core文件, 在這個意義上類似于一個程序錯誤信號 |
| SIGTERM | kill -15 $PID | 程序結(jié)束(terminate)信號, 與SIGKILL不同的是該信號可以被阻塞和處理。(并不會立馬結(jié)束) |
| SIGKILL | Kill -9 $PID | 用來立即結(jié)束程序的運(yùn)行. 本信號不能被阻塞、處理和忽略。 |
| SIGHUP | Kill -1 $PID | 平滑重啟,重新加載配置文件 (平滑重啟,修改配置文件之后不用重啟服務(wù)器。 直接kill -PUT 進(jìn)程號即可) |
| SIGUSR1 | Kill -10 $PID | 留給用戶使用,重新讀取日志文件,在切割日志時用途較大 (停止寫入老日志文件,打開新日志文件,之所以這樣是因?yàn)槔先罩疚募退阈薷牡奈募?br />由于inode的原因,nginx還會一直往老的日志文件寫入數(shù)據(jù)) |
| SIGUSR2 | Kill -12 $PID | 留給用戶使用,平滑升級可執(zhí)行程序 ,nginx升級時候用 |
| SIGWINCH | Kill -28 $PID | 窗口大小改變時發(fā)出,平滑升級可執(zhí)行程序 ,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 配置文件重載的核心原理
- 語法檢查: 在進(jìn)行配置文件重載之前,Nginx 首先會檢查新的配置文件的語法和合法性。這是為了防止錯誤的配置導(dǎo)致服務(wù)器無法啟動或異常運(yùn)行。
- 備份舊配置: Nginx 會在進(jìn)行重載操作前,備份當(dāng)前正在使用的配置文件。這樣,在重載后如果出現(xiàn)問題,可以方便地回滾至舊的配置,確保系統(tǒng)的穩(wěn)定性。
- 加載新配置: 一旦新配置文件通過語法檢查,Nginx 會將新的配置加載到內(nèi)存中,但此時并不會立即應(yīng)用到服務(wù)器。
- 發(fā)送信號給舊進(jìn)程: Nginx 主進(jìn)程會發(fā)送一個信號給舊的 worker 進(jìn)程,要求它們完成未完成的請求并退出。這確保了舊的請求能夠平穩(wěn)地完成,同時不再接受新的請求。
- 啟動新 worker 進(jìn)程: 當(dāng)舊的 worker 進(jìn)程完成退出后,Nginx 會啟動新的 worker 進(jìn)程,新進(jìn)程將基于加載到內(nèi)存中的新配置運(yùn)行。
- 舊進(jìn)程退出: 在新的 worker 進(jìn)程準(zhǔn)備就緒后,舊的主進(jìn)程會退出,完成整個配置文件重載過程。

熱升級流程
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進(jìn)程發(fā)送USR2信號
kill -USR2 `cat /var/run/nginx.pid`
3、master進(jìn)程修改pid文件名,加后綴.oldbin(保存老pid文件)
ll /var/run/nginx.pid* # 會出現(xiàn)一個nginx.pid.oldbin
4、master進(jìn)程用新nginx文件啟動新master進(jìn)程。(目前為止有兩個master進(jìn)程)
ps -ef | grep nginx
5、向老master進(jìn)程發(fā)送WINCH信號,關(guān)閉老worker
kill -WINCH `cat /var/run/nginx.pid.oldbin`
6、回滾:向老master發(fā)送HUP,向新master發(fā)送QUIT。
kill -HUP `cat /var/run/nginx.pid.oldbin` # 使用HUP重新加載配置文件,使用新的配置,并逐步關(guān)閉舊進(jìn)程
kill -QUIT `cat /var/run/nginx.pid.oldbin` # 等待請求處理結(jié)束后再退出
>






