nginx的作用與原理
一、nginx的作用
nginx能做反向代理,那麼什麼是反向代理呢,舉個栗子,我想在本地使用 www.xxx.com 的域名去訪問 www.taobao.com。那麼這個時候我們就可以通過nginx去實現。
再者,nginx能實現通過統一域名進入各個分支專案,nginx對請求進行分發,使訪問請求達到均衡的目的,解決單臺伺服器壓力。
nginx可以解決跨域問題,也可作為隔離層。
二、nginx工作原理
nginx是支援多執行緒的方式的,只是我們主流的方式還是多程序的方式,也是nginx的預設方式。
master程序主要用來管理worker程序,包含:接收來自外界的訊號,向各worker程序傳送訊號,監控worker程序的執行狀態,當worker程序退出後(異常情況下),會自動重新啟動新的worker程序。
worker程序則是處理基本的網路事件。多個worker程序之間是對等的,他們同等競爭來自客戶端的請求,各程序互相之間是獨立的。一個請求,只可能在一個worker程序中處理,一個worker程序,不可能處理其它程序的請求。
程序的優點:
程序之間不共享資源,不需要加鎖,所以省掉了鎖帶來的開銷。
採用獨立的程序,可以讓互相之間不會影響,一個程序退出後,其它程序還在工作,服務不會中斷,master程序則很快重新啟動新的worker程序。
多執行緒缺點
多執行緒在多併發情況下,執行緒的記憶體佔用大,執行緒上下文切換造成CPU大量的開銷。想想apache的常用工作方式(apache也有非同步非阻塞版本,但因其與自帶某些模組衝突,所以不常用),每個請求會獨佔一個工作執行緒,當併發數上到幾千時,就同時有幾千的執行緒在處理請求了。這對作業系統來說,是個不小的挑戰,執行緒帶來的記憶體佔用非常大,執行緒的上下文切換帶來的cpu開銷很大,自然效能就上不去了,而這些開銷完全是沒有意義的
驚群現象
每個worker程序都是從master程序fork過來。在master程序裡面,先建立好需要listen的socket之後,然後再fork出多個worker程序,這樣每個worker程序都可以去accept這個socket(當然不是同一個socket,只是每個程序的這個socket會監控在同一個ip地址與埠,這個在網路協議裡面是允許的)。一般來說,當一個連線進來後,所有在accept在這個socket上面的程序,都會收到通知,而只有一個程序可以accept這個連線,其它的則accept失敗。
同步非阻塞優點:
非同步的概念和同步相對的,也就是不是事件之間不是同時發生的。
非阻塞的概念是和阻塞對應的,阻塞是事件按順序執行,每一事件都要等待上一事件的完成,而非阻塞是如果事件沒有準備好,這個事件可以直接返回,過一段時間再進行處理詢問,這期間可以做其他事情。但是,多次詢問也會帶來額外的開銷。
總的來說,Nginx採用非同步非阻塞的好處在於:
不需要建立執行緒每個請求只佔用少量的記憶體
沒有上下文切換,事件處理非常輕量