Proxy reverso baseado no cabeçalho http em Nginx retorna 502 Gateway inválido

0

Cenário

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

Eu tenho um domínio, dom2.com hospedado fora do site com uma entrada DNS CNAME apontando sub2.dom2.com e sub3.dom2.com para o mesmo IP (novamente, fictício), 99.88.77.66.55 .

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

  1. Um servidor da Web com o FQDN local de www.local.lan at 192.168.1.3:80
  2. Um servidor de aplicativos com FDQN local de app.local.lan at 192.168.1.4:8069
  3. Um servidor de arquivos com o FQDN local de fs.local.lan at 192.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).

O que eu quero realizar

De acordo com o diagrama acima, eu quero adicionar um servidor proxy reverso para executar dentro de uma cadeia no sistema mencionado acima. Solicitações da WAN precisam ser direcionadas para o servidor apropriado com base no nome do host fornecido no cabeçalho HTTP.

Considerações

  1. Standard Port Fordwarding: Atualmente, acesso esses servidores por meio do simples encaminhamento de porta no roteador LAN. Em geral, essa é uma solução aceitável, no entanto, quando surge a necessidade de causar problemas na rede remotamente, torna-se um desafio manter os relacionamentos diretos entre as portas WAN e LAN. Além disso, para usuários que não sejam eu mesmo, que precisam acessar esses servidores, é mais fácil para eles não terem que se lembrar dos números de porta.
  2. Aplicativo DD-WRT: Como meu roteador está executando o firmware DD-WRT com uma unidade USB de 4 GiB montada, examinei a instalação e a execução de um servidor proxy reverso no roteador, usando Pound ou algo similar. Eu fiz uma extensa pesquisa na web procurando maneiras para 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 ser 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 pressupõe que eu já saiba tudo o que há para saber sobre o Apache ou o Nginx. Eu estou começando sem nenhuma experiência anterior com qualquer uma das plataformas, e estou disposto a aprender e experimentar para fazer as coisas funcionarem. Os guias e tutoriais mostram principalmente apenas as seções server do código necessário. Além disso, são feitas suposições que você já conhece as dependências necessárias e como implementá-las.

Etapas que já tomei

Nginx: Amostra do meu arquivo nginx.conf. É apenas uma porção. Existem outras seções server 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;
    }
  }
}

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

Apache: Importante notar que eu estava tentando isso com o Apache22. Meu último arquivo httpd.conf é 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 que apenas um dos muitos módulos mod_proxy carregados, o módulo mod_proxy_html . A razão é que, depois de uma extensa pesquisa, só consegui encontrar um link de trabalho para esse módulo específico.

Pound: tive problemas ao tentar instalar o ipkg no DD-WRT. Isso pode ser devido à arquitetura atheos do meu roteador particular. Eu também encontrei muitos links quebrados como mencionado anteriormente.

Como você pode ajudar

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

Tendo em vista que cheguei mais perto usando o Nginx, como configurar corretamente meu arquivo nginx.conf para fazer o que estou tentando fazer? O que está causando o erro 502 e como corrigi-lo?

    
por Sirach Matthews 14.01.2017 / 23:40

1 resposta

0

Para a solução nginx:

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

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

proxy_pass não deve terminar com / , exceto especialmente necessário.

Eu vi 502 Bad gateway mais comumente quando o nginx não consegue se conectar ao upsteam ( proxy_pass ).

  • Você verificou sua política de firewall para a rede DMZ e LAN?
  • Você verificou o error.log de dicas?
por 03.03.2017 / 19:35