我们有一个业务需求,即通过单个 IP 地址传输来自多个处理服务器的所有传出连接。
我们的设置如下:
我们有一个 nginx 服务器,它充当传入 http 请求的负载平衡器。然后,我们还有多个 Web 服务器,它们连接到处理服务器,而处理服务器又连接到我们客户的数据库。
客户端 --> 负载均衡器 --> Web 服务器 --> 流程服务器 --> 数据库
客户端 <-- 负载均衡器 <-- Web 服务器 <-- 流程服务器 <-- 数据库
目前,我们为客户提供一份 IP 地址列表,供他们添加到数据库白名单中。但是,随着我们规模的扩大,这份白名单将变得越来越长,而我们的客户则需要再次更新他们的白名单。
所需设置
为了解决这个问题,我们希望将所有传出连接都通过另一个 nginx 服务器,这将屏蔽我们处理服务器的 IP 地址。这样,我们现在就只有一个 IP 地址可供客户列入白名单。
客户端 --> 负载均衡器 --> Web 服务器 --> 进程服务器 --> IP 屏蔽 --> 数据库
客户端<-- 负载均衡器<-- Web 服务器<-- 进程服务器<-- IP 屏蔽<-- 数据库
这仅通过 nginx 就可以实现吗?如果可以,我们需要采取哪些步骤来实现这一点?
答案1
另一个可能的解决方案是使用 NAT。在这种情况下,掩蔽服务器将是配置了网络地址转换的路由器。在这种情况下,您不需要在 node.js 配置中更改客户数据库 IP,但您应该更改网络,可能是所有进程服务器上的路由配置,并配置一个配置了 NAT 的网关
答案2
您所问的问题在 nginx 1.9.0 版及以上版本中均可实现。他们添加了 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;
}
}