千鋒扣丁學(xué)堂Linux培訓(xùn)之Nginx負(fù)載均衡TCP/UDP流
2019-07-04 14:10:03
2640瀏覽
今天千鋒扣丁學(xué)堂Linux培訓(xùn)老師給大家分享一篇關(guān)于Nginx負(fù)載均衡之TCP/UDP流的詳細(xì)介紹,首先負(fù)載均衡是指在多個(gè)后端服務(wù)器之間有效地分配網(wǎng)絡(luò)流量,下面我們一起來看一下吧。
從NGINXPlusR5[1]版本開始可以代理和負(fù)載均衡傳輸控制協(xié)議(TransmissionControlProtocol,TCP)通信。TCP是許多流行應(yīng)用程序和服務(wù)的協(xié)議,如LDAP、MySQL和RTMP。
從NGINXPlusR9[2]版本開始可以代理和負(fù)載平衡UDP流量。用戶數(shù)據(jù)報(bào)協(xié)議(UserDatagramProtocol,UDP)是許多流行的非事務(wù)性應(yīng)用程序的協(xié)議,如DNS、syslog和RADIUS。
反向代理
基礎(chǔ)條件
需要使用ngx_stream_core_module模塊,該模塊從版本1.9.0開始可用。這個(gè)模塊在默認(rèn)情況下是不構(gòu)建的,需使用--with-stream配置參數(shù)來啟用它。如下配置:
./configure --prefix=/usr/local/nginx --with-stream
配置反向代理
配置反向代理,以便NGINX打開資源,將來自客戶端的TCP連接或UDP數(shù)據(jù)報(bào)轉(zhuǎn)發(fā)到upstream組或代理服務(wù)器。
A.配置反向代理之前,看一下ngx_stream_core_module模塊中幾個(gè)元素的語法:
stream塊,在配置文件中是頂級塊,和http塊屬于同一級別,語法如下:
Syntax: stream { ... }
Default: —
Context: main
server塊,配置一個(gè)服務(wù)。在頂級stream{}上下文中為每個(gè)虛擬服務(wù)器定義一個(gè)或多個(gè)服務(wù)器配置塊。語法如下:
Syntax: server { ... }
Default: —
Context: stream
listen指令,設(shè)置服務(wù)器將接受連接的套接字的地址和端口。可以只指定端口。地址也可以是主機(jī)名,例如:
Syntax: listen address:port [ssl] [udp] [proxy_protocol] [backlog=number] [rcvbuf=size] [sndbuf=size] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
Default: —
Context: server
示例如下:
listen 127.0.0.1:12345;
listen *:12345;
listen 12345; # same as *:12345
listen localhost:12345;
listen指令在此默認(rèn)協(xié)議是TCP協(xié)議,對于UDP流,需要指定udp參數(shù),如下:
listen 12345 udp;
B.使用ngx_stream_proxy_module模塊(默認(rèn)是編譯進(jìn)來的)的proxy_pass指令配置代理,proxy_pass指令語法:
Syntax: proxy_pass address;
Default: —
Context: server
設(shè)置被代理服務(wù)器的地址。地址可以定義為一個(gè)域名或IP地址和一個(gè)端口號(hào):
proxy_pass localhost:12345;
或一個(gè)UNIX-domainsocket路徑:
proxy_pass unix:/tmp/stream.socket;
C.如果代理服務(wù)器有多個(gè)網(wǎng)絡(luò)接口,可以配置NGINX使用特定的源IP地址去連接upstream服務(wù)器。這可能很有用,當(dāng)一個(gè)代理服務(wù)器在nginx后面,并配置了接受來自特定IP網(wǎng)絡(luò)或IP地址范圍的連接。
使用ngx_stream_proxy_module模塊的proxy_bind指令,其語法:
Syntax: proxy_bind address [transparent] | off;
Default: —
Context: stream, server
#此指令在1.9.2版本中開始使用。
從指定的本地IP地址向被代理服務(wù)器發(fā)起外部連接。特殊值off取消從上層配置中繼承的proxy_bind指令產(chǎn)生的影響,允許系統(tǒng)自動(dòng)分配本地IP地址。
transparent參數(shù)(1.11.0+)允許從一個(gè)非本地IP地址發(fā)起到被代理服務(wù)器的外部連接,例如從一個(gè)客戶端的真實(shí)IP地址:
proxy_bind $remote_addr transparent;
為了使此參數(shù)起作用,通常需要使用超級用戶權(quán)限運(yùn)行nginx工作進(jìn)程。在Linux上,不需要(1.13.8+),就像指定了transparent參數(shù)一樣,工作進(jìn)程從主進(jìn)程繼承CAP_NET_RAW功能。還需要配置核心路由表以攔截來自被代理服務(wù)器的網(wǎng)絡(luò)流量。
示例配置如下:
stream {
# ...
server {
listen 127.0.0.1:12345;
proxy_pass backend.example.com:12345;
proxy_buffer_size 16k;
#proxy_bind 127.0.0.1:12345;
}
}
負(fù)載均衡
使用ngx_stream_upstream_module模塊(默認(rèn)是編譯進(jìn)來的)的upstream指令。指令語法:
Syntax: upstream name { ... }
Default: —
Context: stream
定義一組服務(wù)器。服務(wù)器可以偵聽不同的端口。此外,可以混合偵聽TCP和UNIX域套接字的服務(wù)器。
在頂級stream{}上下文中定義一個(gè)或多個(gè)upstream{}配置塊,并設(shè)置upstream組的名稱,例如TCP服務(wù)器的stream_backend和UDP服務(wù)器的dns_servers:
stream {
upstream stream_backend {
server backend1.example.com:12345;
server backend2.example.com:12345;
server backend3.example.com:12346;
}
upstream dns_servers {
server 192.168.136.130:53;
server 192.168.136.131:53;
}
}
配置upstream組使用的負(fù)載均衡方法??梢灾付ㄒ韵路椒ㄖ唬?br />
1.RoundRobin:默認(rèn)情況下,NGINX使用循環(huán)算法對流進(jìn)行負(fù)載平衡,將其順序指向配置的upstream組中的服務(wù)器。因?yàn)樗悄J(rèn)方法,所以沒有round-robin指令;只需在頂級stream{}上下文中創(chuàng)建upstream{}配置塊,
2.最少連接(LeastConnections)–nginx選擇當(dāng)前活動(dòng)連接數(shù)較少的服務(wù)器。
Syntax: least_conn;
Default: —
Context: upstream
3.最少時(shí)間-NGINXPlus選擇平均延遲最低且活動(dòng)連接數(shù)最少的服務(wù)器。用于計(jì)算最低平均延遲的方法取決于least_time指令中包含以下哪個(gè)參數(shù):
Syntax: least_time connect | first_byte | last_byte [inflight];
Default: —
Context: upstream
A.connect-連接upstream服務(wù)器的時(shí)間
B.first_byte-接收數(shù)據(jù)的第一個(gè)字節(jié)的時(shí)間
C.last_byte-從服務(wù)器接收完整響應(yīng)的時(shí)間,如果指定了inflight參數(shù)(1.11.6+),則還會(huì)考慮不完整的連接。
4.哈希-NGINX根據(jù)用戶定義的key,選擇服務(wù)器。
Syntax: hash key [consistent];
Default: —
Context: upstream
Hash負(fù)載平衡方法還用于配置會(huì)話持久性。由于散列函數(shù)基于客戶端IP地址,因此來自給定客戶端的連接始終傳遞到同一服務(wù)器,除非服務(wù)器已關(guān)閉或不可用。指定可選的consistent參數(shù)以應(yīng)用ketama一致性散列方法:
hash $remote_addr consistent;
5.random-每個(gè)連接將傳遞給隨機(jī)選擇的服務(wù)器。如果指定了two參數(shù),首先,NGINX會(huì)考慮服務(wù)器權(quán)重隨機(jī)選擇兩臺(tái)服務(wù)器,然后使用指定的方法選擇其中一臺(tái)服務(wù)器:
Syntax:random[two[method]];Default:—Context:upstreamThisdirectiveappearedinversion1.15.1.
A.least_conn-活動(dòng)連接數(shù)最少
B.least_time=connect-連接上游服務(wù)器的時(shí)間($upstream_connect_time)少了美元符號(hào)
C.least_time=first_byte-從服務(wù)器接收第一個(gè)數(shù)據(jù)字節(jié)的平均時(shí)間最短($upstream_first_byte_time)
D.least_time=last_byte-從服務(wù)器接收最后一個(gè)數(shù)據(jù)字節(jié)的平均時(shí)間最短($upstream_session_time)
隨機(jī)負(fù)載平衡方法應(yīng)該用于多個(gè)負(fù)載均衡器將請求傳遞到同一組后端的分布式環(huán)境.
示例:
stream {
upstream stream_backend {
hash $remote_addr consistent;
server backend1.example.com:12345 weight=5;
server backend2.example.com:12345;
server backend3.example.com:12346 max_conns=3;
}
upstream dns_servers {
least_conn;
server 192.168.136.130:53;
server 192.168.136.131:53;
}
}
完整示例
stream {
upstream stream_backend {
hash $remote_addr consistent;
server backend1.example.com:12345 weight=5;
server backend2.example.com:12345;
server backend3.example.com:12346 max_conns=3;
}
upstream dns_servers {
least_conn;
server 192.168.136.130:53;
server 192.168.136.131:53;
}
server {
listen 12345;
proxy_pass stream_backend;
proxy_buffer_size 16k;
#proxy_bind 127.0.0.1:12345;
}
server {
listen 53 udp;
proxy_pass dns_servers;
proxy_buffer_size 16k;
}
}
以上就是千鋒扣丁學(xué)堂Linux培訓(xùn)之Nginx負(fù)載均衡TCP/UDP流的全部內(nèi)容,
希望對大家的學(xué)習(xí)有所幫助,想要學(xué)好Linux開發(fā)小編給大家推薦口碑良好的扣丁學(xué)堂,扣丁學(xué)堂有專業(yè)老師制定的Linux學(xué)習(xí)路線圖輔助學(xué)員學(xué)習(xí),此外還有與時(shí)俱進(jìn)的Linux課程體系和Linux視頻教程供大家學(xué)習(xí),想要學(xué)好Linux開發(fā)技術(shù)的小伙伴快快行動(dòng)吧??鄱W(xué)堂Linux技術(shù)交流群:422345477。
【關(guān)注微信公眾號(hào)獲取更多學(xué)習(xí)資料】 【掃碼進(jìn)入HTML5前端開發(fā)VIP免費(fèi)公開課】
查看更多關(guān)于“Linux培訓(xùn)資訊”的相關(guān)文章>>
標(biāo)簽:
Linux培訓(xùn)
Linux視頻教程
紅帽Linux視頻
Linux學(xué)習(xí)視頻
Linux入門視頻
紅帽RHCE/RHCSA考試