nginx 作为代理,使用特定的源 IP

nginx 作为代理,使用特定的源 IP

我使用 nginx 提供静态文件服务,并将其他请求代理到某个 Tomcat 实例。问题是我不知道如何选择 nginx 将使用哪个 IP 地址来连接 Tomcat。

每个 Tomcat 实例仅接受来自特定 IP 地址的 HTTP 连接。我的服务器有所有这些 IP。我只是无法选择 nginx 将使用哪一个。

这是我的配置文件:

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

location /integracao/ {
    proxy_pass http://X.X.X.X:9080/integracao/;
}

location /solr/ {
    proxy_pass http://Y.Y.Y.Y:8080/solr/;
}

我的服务器有一个带有两个 IP 地址的接口:A 和 B。我需要使用 IP A 连接到第一个 Tomcat,使用 IP B 连接到 Solr。

有人知道怎么做吗?

答案1

proxy_bind 指令允许您选择不同的源 IP 地址。

http://wiki.nginx.org/HttpProxyModule#proxy_bind

因此你的配置看起来将是这样的:

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

location /integracao/ {
    proxy_bind A.A.A.A;
    proxy_pass http://X.X.X.X:9080/integracao/;
}

location /solr/ {
    proxy_bind B.B.B.B;
    proxy_pass http://Y.Y.Y.Y:8080/solr/;
}

答案2

如果 nginx 无法做到这一点,您可以随时使用 netfilter 和 SNAT 使其看起来像 nginx 正在使用特定的 ip:

iptables -t nat -A POSTROUTING -p tcp --dport 9080 -d ip_of_your_backend -j SNAT --to one_of_ips_bound_to_nginx_server

答案3

搜索nginx 维基百科尤其是关于代理模块,我没有找到任何相关内容。

如果您有机会进行一些实验,我建议您在指令中尝试不同的值listen,并检查后端服务器上的访问日志以查看 nginx 来自哪个 IP 地址。

相关内容