沒有聽過Nginx?那麼一定聽過它的"同行"Apache吧! Nginx同Apache一樣都是一種WEB伺服器。基於REST架構風格,以統一資源描述符(Uniform Resources Identifier)URI或統一資源定位符(Uniform Resources Locator)URL作為溝通依據,透過HTTP協定提供各種網路服務。
然而,這些伺服器在設計之初受到當時環境的局限,例如當時的用戶規模,網路頻寬,產品特點等局限並且各自的定位和發展都不盡相同。這也使得各個WEB伺服器有著各自鮮明的特色。
Apache的發展時期很長,而且是毫無爭議的世界第一大伺服器。它有很多優點:穩定、開源、跨平台等等。它出現的時間太長了,它興起的年代,網路產業遠遠比不上現在。所以它被設計為一個重量級的。它不支援高並發的伺服器。在Apache上運行數以萬計的並發訪問,會導致伺服器消耗大量記憶體。作業系統對其進行進程或執行緒間的切換也消耗了大量的CPU資源,導致HTTP請求的平均回應速度降低。
這些都決定了Apache不可能成為高效能WEB伺服器,輕量級高並發伺服器Nginx就應運而生了。
俄羅斯的工程師Igor Sysoev,他在為Rambler Media工作期間,使用C語言開發了Nginx。 Nginx作為WEB伺服器一直為Rambler Media提供出色而又穩定的服務。
然後呢,Igor Sysoev將Nginx程式碼開源,並且賦予自由軟體許可證。
由於:
所以,Nginx火了!
Nginx是一款自由的、開源的、高效能的HTTP伺服器和反向代理伺服器;同時也是一個IMAP、POP3、SMTP代理伺服器;Nginx可以作為一個HTTP伺服器進行網站的發布處理,另外Nginx可以作為反向代理進行負載平衡的實作。
說到代理,首先我們要明確一個概念,所謂代理就是一個代表、一個頻道;
此時就涉及到兩個角色,一個是被代理角色,一個是目標角色,被代理角色透過這個代理訪問目標角色完成一些任務的過程稱為代理操作過程;如同生活中的專賣店~客人到adidas專賣店買了一雙鞋,這個專賣店就是代理,被代理角色就是adidas廠家,目標角色就是使用者。
說反向代理之前,我們先看看正向代理,正向代理也是大家最常接觸的到的代理模式,我們會從兩個方面來說關於正向代理的處理模式,分別從軟體方面和生活方面來解釋一下什麼叫正向代理。
在現今的網路環境下,我們如果因為科技需要要去訪問國外的某些網站,此時你會發現位於國外的某網站我們透過瀏覽器是沒有辦法造訪的,此時大家可能都會用一個操作FQ進行訪問,FQ的方式主要是找到一個可以訪問國外網站的代理伺服器,我們將請求發送給代理伺服器,代理伺服器去訪問國外的網站,然後將訪問到的資料傳遞給我們!
上述這樣的代理模式稱為正向代理,正向代理最大的特點是客戶端非常明確要存取的伺服器位址;伺服器只清楚請求來自哪個代理伺服器,而不清楚來自哪個特定的客戶端;正向代理模式封鎖或隱藏了真實客戶端資訊。 來看個示意圖(我把客戶端和正向代理框在一塊,同屬於一個環境,後面我有介紹):
##客戶端必須設定正向代理伺服器,當然前提是要知道正向代理伺服器的IP位址,還有代理程式的連接埠。如圖。
總結來說:正向代理,"它代理的是客戶端,代客戶端發出請求",是位於客戶端和原始伺服器(origin server)之間的伺服器,為了從原始伺服器取得內容,客戶端向代理程式傳送一個請求並指定目標(原始伺服器),然後代理程式向原始伺服器轉交請求並將取得的內容傳回給客戶端。客戶端必須要進行一些特別的設定才能使用正向代理。
正向代理的用途:
(1)存取原來無法存取的資源,如Google
(2) 可以做緩存,加速存取資源
(3)對客戶端訪問授權,上網進行認證
(4)代理可以記錄使用者存取記錄(上網行為管理),對外隱藏使用者資訊
明白了什麼是正向代理,我們繼續看關於反向代理的處理方式,舉例如我大天朝的某寶網站,每天同時連接到網站的訪問人數已經爆表,單個服務器遠遠不能滿足人民日益增長的購買慾望了,此時就出現了一個大家耳熟能詳的名詞:分散式部署;也就是透過部署多台伺服器來解決存取人數限制的問題;某寶網站中大部分功能也是直接使用Nginx進行反向代理實現的,並且透過封裝Nginx和其他的組件之後起了個高大上的名字:Tengine,有興趣的童鞋可以訪問Tengine的官網查看具體的信息:http://tengine.taobao.org/。那麼反向代理具體是透過什麼樣的方式實現的分散式的叢集操作呢,我們先看一個示意圖(我把伺服器和反向代理框在一塊,同屬於一個環境,後面我有介紹):
透過上述的圖解大家就可以看清楚了,多個客戶端給伺服器發送的請求,Nginx伺服器接收到之後,按照一定的規則分發給了後端的業務處理伺服器進行處理了。此時~請求的來源也就是客戶端是明確的,但是請求具體由哪台伺服器處理的並不明確了,Nginx扮演的就是一個反向代理角色。
客戶端是無感知代理的存在的,反向代理對外都是透明的,訪問者並不知道自己訪問的是一個代理。因為客戶端不需要任何設定就可以存取。
反向代理,"它代理程式的是服務端,代服務端接收請求",主要用於伺服器在叢集分散式部署的情況下,反向代理程式隱藏了伺服器的資訊。
反向代理程式的作用:
(1)確保內網的安全,通常將反向代理程式作為公網存取位址,Web伺服器是內網
(2)負載均衡,透過反向代理伺服器來最佳化網站的負載
通常情況下,我們在實際專案操作時,正向代理和反向代理很有可能會存在在在一個應用程式場景中,正向代理代理客戶端的請求去存取目標伺服器,目標伺服器是一個反向單利伺服器,反向代理了多台真實的業務處理伺服器。具體的拓樸圖如下:
#截了一張圖來說明正向代理與反向代理二者之間的差異,如圖。
圖解:
在正向代理程式中,Proxy和Client同屬於一個LAN(圖中方框內),隱藏了客戶端資訊;
在反向代理中,Proxy和Server同屬於一個LAN(圖中方框內),隱藏了服務端資訊;
實際上,Proxy在兩種代理程式中所做的事情都是替伺服器代為收發請求和回應,不過從結構上看正好左右互換了一下,所以把後出現的那種代理方式稱為反向代理了。
我們已經明確了所謂代理伺服器的概念,那麼接下來,Nginx扮演了反向代理伺服器的角色,它是以依據什麼樣的規則進行請求分發的呢?不用的專案應用場景,分發的規則是否可以控制?
這裡提到的客戶端所發送的、Nginx反向代理伺服器接收到的請求數量,就是我們說的負載量。
請求數量依照一定的規則進行分發到不同的伺服器處理的規則,就是一種均衡規則。
所以~將伺服器接收到的請求依照規則分發的過程,稱為負載平衡。
負載平衡在實際專案操作過程中,有硬體負載平衡和軟體負載平衡兩種,硬體負載平衡也稱為硬負載,如F5負載平衡,相對造價昂貴成本較高,但是資料的穩定性安全性等等有非常好的保障,如中國移動中國聯通這樣的公司才會選擇硬負載進行操作;更多的公司考慮到成本原因,會選擇使用軟體負載平衡,軟體負載平衡是利用現有的技術結合主機硬體實現的一種訊息佇列分發機制。
Nginx支援的負載平衡調度演算法方式如下:
#比較項\伺服器 | Apache | Nginx | Lighttpd |
Proxy代理 | 非常好 | 非常好 | 一般 |
Rewriter | 好 | ##非常好一般 | |
不好 | 好 | 非常好 | |
不支援 | 支援 | 不支援 | |
##很大 | 很小 | 比較小 | |
好 | 非常好 | ##不好安全性 | |
一般 | #一般 | 靜態檔案處理 | |
非常好 | 好 | #反向代理 | |
非常好 | 一般 |
Nginx教學欄位進行學習!
以上是nginx可以做什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!