一、Nginx的模塊和工作原理
nginx由內核和模塊組成:
1.內核:其設計非常微小和簡潔,完成的工作也非常簡單。僅通過查找配置文件將客戶端請求映射到一個location block(location是nginx配置中的一個指令,用例URL匹配),而在這個location中所配置的每個指令將會啟動不同的模塊取完成相應的工作。
2.從結構上分為‘核心模塊、基礎模塊、第三方模塊’:
核心模塊:HTTP模塊、EVENT模塊、MAIL模塊。
基礎模塊:HTTP Access模塊、HTTPFastCGI模塊、HTTP Proxy模塊、HTTP Rewrite模塊。
第三方模塊:HTTP Upstream Request Hash模塊、Notice模塊、HTTP Access Key模塊以及根據需求自己開發的模塊。
3.從功能上划分為‘Handlers、Filters、Proxies’:
Handlers(處理器模塊):此類模塊直接出來請求,並輸出內容和修改headers信息等操作。Handlers處理器模塊一般只能有一個。
Filters(過濾器模塊):此類模塊主要對其他處理器模塊輸出的內容進行修改操作,最后有nginx輸出。
Proxies(代理類模塊):此類模塊是nginx的HTTP Upstream質量的模塊,這些模塊主要與后端一些服務(例如FastCGI)進行交互,實現服務代理和負載均衡等功能。
如下圖,展示了Nginx模塊常規的HTTP請求和響應過程:
nginx本身做的工作很少,當它接到一個HTTP請求時,它僅僅是通過查找配置文件將此請求映射到一個location block,而此location中所配置的各個指令則會啟動不同的模塊取完成工作,因此模塊可以看做nginx真正的勞動工作者。通常一個location的指令會涉及一個handler模塊和多個filter模塊(當然,多個location可以復用一個模塊)。handler模塊負責處理請求,完成相應內容的生成,而filter模塊對相應內容進行處理。
nginx的模塊直接被編譯僅nginx,隱藏屬於靜態編譯方式。啟動nginx后,nginx的模塊被自動加載,不想Apache,首先將模塊編譯成一個so文件,然后在配置文件中指定是否進行加載。在解析配置文件時,nginx每個模塊都有可能處理某個請求,但是同一個處理請求只能由一個模塊完成。
二、、nginx能做什么
1.正向代理
簡單的說,我是一個用戶,我無法直接訪問一個網站,但是我能訪問一個代理服務器,這個代理服務器能訪問我不能訪問的網站,預算我先連上代理服務器,告訴它我需要訪問那個無法訪問的網站的內容,代理服務器去取回來,然后返回給我。從網站的角度,只在代理服務器來取內容的時候有一次記錄。結論是,正向代理,是一個位於客戶端與原始服務器(origin server)之間的服務器,為了從原始服務器取得內,客戶端向代理發送一個請求並指定原始目標(原始服務器),然后代理向原始服務器轉交請求並將獲得的內容返回給客戶端。客戶端必須要進行一些特別的設置才能使用正向代理。
2.反向代理
例如需要訪問localhost:8080/views/test1這個頁面,但view對應的服務器上沒有test1這個資源,它是從另外一個服務器調用的資源。這樣,view對應的服務器就使用了反向代理。即,用戶只需要把請求發給特定的反向代理服務器,用戶不需要知道請求具體是誰處理的,由代理服務器統一處理。反向代理,對於客戶端而言,它就像是原始的服務器,客戶端不需要做任何特別的設置。客戶端向反向代理的命名空間(namespace)中的內容發送普通請求,接着反向代理服務器講判斷向何處(原始服務器)轉交請求,並將返回的內容(就像這些內容原本是它自己一樣)返回給客戶端。
正向代理的典型用途是在為防火牆內的局域網客戶端提供訪問Internet的途徑。正向代理還可以使用緩沖特性減少網絡使用率。反向代理的典型用途是將防火牆后面的服務器提供給Internet用戶訪問。反向代理還可以為后端的多台服務器提供負載平衡,或為后端較慢的服務器提供緩沖服務。總之而已,正向代理,對應客戶端而言,代理服務器代理客戶端,轉發請求,並將獲得的內容返回給客戶端;反向代理,對於客戶端而言,代理服務器就像原始服務器,代理集群的web節點服務器返回結果。nginx就是一台反向代理服務器。
3.負載均衡
負載均衡也是nginx常用的一個功能,所謂負載均衡即分攤多個操作單元上進行執行,例如web服務器、ftp服務器、企業關鍵應用服務器和其他關鍵任務服務器等,從而共同完成工作任務。簡單而言就是,當有2台或者以上服務器時,根據規則隨機地將請求分發到制定的服務器處理,負載均衡配置一般都需要同時配置反向代理,通過反向代理跳轉到負載均衡。目前nginx提供3種自帶的負載均衡,還有2種常用的第三方策略。
3.1 RR:安裝輪詢(默認)方式進行負載,每個請求按時間順序逐一分配到不同的后端服務器,如果后端服務器down掉,能自動剔除。雖然這種方式簡便、成本低,但缺點是:可靠性低和負載分配不均衡。
3.2 權重:指定輪詢幾率,weight和訪問比例成正比,用於后端服務器性能不均的情況。
此時,8080和8081分別占90%和10%。
3.3 ip_hash:上面2種方式都有一個問題,就是下一個請求來的時候,請求可能分發到另外一個服務器,當我們的程序不是無狀態的時候(采用session保存數據),這個時候,就有一個很大的問題,比如把登錄信息保存到了session中,那么跳轉到另外一個服務器的時候就需要重新登錄了,所以很多時候,我們只需要一個客戶只訪問一個服務器,那么就需要用到iphash。iphash的每個請求按訪問ip的hash結果分配,這個每個訪客訪問一個后端服務器,可以解決session問題。
3.4 fair(第三方):按后端服務器的響應時間來分配請求,響應時間短的優先分配。
3.5 url_hash(第三方):按訪問URL的hash結果進行分配請求,使每個URL定向到同一個后端服務器,后端服務器為緩存時比較有效。在upstream中加入hash語句,server語句中不能寫入weight等其他的參數,hash_method是使用hash算法。
4.HTTP服務器(包括動靜分離)