Donnerstag, 25. Juli 2013

Bereitstellung von Webserverdiensten (http, https) auf einer virtuellen Maschine mit nginx als Reverse Proxy (Teil 1)

Problembeschreibung

Ein Serversystem mit öffentlicher IP (200.200.200.200) virtualisiert mehrere Gast(Server)systeme welche HTTP, MAIL, SVN(SSH) usw. bereitstellen. Als Virtualisierungslösung verwenden wir kvm mit libvirt. Als Netzwerkmodus wird "nat" verwendet, da die Gäste keine öffentlichen Adressen bekommen sollen. Die Standardkonfiguration lässt in diesen Modus die Kommunikation des Gasts nach aussen hin zu (MASQUERADING), schirmt diesen jedoch beim Zugriff auf ihn selbst ab.
Wir haben auf den Gastsystem (192.168.100.10, 192.168.100.11) bereits HTTP Server (lighttp, apache) eingerichtet. Diese warten auf Port 80 auf eingehende Anfragen. Die Webserver sollen über www.mindfab.net (192.168.100.10) und über cms.mindfab.net (192.168.100.11) erreichbar sein. Dieses Problem lässt sich mit einfachen Portforwarding nicht lösen, da wir in Abhängigkeit von dem Servernamen (www.mindfab.net oder cms.mindfab.net) auf unterschiedliche IP-Adressen (http Server) zugreifen. Als Lösung dieses Problems bietet sich nginx, ein open source web Server und reverse proxy Server an.

Lösungsansatz

Als erstes sollten wir sicherstellen das unsere HTTP Server auf den Gästen ordnungsgemäss funktionieren und über die entsprechenden IP Adressen erreichbar sind. Dies kann man bspw. mit lynx überprüfen. Von unseren Host System aus überprüfen wir also folgendes...
lynx http://192.168.100.10
lynx http://192.168.100.11
Bei beiden Kommandos sollte die "default" Webseite erscheinen.

Als nächstes installieren wir nginx auf unseren Host...

apt-get install nginx
und beginnen mit der entsprechenden Konfiguration.

vim /etc/nginx/conf.d/default.conf
## 192.168.100.10 -> www.mindfab.net ##
upstream wwwmindfabnet  {
      server 192.168.100.10:80;
}
 
## 192.168.100.11 -> cms.mindfab.net ##
upstream cmsmindfabnet  {
      server 192.168.100.11:80;
}
 
## Start www.mindfab.net ##
server {
    listen       200.200.200.200:80;
    server_name  www.mindfab.net;
 
    access_log  /var/log/nginx/www.mindfab.net.access.log;
    error_log  /var/log/nginx/www.mindfab.net.error.log;
    root   /usr/share/nginx/www;
    index  index.html index.htm;
 
    ## send request back to www.mindfab.net ##
    location / {
     proxy_pass  http://wwwmindfabnet;     
     proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
     proxy_redirect off;
     proxy_buffering off;
     proxy_set_header        Host            $host;
     proxy_set_header        X-Real-IP       $remote_addr;
     proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
   }
}
## End www.mindfab.net ##
 
## START cms.mindfab.net ##
server {
   listen      200.200.200.200:80;
   server_name cms.mindfab.net;
   access_log  /var/log/nginx/cms.mindfab.net.access.log;
   error_log   /var/log/nginx/cms.mindfab.net.error.log;
   root        /usr/local/nginx/www;
   index       index.html;
 
   location / {
        proxy_pass  http://cmsmindfabnet;        
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        proxy_redirect off;
        proxy_buffering off;
        proxy_set_header        Host            cms.mindfab.net;
        proxy_set_header        X-Real-IP       $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
## END cms.mindfab.net  ##
 Nun starten wir den Daemon neu und testen anschliessend den Reverse Proxy.
service nginx restart
lynx http://www.mindfab.net # sollte uns den Inhalt des Webservers auf 192.168.100.10 anzeigen
lynx http://cms.mindfab.net # sollte uns den Inhalt des Webservers auf 192.168.100.11 anzeigen
Anmerkung: Selbstverständlich müssen wir sicherstellen das www.mindfab.net und cms.mindfab.net beide auf die IP Adresse 200.200.200.200 auflösen. Dies können wir durch eine entsprechende Konfiguration unseres DNS Servers erreichen. Für Testzwecke kann man aber auch zwei Einträge in seine /etc/hosts Datei anlegen.

Im 2.Teil werden wir unseren Reverse Proxy um SSL erweitern.

Referenzen:

  • http://www.cyberciti.biz/tips/using-nginx-as-reverse-proxy.html

Keine Kommentare:

Kommentar veröffentlichen