Nginx反向代理和負載均衡
1.反向代理概念
(1).正向代理的概念
正向代理,也就是傳說中的代理,他的工作原理就像一個跳板,簡單的說,我是一個使用者,我訪問不了某網站,但是我能訪問一個代理伺服器,這個代理伺服器呢,他能訪問那個我不能訪問的網站,於是我先連上代理伺服器,告訴他我需要那個無法訪問網站的內容,代理伺服器去取回來,然後返回給我。從網站的角度,只在代理伺服器來取內容的時候有一次記錄,有時候並不知道是使用者的請求,也隱藏了使用者的資料,這取決於代理告不告訴網站。
結論就是,正向代理 是一個位於客戶端和原始伺服器(origin server)之間的伺服器,為了從原始伺服器取得內容,客戶端向代理髮送一個請求並指定目標(原始伺服器),然後代理向原始伺服器轉交請求並將獲得的內容返回給客戶端。客戶端必須要進行一些特別的設定才能使用正向代理。
(2).反向代理的概念
繼續舉例:
例使用者訪問 http://www.test.com/readme,但www.test.com上並不存在readme頁面,他是偷偷從另外一臺伺服器上取回來,然後作為自己的內容返回使用者,但使用者並不知情。這裡所提到的 www.test.com 這個域名對應的伺服器就設定了反向代理功能。
結論就是,反向代理正好相反,對於客戶端而言它就像是原始伺服器,並且客戶端不需要進行任何特別的設定。客戶端向反向代理的名稱空間(name-space)中的內容傳送普通請求,接著反向代理將判斷向何處(原始伺服器)轉交請求,並將獲得的內容返回給客戶端,就像這些內容原本就是它自己的一樣。
(3).兩者區別
從用途上來講:
正向代理的典型用途是為在防火牆內的區域網客戶端提供訪問Internet的途徑。正向代理還可以使用緩衝特性減少網路使用率。反向代理的典型用途是將防火牆後面的伺服器提供給Internet使用者訪問。反向代理還可以為後端的多臺伺服器提供負載平衡,或為後端較慢的伺服器提供緩衝服務。另外,反向代理還可以啟用高階URL策略和管理技術,從而使處於不同web伺服器系統的web頁面同時存在於同一個URL空間下。
從安全性來講:
正向代理允許客戶端通過它訪問任意網站並且隱藏客戶端自身,因此你必須採取安全措施以確保僅為經過授權的客戶端提供服務。反向代理對外都是透明的,訪問者並不知道自己訪問的是一個代理。
2.配置反向代理
反向代理配置示例:
location / {
#設定主機頭和客戶端真實地址,以便伺服器獲取客戶端真實IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#禁用快取
proxy_buffering off;
#設定反向代理的地址
proxy_pass http://192.168.1.1;
}
代理地址根據實際情況修改。
3.負載均衡
配置負載均衡
nginx 的 upstream預設是以輪詢的方式實現負載均衡,這種方式中,每個請求按時間順序逐一分配到不同的後端伺服器,如果後端伺服器down掉,能自動剔除。
另外一種方式是ip_hash:每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端伺服器,可以解決session的問題。
負載均衡配置示例:
upstream backend {
#ip_hash;
server 192.168.1.251;
server 192.168.1.252;
server 192.168.1.247;
}
server {
listen 80;
server_name trffweb;
location / {
#反向代理的地址
proxy_pass http://backend;
}
}
Upstream命名和伺服器地址根據實際情況修改。
nginx中upstream的幾種方式:
1、輪詢(weight=1)
預設選項,當weight不指定時,各伺服器weight相同,
每個請求按時間順序逐一分配到不同的後端伺服器,如果後端伺服器down掉,能自動剔除。
upstream bakend {
server 192.168.1.10;
server 192.168.1.11;
}
2、weight
指定輪詢機率,weight和訪問比率成正比,用於後端伺服器效能不均的情況。
如果後端伺服器down掉,能自動剔除。
比如以下配置,則1.11伺服器的訪問量為1.10伺服器的兩倍。
upstream bakend {
server 192.168.1.10 weight=1;
server 192.168.1.11 weight=2;
}
3、ip_hash
每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端伺服器,可以解決session不能跨伺服器的問題。
如果後端伺服器down掉,要手工down掉。(www.jbxue.com 整理)
upstream resinserver{
ip_hash;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}
4、fair(第三方外掛)
按後端伺服器的響應時間來分配請求,響應時間短的優先分配。
upstream resinserver{
server 192.168.1.10:8080;
server 192.168.1.11:8080;
fair;
}
5、url_hash(第三方外掛)
按訪問url的hash結果來分配請求,使每個url定向到同一個後端伺服器,後端伺服器為快取伺服器時比較有效。
在upstream中加入hash語句,hash_method是使用的hash演算法。
upstream resinserver{
server 192.168.1.10:8080;
server 192.168.1.11:8080;
hash $request_uri;
hash_method crc32;
}
裝置的狀態有:
1、down 表示單前的server暫時不參與負載
2、weight 權重,預設為1。 weight越大,負載的權重就越大。
3、max_fails 允許請求失敗的次數預設為1。當超過最大次數時,返回proxy_next_upstream 模組定義的錯誤
4、fail_timeout max_fails次失敗後,暫停的時間。
5backup 備用伺服器, 其它所有的非backup機器down或者忙的時候,請求backup機器。所以這臺機器壓力會最輕。-