溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Nginx熱部署如何實現(xiàn)

發(fā)布時間:2022-03-03 14:54:49 來源:億速云 閱讀:207 作者:小新 欄目:開發(fā)技術(shù)

小編給大家分享一下Nginx熱部署如何實現(xiàn),相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

關(guān)閉防火墻,讓本地可以通過瀏覽器訪問Nginx服務。

[root@localhost ~]# systemctl stop firewalld

Nginx熱部署如何實現(xiàn)

信號量

查看信號量:

[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:快速關(guān)閉。

  • SIGQUIT:從容關(guān)閉(優(yōu)雅的關(guān)閉進程,即等請求結(jié)束后再關(guān)閉)。

  • SIGHUP:平滑重啟,重新加載配置文件 (平滑重啟,修改配置文件之后不用重啟服務器)。

  • SIGUSR1 :重新讀取日志文件,在切割日志文件時用途較大。

  • SIGUSR2:平滑升級可執(zhí)行程序 ,nginx升級時候用。

  • SIGWINCH :從容關(guān)閉工作進程。

Nginx熱部署

Nginx是一個多進程的高性能反向代理服務器,包含一個master進程和多個worker進程(worker進程的數(shù)量可以通過nginx.conf配置文件中的worker_processes參數(shù)進行設置,默認1個),這樣可以充分利用多核處理器。

Nginx熱部署如何實現(xiàn)

默認1worker進程。

Nginx熱部署如何實現(xiàn)

并且master進程和worker進程是父子進程關(guān)系。

Nginx熱部署如何實現(xiàn)

Nginx工作模式為多進程,Nginx在啟動之后會有一個master進程和多個worker進程(默認1個),多個worker子進程將監(jiān)聽master父進程監(jiān)聽的端口(參考父子進程的關(guān)系),并行處理請求。master父進程主要用來管理worker子進程(管理真正提供服務的worker進程,向worker進程發(fā)送信號,監(jiān)控worker進程的運行狀態(tài),當worker進程異常退出后,會重新啟動新的worker進程),讀取并驗證配置信息,master進程不會對用戶請求提供服務,而用戶請求是由worker進程進行處理。

Nginx是通過信號量來控制,比如停止和重啟Nginx。信號量是進程間通信的一種機制,master主進程控制多個worker子進程,也是通過信號量。

Nginx熱部署如何實現(xiàn)

現(xiàn)在來演示Nginx是怎么實現(xiàn)熱部署的,博主通過修改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熱部署如何實現(xiàn)

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

Nginx熱部署如何實現(xiàn)

查看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進程發(fā)送SIGUSR2信號,讓Nginx平滑升級可執(zhí)行程序??梢钥吹?code>Nginx重新啟動了一組master進程和worker進程,而新master進程是舊master進程的子進程(通過父子進程的繼承關(guān)系,新master進程可以很方便地繼承舊master進程的相關(guān)資源)。

[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進程發(fā)送SIGWINCH信號,讓舊master進程關(guān)閉舊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

現(xiàn)在訪問http://192.168.1.199/,會響應404。

Nginx熱部署如何實現(xiàn)

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

Nginx熱部署如何實現(xiàn)

如果升級版本沒有問題,就可以給舊master進程發(fā)送SIGQUIT信號,讓舊master進程關(guān)閉,這樣就只剩下新master進程和新worker進程,實現(xiàn)了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進程發(fā)送SIGHUP信號,因為博主重新進行了測試,所以進程號都變了,但很顯然舊master進程重新創(chuàng)建了舊worker進程,并且進行版本升級的masterworker進程沒有被關(guān)閉。

[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進程發(fā)送SIGQUIT信號,讓新master進程關(guān)閉,這樣就只剩下舊master進程和新創(chuàng)建的舊worker進程,實現(xiàn)了回滾。

[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

回滾成功。

Nginx熱部署如何實現(xiàn)

還需要對版本回滾(即博主這里的配置文件回滾,不然下次重啟就會出問題)。

[root@localhost conf]# cp -f nginx_old.conf nginx.conf
cp:是否覆蓋"nginx.conf"? y

為什么給舊master進程發(fā)送SIGHUP信號,舊master進程重新創(chuàng)建的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進程發(fā)送SIGHUP信號。舊master進程將啟動新worker進程,而無需重新讀取配置。之后,通過向新master進程發(fā)送SIGQUIT信號,所有新進程都可以正常關(guān)閉。

如果不存在新進程的情況下(只有一組master、worker進程),修改配置文件,再向master進程發(fā)送SIGHUP信號,看是否會重新加載配置文件。

Nginx熱部署如何實現(xiàn)

[root@localhost conf]# kill -s SIGHUP 15084

很顯然配置文件被重新加載了,由于博主還沒有看源碼,只能猜測Nginx的實現(xiàn)(如果說錯了,請大家評論補充),Nginx應該是根據(jù)當前是否在進行熱部署(存在新master進程),來決定SIGHUP信號是否需要重新加載配置文件。

Nginx熱部署如何實現(xiàn)

以上是“Nginx熱部署如何實現(xiàn)”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI