正如@Lochnair 提到的,您可以使用ngx_stream_map 模块和变量 $server_addr来解决此问题。这是我的例子。
我的主机IP是192.168.168.22
,我用keepalived绑定了2个虚拟IP eth0
。
$sudo ip a
...
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
link/ether 5c:f3:fc:b9:f0:84 brd ff:ff:ff:ff:ff:ff
inet 192.168.168.22/24 brd 192.168.168.255 scope global eth0
valid_lft forever preferred_lft forever
inet 192.168.168.238/32 scope global eth0
valid_lft forever preferred_lft forever
inet 192.168.168.239/32 scope global eth0
valid_lft forever preferred_lft forever
$nginx -v
nginx version: nginx/1.13.2
$cat /etc/nginx/nginx.conf
...
stream {
upstream pod53{
server 10.1.5.3:3306;
}
upstream pod54{
server 10.1.5.4:3306;
}
map $server_addr $x {
192.168.168.238 pod53;
192.168.168.239 pod54;
}
server {
listen 3306;
proxy_pass $x;
}
}
因此,我可以通过不同的 VIP 访问具有相同端口 3306 的不同 MySQL 服务。就像通过 diffrent 访问具有相同端口的不同 HTTP 服务一样server_name
。
192.168.168.238 -> 10.1.5.3
192.168.168.239 -> 10.1.5.4