前文咱們聊到了nginx做爲負載均衡的配置,前端nginx做爲調度器調度http或https請求,回顧請參考http://www.javashuo.com/article/p-tdqnqrnw-cn.html;其實nginx面向客戶端一側它除了能夠代理http或https的請求外,它還能夠代理tcp的請求,由於nginx它自己工做在應用層,一般狀況下咱們把它代理tcp的請求叫作僞四層調度;在以前的文章中咱們有說到過四層調度,好比LVS,它就是一個純粹的四層調度,用戶的請求報文根本就不會到達應用層,在TCP通訊子網的三層或四層中就會把用戶的請求處理(轉發)調度給後端主機;早期版本的nginx是不支持tcp調度的,在1.9.0以後的版本中,nginx新增了ngx_stream_core_module模塊後,就支持對tcp請求的調度;咱們來看看這個模塊的相關介紹吧!!!html
1、ngx_stream_core_module:此模塊模擬了反代基於TCP或UDP的服務鏈接,即工做於傳輸層的反代或調度器;前端
一、stream {……}:此指令只能用於mian配置段中,主要用於定義stream相關的服務;mysql
二、listen:定義監聽地址和端口;默認爲tcp協議;此指令只能用於server 配置段中,表示定義虛擬主機的監聽地址和端口;nginx
三、server:定義虛擬服務器,此指令只能用於stream的配置段中;表示定義虛擬服務器的屬性;用法相似http配置段的server用法;算法
2、ngx_stream_proxy_module:此模塊在1.9.0後的版本支持對tcp請求的代理,在1.9.13後的版本支持udp請求的代理和unix_domain sockets的代理;sql
一、 proxy_pass address:設置代理服務器的地址。地址能夠指定爲一個域名或IP地址,以及一個端口或者unix-domain socket路徑文件;後端
二、proxy_timeout time:設置客戶端或代理服務器鏈接上的兩個連續讀或寫操做之間的超時。若是在此時間內沒有傳輸數據,則鏈接關閉。默認時長是10分鐘;服務器
三、proxy_connect_timeout time;設置nginx與被代理的服務器嘗試創建鏈接的超時時長;默認爲60s;負載均衡
3、ngx_stream_upstream_module:此模塊(1.9.0)用於定義能夠由proxy_pass指令引用的服務器組。dom
一、upstream name {……}:此指令表示定義一個服務器組,以及組中各server的地址和屬性,用法同ngx_http_upstream_module中的upstream用法一致,二者不一樣的是這裏的upstream只能用於stream配置段,表示該組服務器是支持經過nginx基於tcp或udp協議進行調度;
二、server:定義組中服務器成員以及服務器屬性;用法同ngx_http_upstream_module中的server用法一致;
三、hash key:基於指定的key的hash表實現請求調度,此處的key能夠文本、變量或兩者的組合;同ngx_http_upstream_module中的hash指令用法一致;
四、least_conn:定義調度算法爲最近最少鏈接算法;當server擁有不一樣的權重時爲wlc;當全部後端主機的鏈接數相同時,則使用wrr進行調度;
示例:
提示:以上配置在/etc/nginx/nginx.conf這個主配置文件中的main配置段中配置,表示把/etc/nginx/conf.d/stream.d/下的全部以.conf的文件導入到該位置,這樣配置咱們就能夠把stream配置段單獨的用一個文件來書寫,方便管理;
提示:以上配置表示在stream配置段中定義一個服務器組,名稱爲sshserver,該組下有兩個服務器,分別是0.20的22號端口,和0.22的22號端口;而且在stream配置段中定義了一個虛擬主機,監聽在192.168.0.30的41319號端口,該虛擬主機做用是接受用戶的請求,而且基於用戶的請求把用戶請求代理到到sshserver組上,代理超時時間爲60s,若是客戶端請求該虛擬主機,在60s未獲得任何響應,將被斷開;設置nginx與被代理服務器創建鏈接的超時時長爲10s;有了以上配置,咱們就能夠經過訪問192.168.0.30:41319這個socket就能夠實現遠程鏈接後端服務器;
提示:從上面的現實結果咱們能夠看到nginx此時能夠代理ssh,並且仍是以輪詢的方式向後端服務器調度客戶端的請求;以這樣的邏輯,咱們不難想象它能夠基於tcp或udp代理其餘應用層協議,好比nginx代理mysql也能夠用相似的配置來代理後端mysql服務器;
固然咱們也能夠給不一樣的服務器給定不一樣的權重,這個配置同咱們上一篇文中的配置相同,都是用weight來指定權重;
提示:以上配置就表示給定0.20的權重爲5,0.22的權重爲2,也就是說7個請求中有5個會被調度到0.20上,有2個會被調度到0.22上;
提示:能夠看到咱們給不一樣的服務器加上不一樣的權重後,客戶端的請求也就以不一樣比例調度到後端服務器上;不加權重默認是1;
示例:
提示:以上配置咱們在原有的基礎上加了一組新負載均衡虛擬服務器,用於代理後端兩臺mariadb服務;
提示:能夠看到在默認狀況下,nginx負載均衡是使用的rr輪詢的調度算法;
假如後端服務器宕機了,nginx還會日後端宕機的服務器上調度請求嗎?
提示:能夠看到nginx不論是基於http仍是tcp調度用戶請求都會自動對後端服務器作健康狀態檢測,當發現後端主機有服務不可用時,它就不會把用戶的請求調度到有問題的主機上;
有關nginx基於tcp作僞四層調度的方法,基本上同基於http協議的七層調度方法是同樣的,這裏就不過多演示;更多有關於nginx的指令和配置說明請參考nginx官方文檔http://nginx.org/en/docs/