1.什么是Nginx?
Nginx是一個高性能的HTTP和反向代理服務器,也是一個IMAP/POP3/SMTP服務器
Nginx是一款輕量級的Web服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器 目前使用的最多的web服務器或者代理服務器,像淘寶、新浪、網易、迅雷等都在使用
2.為什么要用Nginx?
優點:
- 跨平臺、配置簡單
- 非阻塞、高并發連接:處理2-3萬并發連接數,官方監測能支持5萬并發
- 內存消耗小:開啟10個nginx才占150M內存 成本低廉:開源
- 內置的健康檢查功能:如果有一個服務器宕機,會做一個健康檢查,再發送的請求就不會發送到宕機的服務器了。重新將請求提交到其他的節點上。
- 節省寬帶:支持GZIP壓縮,可以添加瀏覽器本地緩存
- 穩定性高:宕機的概率非常小
- master/worker結構:一個master進程,生成一個或者多個worker進程
- 接收用戶請求是異步的:瀏覽器將請求發送到nginx服務器,它先將用戶請求全部接收下來,再一次性發送給后端web服務器,極大減輕了web服務器的壓力
- 一邊接收web服務器的返回數據,一邊發送給瀏覽器客戶端
- 網絡依賴性比較低,只要ping通就可以負載均衡
- 可以有多臺nginx服務器
- 事件驅動:通信機制采用epoll模型
3.為什么Nginx性能這么高?
得益于它的事件處理機制: 異步非阻塞事件處理機制:運用了epoll模型,提供了一個隊列,排隊解決
4.Nginx是如何實現高并發的
service nginx start之后,然后輸入#ps -ef|grep nginx,會發現Nginx有一個master進程和若干個worker進程,這些worker進程是平等的,都是被master fork過來的。在master里面,先建立需要listen的socket(listenfd),然后再fork出多個worker進程。當用戶進入nginx服務的時候,每個worker的listenfd變的可讀,并且這些worker會搶一個叫accept_mutex的東西,accept_mutex是互斥的,一個worker得到了,其他的worker就歇菜了。而搶到這個accept_mutex的worker就開始“讀取請求–解析請求–處理請求”,數據徹底返回客戶端之后(目標網頁出現在電腦屏幕上),這個事件就算徹底結束。
nginx用這個方法是底下的worker進程搶注用戶的要求,同時搭配“異步非阻塞”的方式,實現高并發量。
5.為什么不使用多線程?
因為線程創建和上下文的切換非常消耗資源,線程占用內存大,上下文切換占用cpu也很高,采用epoll模型避免了這個缺點
6.Nginx是如何處理一個請求的呢?
首先,nginx在啟動時,會解析配置文件,得到需要監聽的端口與ip地址,然后在nginx的master進程里面
先初始化好這個監控的socket(創建socket,設置addrreuse等選項,綁定到指定的ip地址端口,再listen)
然后再fork(一個現有進程可以調用fork函數創建一個新進程。由fork創建的新進程被稱為子進程 )出多個子進程出來
然后子進程會競爭accept新的連接。此時,客戶端就可以向nginx發起連接了。當客戶端與nginx進行三次握手,與nginx建立好一個連接后
此時,某一個子進程會accept成功,得到這個建立好的連接的socket,然后創建nginx對連接的封裝,即ngx_connection_t結構體
接著,設置讀寫事件處理函數并添加讀寫事件來與客戶端進行數據的交換。最后,nginx或客戶端來主動關掉連接,到此,一個連接就壽終正寢了
7.正向代理
一個位于客戶端和原始服務器(origin server)之間的服務器,為了從原始服務器取得內容,客戶端向代理發送一個請求并指定目標(原始服務器)
然后代理向原始服務器轉交請求并將獲得的內容返回給客戶端。客戶端才能使用正向代理
正向代理總結就一句話:代理端代理的是客戶端
8.反向代理
反向代理(Reverse Proxy)方式是指以代理服務器來接受internet上的連接請求,然后將請求,發給內部網絡上的服務器
并將從服務器上得到的結果返回給internet上請求連接的客戶端,此時代理服務器對外就表現為一個反向代理服務器
反向代理總結就一句話:代理端代理的是服務端
9.動態資源、靜態資源分離
動態資源、靜態資源分離是讓動態網站里的動態網頁根據一定規則把不變的資源和經常變的資源區分開來,動靜資源做好了拆分以后
我們就可以根據靜態資源的特點將其做緩存操作,這就是網站靜態化處理的核心思路
動態資源、靜態資源分離簡單的概括是:動態文件與靜態文件的分離
10.為什么要做動、靜分離?
在我們的軟件開發中,有些請求是需要后臺處理的(如:.jsp,.do等等),有些請求是不需要經過后臺處理的(如:css、html、jpg、js等等文件)
這些不需要經過后臺處理的文件稱為靜態文件,否則動態文件。因此我們后臺處理忽略靜態文件。這會有人又說那我后臺忽略靜態文件不就完了嗎
當然這是可以的,但是這樣后臺的請求次數就明顯增多了。在我們對資源的響應速度有要求的時候,我們應該使用這種動靜分離的策略去解決
動、靜分離將網站靜態資源(HTML,JAVAScript,CSS,img等文件)與后臺應用分開部署,提高用戶訪問靜態代碼的速度,降低對后臺應用訪問
這里我們將靜態資源放到nginx中,動態資源轉發到Tomcat服務器中
11.負載均衡
負載均衡即是代理服務器將接收的請求均衡的分發到各服務器中
負載均衡主要解決網絡擁塞問題,提高服務器響應速度,服務就近提供,達到更好的訪問質量,減少后臺服務器大并發壓力