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


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

 

1inotify文件系統監控特性

    Inotify 是一個 Linux 內核特性,它監控文件系統,並且及時向專門的應用程序發出相關的事件警告,比如刪除、讀、寫和卸載操作等。inotify是Linux內核提供的一個文件系統變化通知機制,從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優雅的關閉老的worker、cache 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 函數啟動新的binary的NginX。(期間:需要進行老的環境變量的拷貝、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后綴,然后拉起新的master和worker進程,並寫入新的master進程的pid。

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

步驟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 master和worker進程

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

...

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

 

TODO:nginx還會有依賴的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,這些Service在Nginx反向代理中的路由配置需要同步更新並生效。因此,這個過程的場景大致如下:

 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM