1. 程式人生 > >【筆記】Nginx熱更新相關知識

【筆記】Nginx熱更新相關知識


(以下學習筆記內容均摘自參考連結,僅供個人查閱)

 

1inotify檔案系統監控特性

    Inotify 是一個 Linux 核心特性,它監控檔案系統,並且及時向專門的應用程式發出相關的事件警告,比如刪除、讀、寫和解除安裝操作等。inotifyLinux核心提供的一個檔案系統變化通知機制,從2.6.13版本的核心開始提供,比如你在建立一個檔案時它可以通知你哪個檔案被建立了,刪除檔案時通知你哪個檔案被刪除了,修改檔案時通知你哪個檔案被修改了,關閉檔案時哪個檔案被關閉了,是可寫關閉還是不可寫關閉等等。

 

2Nginx配置熱更新

    NginX採用Master/Worker的多程序模型,Master程序負責整個NginX程序的管理。主要包括:熱更新、停機、日誌重啟等。

 

NginX的配置修改之後,在不影響當前服務的情況下進行更新。

訊號: HUP

過程: 分為Master部分和Worker部分。

 

Matser程序:

1> 通過ngx_signal_hanlder解析出獲取的訊號,置ngx_reconfigure=1,標識Master要進行配置熱更新操作。

2> 呼叫ngx_init_cycle初始化新的cycle(重新載入nginx.conf以及各模組的初始化

)

3> 呼叫ngx_start_worker_process啟動新的Worker子程序,子程序標識just_respwan=1(NGX_PROCESS_JUST_RESPAWN)表示剛啟動,區分新舊程序。

4> 呼叫ngx_start_cache_manager啟動新的cache manager子程序和cache loader子程序。子程序標識just_respawn=1(NGX_PROCESS_JUST_RESPAWN)表示剛啟動,區分新舊程序。

5> 睡眠100毫秒之後,呼叫ngx_signal_worker_process優雅的關閉老的workercache manager

cache loader程序。注意:只向just_respawn=0的程序進行傳送訊號。

 

Worker程序:

1> 通過ngx_signal_handler解析出為QUIT訊號,置ngx_quit=1

2> 呼叫ngx_close_listening_sockets關閉監聽埠。設定ngx_exting=1

3> 如果定時器紅黑樹中為空,執行ngx_worker_process_exit退出。

 

 

3. Nginx可執行程式熱更新

Nginx可執行程序升級後,在不影響當前服務的情況下進行更新。

步驟1:訊號:USR2

過程:

Master程序:

1> 通過ngx_signal_handler解析獲取訊號,置ngx_change_binary=1

2> 呼叫ngx_new_binary=ngx_exec_new_binary 函式啟動新的binaryNginX。(期間:需要進行老的環境變數的拷貝、socket控制代碼的傳遞、pid檔案的拷貝等)。

此時,系統中同時存在兩個Nginx(新、老)同時提供服務。

Woker程序:

無操作

 

步驟2:訊號:WINCH

過程:

Master程序:

1> 通過ngx_signal_handler解析獲取訊號,置ngx_noaccept=1

2> ngx_noaccepting=1,呼叫ngx_signal_worker_processes向子程序傳送QUIT訊號。即Worker程序優雅的退出。

 

如果此時沒啥問題就可以直接關閉老的NginX Master程序了。(如果有問題,還有類似過程的回滾操作...

 

3Nginx可執行程式熱更新流程步驟

 

步驟1、升級nginx二進位制檔案,需要先將新的nginx可執行檔案替換原有舊的nginx檔案,然後給nginx master程序傳送USR2訊號,告知其開始升級可執行檔案;nginx master程序會將老的pid檔案增加.oldbin字尾,然後拉起新的masterworker程序,並寫入新的master程序的pid

步驟2、在此之後,所有工作程序(包括舊程序和新程序)將會繼續接受請求。這時候,需要傳送WINCH訊號給nginx master程序,master程序將會向worker程序傳送訊息,告知其需要進行graceful shutdownworker程序會在連線處理完之後進行退出。

步驟3、經過一段時間之後,將會只會有新的worker程序處理新的連線。

注意,舊master程序並不會關閉它的listen socket;因為如果出問題後,需要回滾,master程序需要法重新啟動它的worker程序。

步驟4、如果升級成功,則可以向舊master程序傳送QUIT訊號,停止老的master程序;如果新的master程序(意外)退出,那麼舊master程序將會去掉自己的pid檔案的.oldbin字尾。

 

nginx熱更新相關訊號

  master程序相關訊號

  USR2   升級可執行檔案

  WINCH        優雅停止worker程序

  QUIT    優雅停止master程序

 

  worker程序相關訊號

  TERM, INT  快速退出程序

  QUIT    優雅停止程序

 

 

什麼是graceful shutdown

    本文中的graceful shutdown是指server不再處理新的連線,但是程序不會立即退出,待所有連線斷開後再退出程序。

 

總結一下在nginx 二進位制檔案熱升級時用的命令

cd /usr/local/nginx

cp nginx nginx_bak

mv /data/nginx/nginx ./nginx #需要使用mv來更新二進位制檔案

./nginx -t #嘗試啟動,檢視其載入配置檔案等初始化功能是否正常

 

netstat -anp | grep -E "80|443" | grep nginx #檢查連線狀態

kill -USR2 `cat /usr/local/nginx/nginx.pid` #升級nginx可執行檔案,此時會有兩組nginx masterworker程序

kill -WINCH `cat /usr/local/nginx/nginx.pid.oldbin` #新的可執行檔案啟動ok,且能夠正常處理資料流,告知老的master程序去通知其worker程序進行優雅退出

...

kill -QUIT `cat /usr/local/nginx/nginx.pid.oldbin` #待所有的老的nginx worker程序優雅退出後(處理完連線),停止老的master程序

 

TODOnginx還會有依賴的so檔案的熱升級–其實更應該屬於後臺程序的so檔案熱升級流程,我在使用它的時候也踩過坑–主要原因還是操作不規範,對so其載入執行原理不夠熟悉導致

 

熱升級

實際上,靜態語言後端server有一套固定的熱升級(單程序)流程,其基本流程如下:

 

若需要支援熱升級的是多程序,那麼nginx的熱升級過程是最值得參考的

1、通過呼叫 fork/exec 啟動新的版本的程序,

2、子程序呼叫介面獲取從父程序繼承的 socket 檔案描述符重新監聽 socket

3、在此過程中,不會對使用者請求造成任何中斷。

 

nginx的熱升級流程也是類似,只不過由於nginx工作是多程序,故它會先啟動新版本的一組master/worker程序;然後停止老的worker程序,讓其不處理連線,由新的worker程序來處理連線;升級完畢後,即可退出老的master程序,熱升級完成。

 

 

4Nginx upstream backup備份伺服器的作用

Nginx upstream 配置的時候,可以配置備份伺服器 backup

 

upstream backend {

server 192.168.198.128:8080 weight=1;

server 192.168.198.128:8090 weight=4;

server 192.168.198.128:8091 backup;

}

 

backup : marks the server as a backup server. It will be passed requests when the primary servers are unavailable.(標記為備用伺服器。當主伺服器不可用以後,請求會被傳給這些伺服器。)

這意思就是,只有當你的伺服器掛掉的時候才會使用備份伺服器,正常情況下不會訪問到備份伺服器。

 

在所有正常伺服器都掛掉時,系統依然高可用,這就是備份伺服器的用處!

 

 

5、《Kubernetes叢集中的Nginx配置熱更新方案》原理:

    Nginx自身是支援配置熱更新的,通過nginx -s reload命令可以實現這一點。我們要實現的就是:當Kubernetes叢集中的Service發生變化時,比如新建立一個Service或刪除了一個Service,這些ServiceNginx反向代理中的路由配置需要同步更新並生效。因此,這個過程的場景大致如下:

 

5.1管理員通過命令或程式通過API操作K8s叢集建立或刪除Service

5.2監聽API Server Event的某個程式獲取該Event,並從API Server讀取最新Service資料,重新生成/etc/nginx/conf.d/default.conf

5.3 /etc/nginx/conf.d/default.conf檔案的變動觸發檔案變更事件,監聽該事件的指令碼呼叫“nginx -s reload”命令實現Nginx的配置熱更新。

 

6Nginx Proxy

    nginx-proxy sets up a container running nginx and docker-gen. docker-gen generates reverse proxy configs for nginx and reloads nginx when containers are started and stopped.

 

See Automated Nginx Reverse Proxy for Docker for why you might want to use this.

 

Usage

To run it:

 $ docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy

 Then start any containers you want proxied with an env var VIRTUAL_HOST=subdomain.youdomain.com

 $ docker run -e VIRTUAL_HOST=foo.bar.com  ...

 

 

參考連結:

inotify

https://baike.baidu.com/item/inotify/8361039

 

inotify -- Linux 2.6 核心中的檔案系統變化通知機制(2005年)

https://www.ibm.com/developerworks/cn/linux/l-inotifynew/

 

inotify-tools命令使用講解(安裝及監控例子)

https://www.cnblogs.com/wajika/p/6396748.html

 

Nginx中文文件

http://nginx.org/en/docs/http/ngx_http_upstream_module.html

http://tengine.taobao.org/nginx_docs/cn/docs/

http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_core_module.html#server

http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_upstream_module.html

http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_proxy_module.html

http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_index_module.html

http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_access_module.html

http://tengine.taobao.org/nginx_docs/cn/docs/control.html

 

 

NginX程序管理-熱更新

https://blog.csdn.net/huzelin1008/article/details/43193991

 

nginx-proxy

https://github.com/jwilder/nginx-proxy

http://jasonwilder.com/blog/2014/03/25/automated-nginx-reverse-proxy-for-docker/

 

Kubernetes叢集中的Nginx配置熱更新方案

https://tonybai.com/2016/11/17/nginx-config-hot-reloading-approach-for-kubernetes-cluster/

 

利用 Nginx 負載均衡實現 Web 伺服器更新不影響訪問

https://blog.csdn.net/liyongshun82/article/details/52787115

 

nginx熱更新聊一聊Golang中的熱更新(上)

https://blog.csdn.net/qq_15437667/article/details/83513457

 

nginx多程序模型之配置熱載入

https://blog.csdn.net/brainkick/article/details/7176405

 

HAProxy文件

https://cbonte.github.io/haproxy-dconv/1.8/intro.html

 

HAProxy用法詳解 全網最詳細中文文件

http://www.ttlsa.com/linux/haproxy-study-tutorial/

https://www.cnblogs.com/puremans/p/6428644.html