我在一台具有两个不同网络接口的主机上运行 nginx。有一个上游主机,我每次只能通过一个本地接口连接它。这种情况是由于底层网络路由,流量将通过两个不同的网络路径之一流动。
我需要将上游的每个服务器绑定到不同的接口。如下所示:
stream {
upstream remote {
server 1.2.3.4:12345; # bind interface 1
server 1.2.3.4:12345 backup; # bind interface 2
}
server {
listen 12345;
proxy_pass remote;
}
}
我尝试使用中间 unix 套接字来解决这个问题,但由于 nginx 始终可以连接到 unix 套接字,因此它从不尝试备份。当无法通过接口 1 建立连接时,永远不会尝试通过接口 2 建立连接。
stream {
server {
listen unix:/tmp/1.sock;
proxy_pass 1.2.3.4:12345;
proxy_bind <interface 1>;
}
server {
listen unix:/tmp/2.sock;
proxy_pass 1.2.3.4:12345;
proxy_bind <interface 2>;
}
upstream remote {
server unix:/tmp/1.sock;
server unix:/tmp/2.sock backup;
}
server {
listen 12345;
proxy_pass remote;
}
}
编辑
我尝试了另一种方法,即在流级别设置 proxy_bind,但是当主上游关闭时,连接到 unix 套接字会失败bind(<interface 1>) (22:invalid argument)
(连接到 unix 域套接字时无法绑定到网络接口)。
stream {
proxy_bind <interface 1>;
server {
listen unix:/tmp/2.sock;
proxy_pass 1.2.3.4:12345;
proxy_bind <interface 2>;
}
upstream remote {
server 1.2.3.4:12345;
server unix:/tmp/2.sock backup;
}
server {
listen 12345;
proxy_pass remote;
}
}
答案1
搞清楚了。如果主机默认配置为通过接口 1 路由流量,那么我编辑的没有顶层的解决方案proxy_bind
将达到预期的效果。
我使用以下命令检查了主机路由:
$ ip route get 1.2.3.4
1.2.3.4 via <gateway> dev eth0 src <interface 1> uid 1000
cache