Nginx之負載均衡配置(二)

  • 2020 年 3 月 12 日
  • 筆記

  前文我們聊到了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上;

    提示:可以看到我們給不同的伺服器加上不同的權重後,客戶端的請求也就以不同比例調度到後端伺服器上;

  示例:

    提示:以上配置我們在原有的基礎上加了一組新負載均衡虛擬伺服器,用於代理後端兩台mariadb服務;

    提示:可以看到在默認情況下,nginx負載均衡是使用的rr輪詢的調度演算法;

  假如後端伺服器宕機了,nginx還會往後端宕機的伺服器上調度請求嗎?

  提示:可以看到nginx不管是基於http還是tcp調度用戶請求都會自動對後端伺服器做健康狀態檢測,當發現後端主機有服務不可用時,它就不會把用戶的請求調度到有問題的主機上;

有關nginx基於tcp做偽四層調度的方法,基本上同基於http協議的七層調度方法是一樣的,這裡就不過多演示;更多有關於nginx的指令和配置說明請參考nginx官方文檔http://nginx.org/en/docs/