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

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

[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)閉進(jìn)程,即等請求結(jié)束后再關(guān)閉)。

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

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

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

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

Nginx熱部署

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

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

默認(rèn)1個worker進(jìn)程。

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

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

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

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

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

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進(jìn)行熱部署,現(xiàn)在訪問http://192.168.1.199/還是原來的Nginx頁面。

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

查看Nginx的進(jìn)程:

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

[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/,會響應(yīng)404。

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

而訪問http://192.168.1.199/nacos,會訪問到Nacos服務(wù)。

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

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

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

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

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

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

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

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

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊5 分享