Nginx部署
- 分布式篇 - Nginx安裝與運行
跟著上面這篇博客進行操作即可,關閉防火墻,讓本地可以通過瀏覽器訪問Nginx服務,
[root@localhost ~]# systemctl stop firewalld

信號量
查看信號量:
[root@localhost ~]# 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
有64種信號量,以下是幾種常用的信號量:
SIGINT、SIGTERM:快速關閉,SIGQUIT:從容關閉(優雅的關閉行程,即等請求結束后再關閉),SIGHUP:平滑重啟,重新加載組態檔 (平滑重啟,修改組態檔之后不用重啟服務器),SIGUSR1:重新讀取日志檔案,在切割日志檔案時用途較大,SIGUSR2:平滑升級可執行程式 ,nginx升級時候用,SIGWINCH:從容關閉作業行程,
Nginx熱部署
Nginx是一個多行程的高性能反向代理服務器,包含一個master行程和多個worker行程(worker行程的數量可以通過nginx.conf組態檔中的worker_processes引數進行設定,默認1個),這樣可以充分利用多核處理器,

默認1個worker行程,

并且master行程和worker行程是父子行程關系,

Nginx作業模式為多行程,Nginx在啟動之后會有一個master行程和多個worker行程(默認1個),多個worker子行程將監聽master父行程監聽的埠(參考父子行程的關系),并行處理請求,master父行程主要用來管理worker子行程(管理真正提供服務的worker行程,向worker行程發送信號,監控worker進程的運行狀態,當worker行程例外退出后,會重新啟動新的worker行程),讀取并驗證配置資訊,master行程不會對用戶請求提供服務,而用戶請求是由worker行程進行處理,
Nginx是通過信號量來控制,比如停止和重啟Nginx,信號量是行程間通信的一種機制,master主行程控制多個worker子行程,也是通過信號量,

現在來演示Nginx是怎么實作熱部署的,博主通過修改Nginx的組態檔來模擬Nginx的升級(先copy一份副本),
[root@localhost ~]# cd /usr/local/nginx/conf/
[root@localhost conf]# ll
總用量 68
-rw-r--r--. 1 root root 1077 12月 20 20:24 fastcgi.conf
-rw-r--r--. 1 root root 1077 12月 20 20:24 fastcgi.conf.default
-rw-r--r--. 1 root root 1007 12月 20 20:24 fastcgi_params
-rw-r--r--. 1 root root 1007 12月 20 20:24 fastcgi_params.default
-rw-r--r--. 1 root root 2837 12月 20 20:24 koi-utf
-rw-r--r--. 1 root root 2223 12月 20 20:24 koi-win
-rw-r--r--. 1 root root 5231 12月 20 20:24 mime.types
-rw-r--r--. 1 root root 5231 12月 20 20:24 mime.types.default
-rw-r--r--. 1 root root 2656 12月 20 21:26 nginx.conf
-rw-r--r--. 1 root root 2656 12月 20 20:24 nginx.conf.default
-rw-r--r--. 1 root root 636 12月 20 20:24 scgi_params
-rw-r--r--. 1 root root 636 12月 20 20:24 scgi_params.default
-rw-r--r--. 1 root root 664 12月 20 20:24 uwsgi_params
-rw-r--r--. 1 root root 664 12月 20 20:24 uwsgi_params.default
-rw-r--r--. 1 root root 3610 12月 20 20:24 win-utf
[root@localhost conf]# cp nginx.conf nginx_old.conf
[root@localhost conf]# vim nginx.conf

由于還沒有給Nginx進行熱部署,現在訪問http://192.168.1.199/還是原來的Nginx頁面,

查看Nginx的行程:
[root@localhost conf]# ps -ef | grep nginx
root 14964 1 0 22:25 ? 00:00:00 nginx: master process ./nginx
nobody 14965 14964 0 22:25 ? 00:00:00 nginx: worker process
root 15016 1521 0 23:07 pts/0 00:00:00 grep --color=auto nginx
給master行程發送SIGUSR2信號,讓Nginx平滑升級可執行程式,可以看到Nginx重新啟動了一組master行程和worker行程,而新master行程是舊master行程的子行程(通過父子行程的繼承關系,新master行程可以很方便地繼承舊master行程的相關資源),
[root@localhost conf]# kill -s SIGUSR2 14964
[root@localhost conf]# ps -ef | grep nginx
root 14964 1 0 22:25 ? 00:00:00 nginx: master process ./nginx
nobody 14965 14964 0 22:25 ? 00:00:00 nginx: worker process
root 15019 14964 0 23:18 ? 00:00:00 nginx: master process ./nginx
nobody 15020 15019 0 23:18 ? 00:00:00 nginx: worker process
root 15022 1521 0 23:19 pts/0 00:00:00 grep --color=auto nginx
并且Nginx在日志目錄中存盤了新舊pid檔案(保存了新舊master行程的ID),
[root@localhost conf]# ll ../logs
總用量 16
-rw-r--r--. 1 root root 2729 12月 20 23:20 access.log
-rw-r--r--. 1 root root 708 12月 20 23:18 error.log
-rw-r--r--. 1 root root 6 12月 20 23:18 nginx.pid
-rw-r--r--. 1 root root 6 12月 20 22:25 nginx.pid.oldbin
[root@localhost conf]# cat ../logs/nginx.pid
15019
[root@localhost conf]# cat ../logs/nginx.pid.oldbin
14964
給舊master行程發送SIGWINCH信號,讓舊master行程關閉舊worker行程,
[root@localhost conf]# kill -s SIGWINCH 14964
[root@localhost conf]# ps -ef | grep nginx
root 14964 1 0 22:25 ? 00:00:00 nginx: master process ./nginx
root 15019 14964 0 23:18 ? 00:00:00 nginx: master process ./nginx
nobody 15020 15019 0 23:18 ? 00:00:00 nginx: worker process
root 15030 1521 0 23:27 pts/0 00:00:00 grep --color=auto nginx
現在訪問http://192.168.1.199/,會回應404,

而訪問http://192.168.1.199/nacos,會訪問到Nacos服務,

如果升級版本沒有問題,就可以給舊master行程發送SIGQUIT信號,讓舊master行程關閉,這樣就只剩下新master行程和新worker行程,實作了Nginx的熱部署,
[root@localhost conf]# kill -s SIGQUIT 14964
[root@localhost conf]# ps -ef | grep nginx
root 15019 1 0 23:18 ? 00:00:00 nginx: master process ./nginx
nobody 15020 15019 0 23:18 ? 00:00:00 nginx: worker process
root 15034 1521 0 23:31 pts/0 00:00:00 grep --color=auto nginx
如果升級版本有問題,需要回滾到之前的版本,就可以給舊master行程發送SIGHUP信號,因為博主重新進行了測驗,所以行程號都變了,但很顯然舊master行程重新創建了舊worker行程,并且進行版本升級的master和worker行程沒有被關閉,
[root@localhost conf]# kill -s SIGHUP 15084
[root@localhost conf]# ps -ef | grep nginx
root 15084 1 0 12月20 ? 00:00:00 nginx: master process ./nginx
root 15106 15084 0 12月20 ? 00:00:00 nginx: master process ./nginx
nobody 15107 15106 0 12月20 ? 00:00:00 nginx: worker process
nobody 15131 15084 0 00:02 ? 00:00:00 nginx: worker process
root 15141 1521 0 00:09 pts/0 00:00:00 grep --color=auto nginx
給新master行程發送SIGQUIT信號,讓新master行程關閉,這樣就只剩下舊master行程和新創建的舊worker行程,實作了回滾,
[root@localhost conf]# kill -s SIGQUIT 15106
[root@localhost conf]# ps -ef | grep nginx
root 15084 1 0 12月20 ? 00:00:00 nginx: master process ./nginx
nobody 15131 15084 0 00:02 ? 00:00:00 nginx: worker process
root 15159 1521 0 00:25 pts/0 00:00:00 grep --color=auto nginx
回滾成功,

還需要對版本回滾(即博主這里的組態檔回滾,不然下次重啟就會出問題),
[root@localhost conf]# cp -f nginx_old.conf nginx.conf
cp:是否覆寫"nginx.conf"? y
為什么給舊master行程發送SIGHUP信號,舊master行程重新創建的worker行程沒有重新讀取組態檔?下面是官方的說明:
Send the HUP signal to the old master process. The old master process will start new worker processes without re-reading the configuration. After that, all new processes can be shut down gracefully, by sending the QUIT signal to the new master process.
向舊
master行程發送SIGHUP信號,舊master行程將啟動新worker行程,而無需重新讀取配置,之后,通過向新master行程發送SIGQUIT信號,所有新行程都可以正常關閉,
如果不存在新行程的情況下(只有一組master、worker行程),修改組態檔,再向master行程發送SIGHUP信號,看是否會重新加載組態檔,

[root@localhost conf]# kill -s SIGHUP 15084
很顯然組態檔被重新加載了,由于博主還沒有看原始碼,只能猜測Nginx的實作(如果說錯了,請大家評論補充),Nginx應該是根據當前是否在進行熱部署(存在新master行程),來決定SIGHUP信號是否需要重新加載組態檔,

Nginx熱部署就介紹到這里,如果博主有說錯的地方或者大家有不同的見解,歡迎大家評論補充,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/389023.html
標籤:其他
上一篇:行程與執行緒
下一篇:Java學習路線
