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 的版本,編譯器版本和配置參數。
即上面配置中的upstream可選的四種負載均衡算法
nginx進程
啓動Nginx後,其實就是在80端口啓動了Socket服務進行監聽,如圖所示,Nginx涉及Master進程和Worker進程。
Master-Worker模式
nginx.conf
Master進程的做用是?
讀取並驗證配置文件nginx.conf;管理worker進程;
Worker進程的做用是?
每個Worker進程都維護一個線程(避免線程切換),處理鏈接和請求;注意Worker進程的個數由配置文件決定,通常和CPU個數相關(有利於進程切換),配置幾個就有幾個Worker進程。
所謂熱部署,就是配置文件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的worker進程個數與CPU綁定、worker進程內部包含一個線程高效迴環處理請求,這的確有助於效率,但這是不夠的。
做爲專業的程序員,咱們能夠開一下腦洞:BIO/NIO/AIO、異步/同步、阻塞/非阻塞...
要同時處理那麼多的請求,要知道,有的請求須要發生IO,可能須要很長時間,若是等着它,就會拖慢worker的處理速度。
Nginx採用了Linux的epoll模型,epoll模型基於事件驅動機制,它能夠監控多個事件是否準備完畢,若是OK,那麼放入epoll隊列中,這個過程是異步的。worker只須要從epoll隊列循環處理便可。