nginx como proxy usando um ip de origem específico

10

Estou usando o nginx para atender a pedidos estáticos de arquivo e proxy para outras instâncias do Tomcat. O problema é que não sei como escolher qual endereço IP o nginx usará para conectar-se ao Tomcat.

Cada instância do Tomcat aceita apenas conexões HTTP de endereços IP específicos. Meu servidor tem todos esses IPs. Eu simplesmente não posso escolher qual deles usará o nginx.

Este é o meu arquivo de configuração:

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/;
}

Meu servidor possui uma interface com dois endereços IP: A e B. Preciso usar o IP A para conectar ao primeiro Tomcat e o IP B para conectar ao Solr.

Alguém sabe como fazer isso?

msbrogli
fonte

Respostas:

11

A diretiva proxy_bind permite escolher um endereço IP de origem diferente.

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

Portanto, sua configuração seria semelhante a:

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/;
}
Nopius
fonte
Esta diretiva não estava disponível no momento da minha pergunta. Está disponível desde a versão 0.8.22. Obrigado pela vossa ajuda :)
msbrogli 4/13
1

se o nginx não puder fazer isso, você sempre poderá usar o netfilter e o SNAT para fazer parecer que o nginx estava usando ip específico:

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

Pesquisando no wiki do nginx e principalmente na parte sobre o ProxyModule , não encontrei nada relacionado.

Se você tiver a possibilidade de experimentar um pouco, sugiro que tente valores diferentes na listendiretiva e verifique os logs de acesso no servidor de back-end para ver de onde vem o endereço IP nginx.

pkhamre
fonte