在業界,一直流傳這樣一句話:Nginx抗并發能力強!為什麼Nginx抗并發能力強?原因是使用了非阻塞、異步傳輸
阻塞:如apache代理tomcat時,apache開啟10個程序,同時處理着10個請求,在tomcat沒有傳回給apache結果時,apache是不會處理使用者發出的第11個請求
非阻塞:如nginx代理tomcat時,nginx開啟1000個并發,同時處理着1000個請求,在tomcat沒有傳回給nginx結果時,nginx會依然處理後面使用者發給的請求
同步傳輸:比如squid代理tomcat時,浏覽器發起請求,然後請求會squid立刻被轉到後端伺服器,于是在浏覽器和後端伺服器之間就建立了一個連接配接。在請求發起到請求完成,這條連接配接都是一直存在的。
異步傳輸:比如nginx代理tomcat時,浏覽器發起請求,請求不會立刻轉到後端伺服器,而是将請求資料(header)先儲存到nginx上,然後nginx再把這個請求發到後端伺服器, 後端伺服器處理完之後把資料傳回到nginx上,nginx将資料流發到浏覽器。
如上圖所示假設使用者執行一個上傳檔案操作,由于使用者網速較慢,是以需要花半個小時才能把檔案傳到伺服器。squid的同步代理在使用者開始上傳後就和後端tomcat建立了連接配接,半小時後檔案上傳結束,是以,後端tomcat伺服器連接配接保持了半個小時;而nginx異步代理就是先将資料儲存在nginx上,是以僅僅是nginx和使用者 保持了半小時連接配接,後端伺服器在這半小時内沒有為這個請求開啟連接配接,半小時後使用者上傳結束,nginx才将上傳内容發到後端tomcat,nginx和背景之間的帶寬 是很充裕的,是以隻花了一秒鐘就将請求發送到了背景,由此可見,後端伺服器連接配接保持了一秒。
一、負載均衡
1、負載均衡子產品(upstream)
Upstream子產品是Nginx 負載均衡的主要子產品,它提供了簡單的辦法來實作在輪詢和用戶端IP之間的後端伺服器負載均衡,并可以對伺服器進行健康檢查。upstream并不處理請求,而是通過請求後端伺服器得到使用者的請求内容。在轉發給後端時,預設是輪詢,也可以是ip_hash。
Nginx常見負載均衡方式
<a href="http://blogold.chinaunix.net/u2/65630/showart.php?id=2503097" target="_blank"></a>
<a href="http://blogold.chinaunix.net/u2/65630/showart.php?id=2503097" target="_blank">2、weight:指定輪詢幾率,權重值越高,輪詢幾率越大 </a>
<a href="http://blogold.chinaunix.net/u2/65630/showart.php?id=2503097" target="_blank">upstream bakend { server 192.168.1.1 weight=10; server 192.168.1.2 weight=10; }</a>
3、ip_hash:每個請求按通路ip的hash結果配置設定,這樣每個訪客固定通路一個後端伺服器,可以解決session的問題。
upstream resinserver{
ip_hash;
server 192.168.1.1:8080;
server 192.168.1.2:8080;
}
4、fair(第三方):按後端伺服器的響應時間來配置設定請求,響應時間短的優先配置設定。
server server1;
server server2;
fair;
5、url_hash(第三方):按通路url的hash結果來配置設定請求,使每個url定向到同一個後端伺服器,後端伺服器為緩存時比較有效。
例:在upstream中加入hash語句,server語句中不能寫入weight等其他的參數,hash_method是使用的hash算法
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
每個裝置的狀态設定為:
1.down 把後端标記為離線,僅限于ip_hash
2.weight 預設為1.weight越大,負載的權重就越大。
3.max_fails :允許請求失敗的次數預設為1.當超過最大次數時,傳回proxy_next_upstream 子產品定義的錯誤
4.fail_timeout:nginx在fail_timeout設定的時間内與後端伺服器通信失敗的次數超過max_fails設定的次數,則認為這個伺服器不在起作用;在接下來的 fail_timeout時間内,nginx不再将請求分發給失效的server。
5.backup: 标記後端為備份伺服器,若後端伺服器全部無效時才啟用
client_body_in_file_only 設定為On 可以講client post過來的資料記錄到檔案中用來做debug
client_body_temp_path 設定記錄檔案的目錄 可以設定最多3層目錄
location 對URL進行比對.可以進行重定向或者進行新的代理 負載均衡
upstream中使用ip_hash模式時,為什麼weight選項會被忽略?
因為ip_hash模式使用的負載均衡算法是根據請求ip進行hash,而weight模式使用的wrr算法,是以不可同時使用
2、代理子產品(proxy)
Proxy為Nginx的代理子產品,允許負責将使用者的HTTP請求轉發到後端伺服器,同時也可以結合upstream子產品,達到負載均衡的目的
注:proxy相關功能、指令很多,在此隻講與upstream相關的指令和功能
proxy子產品常用指令解釋:
proxy_pass:指定轉發到後端伺服器的請求,在location中指定,常用URI類型如下
Unix套接字:proxy_pass http://unix:/tmp/nginx.sock;
Upstream區段:proxy_pass http://nginx_pool;
proxy_pass使用域名命名時,為什麼不能和server_name相同 ?
如上圖是以,其資料通路流如下:
由此可見如果proxy_pass的URI命名若和server_name命名相同,則形成一個請求環路。是以在配置proxy_pass的URI時,應避免和本server内的server_name重名
二、健康檢查
Nginx的健康檢查主要展現在對後端服務提供健康檢查,且功能被內建在upstream子產品中,共有兩個指令
max_fails:定義定義可以發生錯誤的最大次數
fail_timeout:nginx在fail_timeout設定的時間内與後端伺服器通信失敗的次數超過max_fails設定的次數,則認為這個伺服器不在起作用;在接下來的 fail_timeout時間内,nginx不再将請求分發給失效的server。
健康檢查機制:
Nginx在檢測到後端伺服器故障後,nginx依然會把請求轉向該伺服器,當nginx發現timeout或者refused後,會把改請求會分發到upstream的其它節點,直到獲得正常資料後,nginx才會把資料傳回給使用者,這也便展現了nginx的異步傳輸,而lvs/haproxy/apache責無法做到這些(在lvs/haproxy/apache裡,每個請求都隻有一次機會,假如使用者發起一個請求,結果該請求分到的後端伺服器剛好挂掉了,那麼這個請求就失敗了)
本文轉自奔跑在路上部落格51CTO部落格,原文連結http://blog.51cto.com/qiangsh/1554624如需轉載請自行聯系原作者
qianghong000