我有一个使用硬编码端口8090的客户端。 我希望一台机器A运行该客户端的3个实例,因此每个客户端寻址不同的服务器。 3个服务器中的每一个都托管在一个专用容器中,这3个容器都托管在IP 8.8.4.4的计算机B上。 问题是每个客户端的地址都指向8.8.4.4:8090,但是我想将每个客户端路由到特定的容器。
我认为解决方案应该如下: 每个客户端将使用特定的IP地址,例如8.8.4.1、8.8.4.2、8.8.4.3。 我将以某种方式在机器A上映射IP 8.8.4.1、8.8.4.2、8.8.4.3,应将其映射到localhost。 有一个代理服务器将从8.8.4.1:8090转发到8.8.4.4:1000。 从端口1000到8090在容器c1处向前端口。 对其他2个IP执行相同操作。
我的主要空白是如何从IP 8.8.4.1映射回本地主机,以便代理服务器理解应该将其转发到8.8.4.4:1000。
图。 A,B都是Windows机器。
c1,c2,c3是容器。
A B
+--------------------+ +--------------------+
| | | 1000:8090 |
| | | +----------+ |
| | | | c1 | |
| +----------------------------------->+ | |
| | | +----------+ |
| | | 2000:8090 |
| | | +----------+ |
| +----------------------------------->+ c2 | |
| | | | | |
| | | +----------+ |
| | | 3000:8090 |
| | | +----------+ |
| +----------------------------------->+ c3 | |
| | | | | |
| | | +----------+ |
+--------------------+ +--------------------+
``
欢迎您提出想法!
答案 0 :(得分:0)
我建议您看看nginx
,接下来是用于路由的示例配置。
假设客户端全部运行在machineA上,而machineA的IP为8.8.4.5,nginx也运行在machineA上:
nginx.conf的一部分:
stream {
upstream server1 {
server 8.8.4.4:1000;
}
upstream server2 {
server 8.8.4.4:2000;
}
upstream server3 {
server 8.8.4.4:3000;
}
server {
listen 8090;
server_name nginx1;
proxy_pass server1;
}
server {
listen 8090;
server_name nginx2;
proxy_pass server2;
}
server {
listen 8090;
server_name nginx3;
proxy_pass server3;
}
}
然后在主机文件旁边添加
8.8.4.5 nginx1
8.8.4.5 nginx2
8.8.4.5 nginx3
客户端使用next连接:
如果您不想使用nginx的vhost,则可以直接在一个网卡上使用多个ip,则不需要设置主机文件。参见this。
PS:当然,如果您的客户端能够像我一开始所认为的那样绑定到不同的ip,则如下所示:
tcp_client.bind(('8.8.4.1', xxx))
tcp_client.connect((server_ip, server_port))
然后也可以使用remote_addr
来区分连接,如下所示:
stream {
upstream server1 {
server 8.8.4.4:1000;
}
upstream server2 {
server 8.8.4.4:2000;
}
upstream server3 {
server 8.8.4.4:3000;
}
server {
listen 8090;
if ($remote_addr ~* "8.8.4.1")
{
proxy_pass server1;
}
if ($remote_addr ~* "8.8.4.2")
{
proxy_pass server2;
}
if ($remote_addr ~* "8.8.4.3")
{
proxy_pass server3;
}
}
}