O proxy reverso baseado no cabeçalho http no Nginx retorna 502 Bad Gateway

O proxy reverso baseado no cabeçalho http no Nginx retorna 502 Bad Gateway

Eu tenho um subdomínio DDNS sub1.dom1.comcom IP estático de (IP fictício) 99.88.77.66.55.

Eu tenho um domínio dom2.comhospedado fora do local com uma entrada DNS CNAME apontando sub2.dom2.compara sub3.dom2.como mesmo IP (novamente, fictício) 99.88.77.66.55.

Em 99.88.77.66.55, tenho uma LAN atrás do meu firewall. Nesta LAN, tenho três servidores:

  1. Um servidor web com FQDN local de www.local.lanpelo menos192.168.1.3:80
  2. Um servidor de aplicativos com FDQN local de app.local.lanpelo menos192.168.1.4:8069
  3. Um servidor de arquivos com FQDN local de fs.local.lanpelo menos192.168.1.5:2430

Veja o diagrama abaixo para esclarecimentos. Todos os três servidores estão rodando como servidores virtuais dentro de jails no mesmo sistema freeBSD (freeNAS).

Diagrama de rede

O que eu quero realizar

De acordo com o diagrama acima, desejo adicionar um servidor proxy reverso para ser executado em uma prisão no sistema mencionado acima. As solicitações da WAN precisam ser direcionadas ao servidor apropriado com base no nome do host fornecido no cabeçalho HTTP.

Considerações

  1. Fordwarding de porta padrão:Atualmente, acesso esses servidores através do simples encaminhamento de porta no roteador LAN. Esta é geralmente uma solução aceitável, no entanto, quando surge a necessidade de causar problemas na rede remotamente, torna-se um desafio manter relações diretas de porta WAN para LAN. Além disso, para outros usuários além de mim, que precisam acessar esses servidores, é mais fácil para eles não precisarem se lembrar dos números das portas.
  2. Aplicação DD-WRT:Como meu roteador está executando firmware DD-WRT com uma unidade USB de 4 GiB montada, procurei instalar e executar um servidor proxy reverso no roteador, usando Pound ou algo semelhante. Fiz uma extensa pesquisa na web procurando maneiras de fazer isso. O problema que encontro é que a maioria dos guias ou tutoriais são antigos e contêm links quebrados para os recursos necessários.
  3. Apache/Nginx:Qualquer um desses dois parece uma solução viável. No entanto, como as soluções DD-WRT que pesquisei, muitos dos guias fornecem links quebrados ou nenhum link para os recursos necessários. O outro obstáculo diante de mim com as opções Apache ou Nginx é que a maioria dos guias e tutoriais presumem que eu já sei tudo o que há para saber sobre Apache ou Nginx. Estou começando sem nenhuma experiência anterior com nenhuma das plataformas e estou disposto a aprender e experimentar para fazer as coisas funcionarem. Os guias e tutoriais mostram principalmente apenas as serverseções do código necessário. Além disso, são feitas suposições de que você já conhece as dependências necessárias e como implementá-las.

Passos que já dei

Nginx: Amostra do meu arquivo nginx.conf. É apenas uma porção. Existem outras serverseções para os outros servidores com os detalhes pertinentes alterados.

#nginx.conf

events {
  worker_connections 1024;
}

http {
  server {
    listen 80;
    server_name sub1.dom1.com #I've also tried www.lan.lan, here.
    access_log off;
    error_log off;
    location / {
      proxy_pass http://192.168.1.3:80/;
      proxy_redirect off;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_ass_x_forwarded_for;
      proxy_max_temp_file_size 0;
      client_max_body_size 10m;
      client_body_buffer_size 128k;
      proxy_connect_timeout 90;
      proxy_send_timeout 90;
      proxy_ready_timeout 90;
      proxy_buffer_size 4k;
      proxy_buffers 4 32k;
      proxy_busy_buffers_size 64k;
      proxy_temp_file_write_size 64k;
    }
  }
}

Isto, no entanto; retorna um erro 502 - Bad Gateway ao tentar se conectar.

Apache: Importante notar que eu estava tentando isso com o Apache22. Meu arquivo httpd.conf mais recente é assim:

LoadFile /usr/local/bin/libxml2.so
LoadModule proxy_html_module libexec/apache22/mod_proxy_html.so
LoadModule xml2enc_module libexec/apache22/mod_xl2enc.so

<VirtualHost *:80>
  ServerName sub1.dom1.com
  ServerAlias sub1.dom.com
  ProxyPass / http://192.168.1.3:80/
  ProxyPassReverse / http://192.168.1.3:80
</VirtualHost>

<VirtualHost *:80>
  ServerName sub2.dom2.com
  ServerAlias sub2.dom2.com
  ProxyPass / http://192.168.1.4:8069/
  ProxyPassReverse / http://192.168.1.4:8069
</VirtualHost>

<VirtualHost *:80>
  ServerName sub3.dom2.com
  ServerAlias sub3.dom2.com
  ProxyPass / http://192.168.1.5:2430/
  ProxyPass / http://192.168.1.5:2430
</VirtualHost

Quando tento iniciar o Apache22, usando:

service apache22 start

Eu recebo o seguinte:

Invalid command 'ProxyPass', perhaps misspelled or defined by a module not included in the server configuration

Depois de muita pesquisa, sei que isso provavelmente é causado pelo fato de eu mod_proxyter carregado apenas um dos muitos módulos necessários, o mod_proxy_htmlmódulo. A razão é que, após extensa pesquisa, só consegui encontrar um link funcional para este módulo específico.

Libra: Tive problemas ao tentar instalar o ipkg no DD-WRT. Isso pode ser devido à arquitetura atheos do meu roteador específico. Também encontrei muitos links quebrados, conforme mencionado anteriormente.


Ok, então, com a explicação prolixa fora do caminho, aqui está o que estou procurando na comunidade.

Dado que cheguei mais perto de usar o Nginx, como posso configurar corretamente meu nginx.confarquivo para fazer o que estou tentando fazer? O que está causando o erro 502 e como posso corrigi-lo?

Responder1

Para a solução nginx:

server_namedeve ser sempre o nome do host solicitado (no cabeçalho http).

  • Você poderia colocar *aqui para disponibilizar o conteúdo em qualquer domínio/host.

proxy_passnão deve terminar com /, exceto quando especialmente necessário.

Já vi 502 Bad gatewaymais comumente quando o nginx não consegue se conectar ao upsteam ( proxy_pass).

  • Você verificou sua política de firewall para DMZ->LAN?
  • Você verificou as error.logdicas?

informação relacionada