Nginx 上游到具有不同绑定接口的同一服务器

Nginx 上游到具有不同绑定接口的同一服务器

我在一台具有两个不同网络接口的主机上运行 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 

相关内容