Nginx 實現(xiàn) TCP/DUP流量按 IP 動態(tài)轉(zhuǎn)發(fā)操作方法

Nginx Stream TCP 協(xié)議按 IP 轉(zhuǎn)發(fā)
背景
為了優(yōu)化網(wǎng)絡(luò)性能和提升服務(wù)的可用性,我們需要在 Nginx 中配置 stream 模塊,使其根據(jù)客戶端的 IP地址 將 TCP 請求 動態(tài)轉(zhuǎn)發(fā)到不同的后端服務(wù)器節(jié)點。此需求適用于場景如數(shù)據(jù)庫代理(如 MySQL)、TCP 服務(wù)負(fù)載均衡、以及地域或來源IP分流的流量調(diào)度。
需求目標(biāo)
- 按客戶端 IP 路由:
- 系統(tǒng)需根據(jù)客戶端的來源 IP,將 TCP 請求智能地轉(zhuǎn)發(fā)到指定的后端服務(wù)器節(jié)點。
- 支持自定義 IP 段或單個 IP 的匹配規(guī)則。
- 后端節(jié)點配置:
- 后端服務(wù)器節(jié)點可能為多臺,并且每個節(jié)點對應(yīng)不同的業(yè)務(wù)數(shù)據(jù)或服務(wù)端口。
- 默認(rèn)情況下,如果 IP 未匹配任何指定規(guī)則,需將請求轉(zhuǎn)發(fā)到預(yù)設(shè)的默認(rèn)節(jié)點。
- 負(fù)載均衡與健康檢查(可選):
- 每個后端節(jié)點需要支持健康檢查機制,當(dāng)某個節(jié)點不可用時自動切換到其他節(jié)點。
- 系統(tǒng)應(yīng)具有一定的容錯能力,避免單點故障影響整體服務(wù)。
- 日志與監(jiān)控:
- Nginx 需記錄所有連接的來源 IP 及其轉(zhuǎn)發(fā)的后端服務(wù)器節(jié)點,支持日志分析與故障排查。
- 系統(tǒng)需兼容現(xiàn)有的日志采集與監(jiān)控平臺,實現(xiàn)對轉(zhuǎn)發(fā)情況的實時監(jiān)控。
- 可擴展性:
- 配置應(yīng)支持動態(tài)擴展,即可在不重啟 Nginx 的情況下更新 IP 路由規(guī)則或后端節(jié)點。
- 后端節(jié)點可根據(jù)業(yè)務(wù)需求隨時增加或減少。
使用場景
- 數(shù)據(jù)庫代理:根據(jù)客戶端所在的網(wǎng)絡(luò)段,將數(shù)據(jù)庫查詢請求分發(fā)到不同的數(shù)據(jù)中心。
- TCP 業(yè)務(wù)調(diào)度:如按地域 IP 將 TCP 連接轉(zhuǎn)發(fā)到最近的服務(wù)器節(jié)點,提升訪問速度。
- 安全過濾:部分高風(fēng)險 IP 或網(wǎng)絡(luò)段的請求可路由到專用節(jié)點進(jìn)行安全處理。
成功標(biāo)準(zhǔn)
- 按 IP 匹配的請求能正確轉(zhuǎn)發(fā)到目標(biāo)后端服務(wù)器。
- 未匹配的請求能轉(zhuǎn)發(fā)到默認(rèn)節(jié)點,且整體服務(wù)穩(wěn)定。
- 后端服務(wù)器節(jié)點狀態(tài)異常時,能自動切換到其他可用節(jié)點。
技術(shù)要求
- 使用 Nginx 的 stream 模塊 實現(xiàn) TCP 轉(zhuǎn)發(fā)。
- 支持 TCP 協(xié)議的端口監(jiān)聽和請求代理。
- 后續(xù)可能擴展到 UDP 支持,因此設(shè)計應(yīng)考慮模塊化和擴展性。
Ng配置
stream {
upstream socket_proxy1 {
hash $remote_addr consistent;
# 轉(zhuǎn)發(fā)的目的地址和端口
server 20.100.105.172:6789;
}
upstream socket_proxy2 {
hash $remote_addr consistent;
# 轉(zhuǎn)發(fā)的目的地址和端口
server 20.100.105.250:6789;
}
map $remote_addr $socket_proxy {
20.101.106.69 socket_proxy1; # 或者是 CIDR格式的IP段
20.101.106.68 socket_proxy2;
default socket_proxy2; # 默認(rèn)轉(zhuǎn)發(fā)的節(jié)點
}
server {
listen 4321;
proxy_connect_timeout 600s;
proxy_timeout 600s;
#動態(tài)選擇后端節(jié)點
proxy_pass $socket_proxy;
}
log_format detailed '$remote_addr [$time_local] '
'$protocol $status $bytes_sent $bytes_received '
'$session_time $upstream_addr '
'"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';
map $time_iso8601 $logdate {
default 'date-not-found';
'~^(?<ymd>\d{4}-\d{2}-\d{2})' $ymd;
}
access_log logs/stream-access-$logdate.log detailed;
}- stream 塊:用于處理基于 TCP 或 UDP 的流量。
- upstream:定義了不同的后端服務(wù)器組。
- map 指令:根據(jù)客戶端的 IP地址,將請求映射到不同的后端組。
- server:定義一個 TCP 端口監(jiān)聽服務(wù),并將連接動態(tài)轉(zhuǎn)發(fā)給對應(yīng)的后端
在完成配置后,使用以下命令驗證 Nginx 配置是否正確:
nginx -t
重新加載 Nginx 服務(wù)
nginx -s reload
測試驗證 使用客戶端工具(如 telnet 或 nc)從指定 IP 進(jìn)行連接。從stream的日志中確認(rèn)請求是否正確轉(zhuǎn)發(fā)到對應(yīng)的后端服務(wù)器。
到此這篇關(guān)于Nginx 實現(xiàn) TCP/DUP流量的按 IP 動態(tài)轉(zhuǎn)發(fā)的文章就介紹到這了,更多相關(guān)Nginx TCP/DUP流量轉(zhuǎn)發(fā)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
nginx代理實現(xiàn)靜態(tài)資源訪問的示例代碼
本文主要介紹了nginx代理實現(xiàn)靜態(tài)資源訪問的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06
Nginx實現(xiàn)高可用集群構(gòu)建(Keepalived+Haproxy+Nginx)
為什么需要搭建Nginx集群?為了防止Nginx單點故障造成服務(wù)器癱瘓,本文介紹了Nginx實現(xiàn)高可用集群構(gòu)建(Keepalived+Haproxy+Nginx),感興趣的可以了解一下2021-05-05
Nginx+uwsgi+ssl配置https的詳細(xì)步驟
nginx是一個輕量級的web服務(wù)器,在處理靜態(tài)資源和高并發(fā)有優(yōu)勢,uwsgi是一個基于python的高效率的協(xié)議,處理后端和動態(tài)網(wǎng)頁有優(yōu)勢,我這里使用的是Ubuntu18.04版本,服務(wù)器在阿里云,感興趣的朋友跟隨小編一起看看吧2023-10-10
zabbix自定義監(jiān)控nginx狀態(tài)實現(xiàn)過程
這篇文章主要為大家介紹了zabbix如何自定義監(jiān)控nginx狀態(tài)的實現(xiàn)過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10
nginx日志導(dǎo)入elasticsearch的方法示例
這篇文章主要介紹了nginx日志導(dǎo)入elasticsearch的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
針對OpenSSL安全漏洞調(diào)整Nginx服務(wù)器的方法
這篇文章主要介紹了針對OpenSSL漏洞調(diào)整Nginx服務(wù)器的方法,2014年爆出的SSL安全漏洞震驚了全世界,需要的朋友可以參考下2015-06-06

