關於nginx服務器的知識

Nginx兩大做用:1.輕量web容器 2.反向代理服務器。前端

在Java領域中,Nginx更多的被用做在前端提供負載均衡的反向代理服務。nginx

因此本文僅簡要介紹下反向代理概念和負載均衡的實現。程序員

反向代理

是指以代理服務器來接受internet上的鏈接請求,而後將請求轉發給內部網絡上的服務器,並將從服務器上獲得的結果返回給internet上請求鏈接的客戶端,此時代理服務器對外就表現爲一個反向代理服務器。web

隨便畫了個流程圖以下:算法

經常使用命令

nginx -s stop 快速關閉Nginx,可能不保存相關信息,並迅速終止web服務。後端

nginx -s quit 平穩關閉Nginx,保存相關信息,有安排的結束web服務。服務器

nginx -s reload 因改變了Nginx相關配置,須要從新加載配置而重載。網絡

nginx -s reopen 從新打開日誌文件。session

nginx -c filename 爲 Nginx 指定一個配置文件,來代替缺省的。併發

nginx -t 不運行,而僅僅測試配置文件。nginx 將檢查配置文件的語法的正確性,並嘗試打開配置文件中所引用到的文件。

nginx -v 顯示 nginx 的版本。

nginx -V 顯示 nginx 的版本,編譯器版本和配置參數。

Nginx負載均衡調度的方法

即上面配置中的upstream可選的四種負載均衡算法

 

    • 服務器輪詢(默認方式):每一個請求訪問按照時間順序逐一分配到不一樣的服務器端,若是後端某臺服務器宕機時,故障系統會被自動的剔除,使用戶訪問不受影響。Weight(權重)指定輪詢的權值,Weight值越大,分配到的訪問概率越高,主要用於服務器端性能不均的狀況下。
    • ip_hash:每一個請求按照訪問的IP的Hash值進行分配,這行來自同一個IP的用戶將會固定到後端的一個服務器,固定服務器後能夠有效的解決網頁存在的session共享的問題。
    • fair:該算法能夠根據頁面大小和加載時間長短智能的進行決策負載均衡,即根據後端服務器的響應時間來分配請求,響應時間段的優先分配。Nginx自己未集成fair模塊,若是須要該調度算法,必須下載Nginx的upstream_fair模塊,而後在config中配置加載。
    • url_hash:此調度算法是根據訪問的url的hash結果來分配請求,使每一個url定向到同一個後端服務器,能夠進一步的提升後端服務器的效率。Nginx自己未集成該模塊,若是使用需安裝Nginx的hash包,並編譯加載到nginx。

Nginx的Master-Worker模式

nginx進程

啓動Nginx後,其實就是在80端口啓動了Socket服務進行監聽,如圖所示,Nginx涉及Master進程和Worker進程。

Master-Worker模式nginx.conf

Master進程的做用是?

讀取並驗證配置文件nginx.conf;管理worker進程;

Worker進程的做用是?

每個Worker進程都維護一個線程(避免線程切換),處理鏈接和請求;注意Worker進程的個數由配置文件決定,通常和CPU個數相關(有利於進程切換),配置幾個就有幾個Worker進程。

思考:Nginx如何作到熱部署?

所謂熱部署,就是配置文件nginx.conf修改後,不須要stop Nginx,不須要中斷請求,就能讓配置文件生效!(nginx -s reload 從新加載/nginx -t檢查配置/nginx -s stop)

經過上文咱們已經知道worker進程負責處理具體的請求,那麼若是想達到熱部署的效果,能夠想象:

方案一:

修改配置文件nginx.conf後,主進程master負責推送給woker進程更新配置信息,woker進程收到信息後,更新進程內部的線程信息。(有點valatile的味道)

方案二:

修改配置文件nginx.conf後,從新生成新的worker進程,固然會以新的配置進行處理請求,並且新的請求必須都交給新的worker進程,至於老的worker進程,等把那些之前的請求處理完畢後,kill掉便可。

Nginx採用的就是方案二來達到熱部署的!

思考:Nginx如何作到高併發下的高效處理?

上文已經說起Nginx的worker進程個數與CPU綁定、worker進程內部包含一個線程高效迴環處理請求,這的確有助於效率,但這是不夠的。

做爲專業的程序員,咱們能夠開一下腦洞:BIO/NIO/AIO、異步/同步、阻塞/非阻塞...

要同時處理那麼多的請求,要知道,有的請求須要發生IO,可能須要很長時間,若是等着它,就會拖慢worker的處理速度。

Nginx採用了Linux的epoll模型,epoll模型基於事件驅動機制,它能夠監控多個事件是否準備完畢,若是OK,那麼放入epoll隊列中,這個過程是異步的。worker只須要從epoll隊列循環處理便可。

相關文章
相關標籤/搜索