1. Nginx - 深入理解nginx的處理請求、進程關系和配置文件重載
Nginx的系統學習整理的第三篇博客,主要介紹nginx的應用場景和架構基礎,以便更好的理解,再生產環境中進行性能調優。
Nginx的三個主要應用場景:
1.靜態資源服務,通過本地文件系統提供服務
2.反向代理服務,強大的性能,緩存 和負載均衡服務
3.ApiServer服務,比如像php-fpm、tomcat、uwsgi等
運行中的Nginx進程間的關系:
Nginx部署以後,我們首先要了解的是Nginx進程間的關系,是怎麼做到處理高並發的請求的原理和實現,可以使用pstree命令查看master和worker的關系。
Nginx是支持單進程(master進程)提供服務的,那麼為什麼產品環境下要按照master-worker方式配置啟動多個進程,這樣做主要有兩點:
Nginx請求處理流程:
Nginx可以搭建靜態web伺服器,反向代理伺服器,對一些限流、限速的方向上是有所不同的,這些都要求我們對Nginx架構有清晰的了解,需要我們從Nginx內部看Nginx是怎樣處理請求的。
當web請求或者tcp請求進入到Nginx上,Nginx內部有三個大的狀態機,傳輸層(Tcp/Udp)狀態機、Http狀態機,以及處理郵件的Mall狀態機,為什麼要叫它狀態機呢,是因為Nginx中的核心用非阻塞的事件驅動處理引擎,就是我們所說的epoll非同步處理引擎以後,通常都需要使用狀態機對請求進行正確處理的。
當處理靜態資源的時候會有一個問題,當整個內存不足時完全緩存文件信息的時候,AIO會退換成使用線程池處理磁碟的阻塞調用。
對於每一個處理完成的請求會記錄到Access訪問日記和錯誤日誌里,更多的時候Nginx作為反向代理伺服器使用的,可以使用協議傳輸到後面的伺服器,也可以通過應用層的協議,代理到響應的應用伺服器
配置文件重載的原理真相:
想了解配置文件重載的原理真相,需要先了解Nginx的組成,Nginx一共有四個組成部分:Nginx二進制可執行文件,由各源碼編譯出的一個文件;Nginx.conf配置文件,控制Nginx的行為;Access.log訪問日誌,記錄每一條http請求信息;Error.log錯誤日誌,定位問題。
reload配置文件重載流程:
Nginx配置文件重載如圖所示,大致可分三步:
1.更新nginx.conf配置文件,向Master發送SIGHUP信號,或者執行nginx -s reload
2.老配置worker進程再完成已存在時優雅的退出。3.Nginx始終保持運行中,平滑的更換了配置文件,新來的請求新啟動由黃色的worker進程處理。
注意,在新老配置進程交替過程中,新老進程是同時存在的,如果是異常的請求出了問題,客戶端長時間沒有處理,會導致請求長時間佔用在內存中,worker進程就會一直存在,解決這個問題的辦法設置,可以設置worker_shutdown_timeout解決。
熱升級流程:
1.將舊Nginx文件換成新的Nginx文件(注意備份)
2.向master進程發送USR2信號
3.master進程修改pid文件名,後綴加.oldbin
4.master進程用新的Nginx文件啟動新master進程
5.向老master進程發送QUIT信號,關閉老master
6.回滾:向老master發送HUP,向新master發送QUIT
常說Nginx要優雅的關閉worker進程,Nginx的worker進程可以識別出當前的鏈接沒有正在處理請求,這個時候我們在關閉鏈接。
Nginx優雅的關閉主要針對的是http請求,對於想tcp、websocket這種請求Nginx也是無能為力的。