首先我們先了解一下Nginx是什么
Nginx ("engine x") 是一個高性能的HTTP和反向代理 服務器,特點是占有內存少,并發能力強,事實上nginx的 并發能力確實在同類型的網頁服務器中表現較好,中國 大陸使用nginx網站用戶有:百度、京東、新浪、網易、 騰訊、淘寶等。
首先Nginx 不是web服務器 ,它最主要的功能有三個 “反向代理”,“負載均衡”,“動靜分離”,接下來我們會主要圍繞這三個功能講解。說道服務器,肯定有小伙伴能想到Tomcat,那么Nginx和Tomcat是什么關系? Tomcat服務器不是web服務器,Nginx是代理服務器,兩者功能不同,而且Nginx可以作為靜態頁面的web服務器,同時還支持CGI協 議的動態語言,比如perl、php等。但是不支持JAVA。 Java程序只能通過與tomcat配合完成。所以Nginx和Tomcat算是合作關系。
下面我們主要講Nginx的三大功能:
一 反向代理(即代理服務端)
說道反向代理,那么我么先看什么是正向代理。
正向代理即代理客戶端,以圖為例,我們要訪問google,因為有防火墻的存在,我們是不能訪問到的,但是我們可以通過代理服務器訪問。這種方式就是正向代理。
那什么叫反向代理呢
如果我們有一個電商網站,訪問并發量特別大,那么只用一臺服務器處理請求時遠遠不夠的,所以就要用到Nginx ,代理我們的服務器,把請求分別發到幾臺服務器處理。這就是所謂的反向代理。
二 負載均衡
我們的Nginx 會將請求發到幾臺服務器,那么Nginx 對應幾臺服務器,怎么給這幾臺服務器分配請求呢,這就要提到負載均衡了,為了保證每臺服務器都正常運轉,我們要做負載均衡,負載均衡有很多種策略,Nginx 選擇的是輪詢,即按照順序分配,分配給服務器1,分配給服務器2,分配給服務器3,分配給服務器1,以此類推。
三 動靜分離
大家都知道我們編寫程序要盡可能的解耦,假設我們的程序中靜態資源域與代碼都耦合在一起,我們每改一個圖片,一個樣式都需要改代碼,這時我們的Nginx 就派上了用場,Nginx 可以 將靜態資源與動態資源分離。
Nginx可以將我們的靜態資源存在在一個文件系統中,我們需要靜態資源的時候,只需要將靜態資源的url填上,我們改變靜態資源的時候,也只需改變文件系統中的靜態資源,不需要改動我們的代碼。
講了Nginx的三大功能,我么再接著講講Nginx的底層原理
Nginx采用了master-workers的機制
首先,對于每個worker進程來說,獨立的進程,不需要加鎖, 所以省掉了鎖帶來的開銷,同時在編程以及問題查找時,也會方 便很多。 其次,采用獨立的進程,可以讓互相之間不會影響,一個進程 退出后,其它進程還在工作,服務不會中斷,master進程則很快啟 動新的worker進程。當然,worker進程的異常退出,肯定是程序有 bug了,異常退出,會導致當前worker上的所有請求失敗,不過不 會影響到所有請求,所以降低了風險。
當請求過來時,會通知到我們的master,master會通知worker,所有worker會爭搶這個請求,所以Nginx效率很高。那么我們要設置多少個worker, Nginx 同redis類似都采用了io多路復用機制,每個 worker都是一個獨立的進程,但每個進程里只有一個主線 程,通過異步非阻塞的方式來處理請求, 即使是千上萬個 請求也不在話下。每個worker的線程可以把一個cpu的性 能發揮到極致。 所以worker數和服務器的cpu數相等是最為適宜的。設 少了會浪費cpu,設多了會造成cpu頻繁切換上下文帶來的 損耗。