>
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` # 等待請求處理結束后再退出
>