Reverse-Proxy basierend auf HTTP-Header in Nginx gibt 502 Bad Gateway zurück

Reverse-Proxy basierend auf HTTP-Header in Nginx gibt 502 Bad Gateway zurück

Ich habe eine DDNS-Subdomäne sub1.dom1.commit der statischen IP (fiktive IP) 99.88.77.66.55.

Ich habe eine dom2.comextern gehostete Domäne mit einem DNS-CNAME-Eintrag, sub2.dom2.comder sub3.dom2.comauf dieselbe (wiederum fiktive) IP verweist 99.88.77.66.55.

Bei 99.88.77.66.55habe ich ein LAN hinter meiner Firewall. In diesem LAN habe ich drei Server:

  1. Ein Webserver mit lokalem FQDN von www.local.lanmindestens192.168.1.3:80
  2. Ein Anwendungsserver mit lokalem FDQN von app.local.lanmindestens192.168.1.4:8069
  3. Ein Dateiserver mit lokalem FQDN von fs.local.lanmindestens192.168.1.5:2430

Zur Verdeutlichung siehe das Diagramm unten. Alle drei Server laufen als virtuelle Server in Jails auf demselben freeBSD-System (freeNAS).

Netzwerkdiagramm

Was ich erreichen möchte

Gemäß dem obigen Diagramm möchte ich einen Reverse-Proxy-Server hinzufügen, der in einem Jail auf dem oben genannten System ausgeführt wird. Anfragen aus dem WAN müssen basierend auf dem im HTTP-Header angegebenen Hostnamen an den entsprechenden Server weitergeleitet werden.

Überlegungen

  1. Standard-Hafenweiterleitung:Derzeit greife ich auf diese Server über eine einfache Portweiterleitung auf dem LAN-Router zu. Normalerweise ist das eine akzeptable Lösung, aber wenn es notwendig wird, das Netzwerk aus der Ferne zu stören, wird es zu einer Herausforderung, klare WAN-zu-LAN-Port-Beziehungen beizubehalten. Außerdem ist es für andere Benutzer als mich, die auf diese Server zugreifen müssen, einfacher, sich keine Portnummern merken zu müssen.
  2. DD-WRT-Anwendung:Da auf meinem Router die DD-WRT-Firmware läuft und ein 4-GiB-USB-Laufwerk installiert ist, habe ich mir überlegt, ob ich auf dem Router einen Reverse-Proxy-Server installieren und ausführen kann, beispielsweise mit Pound oder etwas Ähnlichem. Ich habe im Internet ausführlich nach Möglichkeiten gesucht, dies zu tun. Das Problem, auf das ich gestoßen bin, ist, dass die meisten Anleitungen oder Tutorials veraltet sind und nicht funktionierende Links zu den erforderlichen Ressourcen enthalten.
  3. Apache/Nginx:Beide scheinen eine praktikable Lösung zu sein. Wie bei den DD-WRT-Lösungen, die ich recherchiert habe, enthalten viele der Anleitungen jedoch entweder defekte oder gar keine Links zu den erforderlichen Ressourcen. Das andere Hindernis, das ich bei den Apache- oder Nginx-Optionen vor mir habe, ist, dass die meisten Anleitungen und Tutorials davon ausgehen, dass ich bereits alles über Apache oder Nginx weiß. Ich beginne ohne vorherige Erfahrung mit einer der beiden Plattformen und bin bereit zu lernen und zu experimentieren, um die Dinge zum Laufen zu bringen. Die Anleitungen und Tutorials zeigen meist nur die serverAbschnitte des erforderlichen Codes. Außerdem wird davon ausgegangen, dass Sie die erforderlichen Abhängigkeiten bereits kennen und wissen, wie diese implementiert werden.

Schritte, die ich bereits unternommen habe

Nginx: Beispiel aus meiner nginx.conf-Datei. Es ist nur ein Teil. Es gibt andere serverAbschnitte für die anderen Server mit den geänderten relevanten Details.

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

Beim Verbindungsversuch wird jedoch der Fehler 502 – Bad Gateway zurückgegeben.

Apache: Wichtig zu beachten ist, dass ich dies mit Apache22 versucht habe. Meine neueste httpd.conf-Datei sieht folgendermaßen aus:

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

Wenn ich versuche, Apache22 zu starten, verwende ich:

service apache22 start

Ich erhalte folgendes:

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

Nach langer Recherche weiß ich, dass dies höchstwahrscheinlich daran liegt, dass ich nur eines der vielen erforderlichen mod_proxyModule geladen habe, nämlich das mod_proxy_htmlModul. Der Grund dafür ist, dass ich nach umfangreicher Suche nur einen funktionierenden Link für dieses spezielle Modul finden konnte.

Pfund: Beim Versuch, ipkg auf DD-WRT zu installieren, traten Probleme auf. Dies könnte an der Atheos-Architektur meines Routers liegen. Wie bereits erwähnt, stieß ich auch auf viele defekte Links.


Ok, nachdem ich die langatmige Erklärung hinter mich gebracht habe, kann ich nun sagen, was ich von der Community erwarte.

Da ich mit Nginx am nächsten gekommen bin, wie kann ich meine nginx.confDatei richtig einrichten, damit sie das tut, was ich versuche? Was verursacht den 502-Fehler und wie behebe ich ihn?

Antwort1

Für die Nginx-Lösung:

server_namesollte immer der angeforderte Hostname sein (im HTTP-Header).

  • Sie können hier ein einfügen, *um den Inhalt auf jeder Domäne/jedem Host verfügbar zu machen.

proxy_passsollte nicht mit einem enden /, außer in besonders erforderlichen Fällen.

Am häufigsten habe ich gesehen 502 Bad gateway, dass Nginx keine Verbindung zum Upstream herstellen kann ( proxy_pass).

  • Haben Sie Ihre Firewall-Richtlinie für DMZ->LAN überprüft?
  • Haben Sie error.lognach Hinweisen gesucht?

verwandte Informationen