我們的業務要求是透過單一 IP 位址引導來自多個處理伺服器的所有傳出連線。
我們的設定如下:
我們有一個 nginx 伺服器,它充當傳入 http 請求的負載平衡器。然後,我們有多個網頁伺服器,它們連接到處理伺服器,而處理伺服器連接到我們的客戶資料庫。
客戶端 --> 負載平衡器 --> Web 伺服器 --> 進程伺服器 --> 資料庫
用戶端 <-- 負載平衡器 <-- Web 伺服器 <-- 進程伺服器 <-- 資料庫
目前,我們為客戶提供了一個 IP 位址列表,他們應該將其添加到資料庫白名單中。然而,隨著我們規模的擴大,這個白名單將會變得更長,而我們的客戶又需要分別再次更新他們的白名單。
所需設定
為了解決這個問題,我們希望透過另一個 nginx 伺服器引導所有傳出連接,這將封鎖我們處理伺服器的 IP 位址。反過來,我們現在只有一個 IP 位址可供客戶列入白名單。
用戶端 --> 負載平衡器 --> Web 伺服器 --> 進程伺服器 --> IP 封鎖 --> 資料庫
用戶端 <-- 負載平衡器 <-- Web 伺服器 <-- 進程伺服器 <-- IP 封鎖 <-- 資料庫
僅使用 nginx 是否可以實現這一點?
答案1
另一個可能的解決方案是使用 NAT。在這種情況下,屏蔽伺服器將是配置了網路位址轉換的路由器。在這種情況下,您不需要在 node.js 配置中更改客戶資料庫 IP,但您應該更改網絡,可能是所有進程伺服器上的路由配置,並配置一個配置了 NAT 的網關
答案2
從 1.9.0 版本開始,nginx 就可以實現您的要求。他們添加了 tcp(不是 http)代理支援。從 1.9.13 開始,他們還增加了 udp 代理程式。讀https://www.nginx.com/resources/admin-guide/tcp-load-balancing/#upstream 和https://nginx.ru/en/docs/stream/ngx_stream_proxy_module.html
棘手的部分是區分(IP 遮罩 nginx)上的傳入連接,以決定連接哪個資料庫。在 HTTP 代理中,您可以使用主機名稱。在 tcp 代理中,您應該偵聽不同的連接埠或不同的 IP 位址。 nginx.conf:
worker_processes 4;
error_log /var/log/nginx/error.log;
events { worker_connections 1024; }
stream {
server {
listen 3307;
proxy_pass client2.db.dev:3306;
proxy_buffer_size 16k;
}
server {
listen 3308;
proxy_pass client1.db.dev:3306;
proxy_buffer_size 16k;
}
}