通常我們會使用Nginx做反向代理和負載均衡,都是http協議,其實Nginx還可以轉發TCP,而且配置基本很相似 (下面的原理也適用於http)。
原理圖如下:
![java編程——Nginx轉發TCP如何實現負載均衡](http://p2.ttnews.xyz/loading.gif)
正向代理和反向代理
正向代理:就是我們所說的代理,例如客戶向服務器A發請求,但是A不接受除了服務器B以外的請求,然後客戶委託服務器B向服務器A發請求,然後通過服務器B做中間人傳輸信息。這個過程是對服務器A是透明的,它只知道和服務器B通信。
反向代理:正向代理是客戶委託,那麼反向代理就是服務器做委託。例如客戶向服務器A做請求,但是服務器A不知道怎麼處理,那麼A就委託服務器B處理,然後把結果返回給客戶,這個過程對客戶是透明的。
所有負載均衡就是利用了反向代理,把客戶的請求分發到不同的主機上處理,客戶並不需要知道處理的過程。
負載均衡策略
Nginx 提供輪詢(round robin)、IP 哈希(client IP)和加權輪詢 3 種方式,默認情況下,Nginx 採用的是輪詢。
輪詢(默認)
每個請求按時間順序逐一分配到不同的後端服務器,如果後端服務器down掉,能自動剔除。
加權輪詢
指定輪詢幾率,weight和訪問比率成正比,用於後端服務器性能不均的情況。
ip_hash
每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端服務器,可以解決session的問題。
重試策略
可以為每個 backserver 指定最大的重試次數,和重試時間間隔,所使用的關鍵字是 max_fails 和 fail_timeout。
熱機策略
當所有的非備機(non-backup)都宕機(down)或者繁忙(busy)的時候,就會使用由 backup 標註的備機。必須要注意的是,backup 不能和 ip_hash 關鍵字一起使用。
在nginx.conf文件配置,是和http同級的
stream {
upstream backend {
#hash $remote_addr consistent;
server 10.118.12.92:10001 weight=5;
#server 127.0.0.1:12345 max_fails=3 fail_timeout=30s;
#server unix:/tmp/backend3;
}
server {
listen 10001;
proxy_connect_timeout 5s;
proxy_timeout 3600s;
proxy_pass backend;
}
}
注意如果放在http裡面,那麼這個配置就是負載均衡http了。
![java編程——Nginx轉發TCP如何實現負載均衡](http://p2.ttnews.xyz/loading.gif)
閱讀更多 Java高併發框架 的文章