前文我們聊到了nginx作為負載均衡的配置,前端nginx作為調度器調度http或https請求,回顧請參考https://www.cnblogs.com/qiuhom-1874/p/12458159.html;其實nginx面向客戶端一側它除了可以代理http或https的請求外,它還可以代理tcp的請求,因為nginx它本身工作在應用層,通常情況下我們把它代理tcp的請求叫做偽四層調度;在之前的文章中我們有說到過四層調度,比如LVS,它就是一個純粹的四層調度,用戶的請求報文根本就不會到達應用層,在TCP通信子網的三層或四層中就會把用戶的請求處理(轉發)調度給后端主機;早期版本的nginx是不支持tcp調度的,在1.9.0之后的版本中,nginx新增了ngx_stream_core_module模塊后,就支持對tcp請求的調度;我們來看看這個模塊的相關介紹吧!!!
一、ngx_stream_core_module:此模塊模擬了反代基於TCP或UDP的服務連接,即工作於傳輸層的反代或調度器;
1、stream {……}:此指令只能用於mian配置段中,主要用於定義stream相關的服務;
2、listen:定義監聽地址和端口;默認為tcp協議;此指令只能用於server 配置段中,表示定義虛擬主機的監聽地址和端口;
3、server:定義虛擬服務器,此指令只能用於stream的配置段中;表示定義虛擬服務器的屬性;用法類似http配置段的server用法;
二、ngx_stream_proxy_module:此模塊在1.9.0后的版本支持對tcp請求的代理,在1.9.13后的版本支持udp請求的代理和unix_domain sockets的代理;
1、 proxy_pass address:設置代理服務器的地址。地址可以指定為一個域名或IP地址,以及一個端口或者unix-domain socket路徑文件;
2、proxy_timeout time:設置客戶端或代理服務器連接上的兩個連續讀或寫操作之間的超時。如果在此時間內沒有傳輸數據,則連接關閉。默認時長是10分鍾;
3、proxy_connect_timeout time;設置nginx與被代理的服務器嘗試建立連接的超時時長;默認為60s;
三、ngx_stream_upstream_module:此模塊(1.9.0)用於定義可以由proxy_pass指令引用的服務器組。
1、upstream name {……}:此指令表示定義一個服務器組,以及組中各server的地址和屬性,用法同ngx_http_upstream_module中的upstream用法一致,兩者不同的是這里的upstream只能用於stream配置段,表示該組服務器是支持通過nginx基於tcp或udp協議進行調度;
2、server:定義組中服務器成員以及服務器屬性;用法同ngx_http_upstream_module中的server用法一致;
3、hash key:基於指定的key的hash表實現請求調度,此處的key可以文本、變量或二者的組合;同ngx_http_upstream_module中的hash指令用法一致;
4、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/