我使用 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 地址。