Nginx是一個高性能的HTTP和反向代理服務器,及電子郵件代理服務器,同時也能夠做爲反向代理服務器來實現負載均衡。css
由於Nginx具備跨平臺、配置簡單、非阻塞、高併發鏈接等特色!html
Nginx的優點:nginx
- 內存消耗小:開啓10個Nginx才佔150M內存,Nginx處理靜態文件好,耗費內存小;
- 內置的健康檢查功能:若是有一個服務器宕機,Nginx會將這臺宕機的服務器移出集羣;
- 節省帶寬:支持Gzip壓縮,能夠添加到瀏覽器本地進行緩存;
- 穩定性高:宕機的機率很是小;
- 接收用戶請求是異步的(採用epoll模型):瀏覽器將請求發送到nginx服務器,它先將用戶請求所有接收下來,再一次性發送給後端web服務器,極大減輕了web服務器的壓力,一邊接收web服務器的返回數據,一邊發送給瀏覽器客戶端, 網絡依賴性比較低,只要ping通就能夠負載均衡,能夠有多臺nginx服務器 使用dns作負載均衡,事件驅動;
主要功能:web
- 能夠做爲Web服務器(代替Apache,對PHP須要fastcgi處理器支持);
- 能夠做爲反向代理服務器;
- 能夠實現負載均衡;
- 能夠配置虛擬主機;
- fastcgi:Nginx自己不支持PHP等語言,可是它能夠經過fastcgi來將請求轉交到某些語言或框架處理;
Nginx服務主要由一個master進程和多個work進程,而work進程就是用來處理客戶端請求。面試
當一個客戶端請求到達Nginx服務器時,這時Nginx服務會調用work進程來處理客戶端的請求,但不是全程處理,處理可能發生阻塞的地方,好比向後端服務器轉發客戶端請求,並不會等待請求返回。那麼此時這個處理的work進程會繼續處理其餘的請求,一旦後端服務器返回結果後,就會觸發這個事件,work進程纔會接收並將返回結果轉交到客戶端。算法
驚羣簡單來講就是多個進程或線程都在等待同一個事件,當事件發生時,全部線程和進程都會被內核喚醒。喚醒後一般只有一個進程得到了該事件並進行處理,其餘進程發現獲取事件失敗後又繼續進入了等待狀態,在必定程度上下降了系統性能。apache
Nginx處理驚羣的大體思路:不讓多個進程在同一時間監聽接受鏈接的socket,而是讓每一個進程輪流監聽,這樣當有鏈接到達時,就只有一個進程在監聽那確定就不會存在驚羣的問題。後端
具體的作法:利用一把進程間鎖,每一個進程中都嘗試得到這把鎖,若是獲取成功監聽socket加入wait集合中,並設置超時時間等待鏈接到來,沒有得到鎖的進程則將監聽socket從wait集合中去除。瀏覽器
主要是由於它的事件處理機制:異步非阻塞事件處理機制:應用了epoll模型,提供了一個隊列,排列解決。緩存
首先,nginx在啓動時,會解析配置文件,獲得須要監聽的端口與ip地址,而後在nginx的master進程裏面先初始化好這個監控的socket,再進行listen,而後再fork出多個子進程出來, 子進程會競爭accept新的鏈接。此時,客戶端就能夠向nginx發起鏈接了。當客戶端與nginx進行三次握手,與nginx創建好一個鏈接後,此時,某一個子進程會accept成功,而後建立nginx對鏈接的封裝,即ngx_connection_t結構體,接着,根據事件調用相應的事件處理模塊,如http模塊與客戶端進行數據的交換。最後,nginx或客戶端來主動關掉鏈接,到此,一個鏈接就處理完成了!
nginx的upstream目前支持四種方式的分配:
Nginx與Apache相比有如下優點:
通常來講,須要性能的 web 服務,使用 nginx ;若是不須要性能只求穩定,更考慮 apache !
cgi:
web服務器會根據請求的內容,而後會fork一個新進程來運行外部c程序(或perl腳本...), 這個進程會把處理完的數據返回給web服務器,最後web服務器把內容發送給用戶,剛纔fork的進程也隨之退出。 若是下次用戶還請求改動態腳本,那麼web服務器又再次fork一個新進程,周而復始的進行。
fastcgi:
web服務器收到一個請求時,他不會從新fork一個進程(由於這個進程在web服務器啓動時就開啓了,並且不會退出),web服務器直接把內容傳遞給這個進程(進程間通訊,但fastcgi使用了別的方式,tcp方式通訊),這個進程收到請求後進行處理,把結果返回給web服務器,最後本身接着等待下一個請求的到來,而不是退出。
- 配置nginx的proxy緩存;
- 對靜態頁面開啓壓縮功能,如br壓縮或者gzip壓縮;
- 調整nginx運行工做進程個數,最多開啓8個,8個以上話性能就不會再提高了,並且穩定性變得更低,因此8個足夠用了;
- 調整nginx運行CPU的親和力;
- 修改nginx最多可打開的文件數,若超過系統限制的最多打開文件數(ulimit -n命令查看系統的最多打開文件數),還須要修改系統默認的文件數;
- 修改單個worker的最大鏈接數;
- 開啓高效傳輸;
- 設置鏈接超時時間,以便保護服務器資源,由於創建鏈接也是須要消耗資源的;
- 優化fastCGI的一個超時時間,也能夠根據實際狀況對其配置緩存動態頁面;
- expires緩存調優,主要針對圖片、css、js等元素更改較少的狀況下使用。
- 配置防盜鏈;
- 優化內核參數,如進程能夠同時打開的最大句柄數;
具體內容能夠參考nginx面試題
未完待續…………………………