Wenn ein Webserver betrieben wird, kommt es ab und zu vor, dass verschiedene Subdomains einrichtet und diese an verschiedene Dienste weitergeleitet werden sollen. Am einfachsten teilt man jedem (Sub-)Domain eine eigene IP zu und macht das Ganze IP-basiert. Da IPv4-Adressen langsam rar werden, ist dies für die Meisten keine Option.
Eine einfache Alternative ist folgendes: Jede Subdomain zeigt auf die selbe IP-Adresse. Alle Requests werden von einem Zentralen Webserver angenommen und (wie bei einem LoadBalancer) auf verschiedene Ports/andere IPs/Dienste/… weitergeleitet.
Je nach Webserver/LoadBalancer hat man verschiedene Möglichkeiten zur Konfiguration. Man kann nach Subdomain sortieren, Dienste sogar für einzelne Unterverzeichnisse anders Umleiten oder sogar nach Cookies oder Header-Informationen ausschau halten. Speziell beim LoadBalancing kann dies von Vorteil sein.
Hier sind nun zwei Ausschnitte aus einer Webserver-Konfiguration, welche genau dies macht:
LigHTTPD
- “Standard Konfiguration” wurde weggelassen (Port 80, Standard-Pfad, etc)
- Leitet 3 Subdomains an verschiedene ports/IPs weiter
- Bei Lighttpd wird bei solchen Regeln immer die letzte gültige angewendet. Deshalb hat es vor dem 2. und 3. Subdomain ein “else”.
- Die Regeln sehen in etwa so aus: "Bedingung" { "Block mit Aktionen/Konfiguration" }
Bei den server-modulen sollte "mod_proxy" hinzugefügt werden.
# VHOSTS
$HTTP["host"] =~ "code\.mydomain\.com" {
    proxy.server = (
        "" => (
            "RhodeCode" => (
                "host" => "192.168.137.4",
                "port" => 5000
            )
        )
    )
}
else $HTTP["host"] =~ "jenkins\.mydomain\.com" {
    proxy.server = (
        "" => (
            "Jenkins" => (
                "host" => "127.0.0.1",
                "port" => 8080
            )
        )
    )
}
else $HTTP["host"] =~ "test\.mydomain\.com" {
    proxy.server = (
        "" => (
            "whatever" => (
                "host" => "127.0.0.1",
                "port" => 9000
            )
        )
    )
}
Apache
- Wir setzten wieder eine Standard-Konfiguration für Apache voraus
- Die Weiterleitungen werden als name based VHOST konfiguriert. Doku: https://httpd.apache.org/docs/2.4/vhosts/name-based.html
- Mittels Mod_Proxy werden die Requests dem jeweiligen Dienst/Port weitergeleitet.
- In dieser Konfiguration wurde gleich noch SSL mit eingebaut. Der Webserver akzeptiert SSL-Verbindungen, leitet an den anderen Service aber unverschlüsselte http-requests weiter. So kann zum Beispiel die gesamte SSL-Konfiguration für alle WebServices an einem zentralen Ort gemacht werden. Bei wirklich grossen Webseiten kann dies dann von einem eigenen Webserver erledigt werden.
LoadModule proxy_module modules/mod_proxy.so #Apache kann mit diversen Protokollen umgehen... http dürfte in der Regel das einfachste sein: #LoadModule proxy_ajp_module modules/mod_proxy_ajp.so #LoadModule proxy_balancer_module modules/mod_proxy_balancer.so #LoadModule proxy_connect_module modules/mod_proxy_connect.so #LoadModule proxy_ftp_module modules/mod_proxy_ftp.so LoadModule proxy_http_module modules/mod_proxy_http.so ServerName iro.mydomain.com:443 DocumentRoot "D:/web/htdocs" ServerAdmin webmaster@mydomain.com SSLEngine On SSLCertificateFile "mycert.crt" SSLCertificateChainFile "ca.pem" SSLCACertificateFile "ca.pem" SSLCertificateKeyFile "mycert.key" ProxyRequests Off Order deny,allow Allow from all ProxyPass / http://127.0.0.1:4201/ ProxyPassReverse / http://127.0.0.1:4201/
nginx
Vielen Dank an Nick, welcher mor folgende Konfiguration als Beispiel für nginx geschickt hat:
#user html;
worker_processes  8;
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
#pid        logs/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    #tcp_nopush     on;
    #keepalive_timeout  0;
    keepalive_timeout  65;
    #gzip  on;
    server {
        listen 80;
        listen [::]:80 ipv6only=on;
        server_name www.example.com;
        return 301 https://$server_name$request_uri;
    }
    server {
        listen       443;
        server_name  localhost;
        server_name  www.example.com;
        include common.conf;
        location / {
            root   /usr/share/nginx/data;
            index  index.html index.htm;
        }
    }
    server {
	listen 443;
	server_name subdomain1.example.com;
	include common.conf;
	location / {
	    proxy_pass http://192.168.1.163:5050;
	}
    }
    server {
	listen 443;
	server_name subdomain2.example.com;
	include common.conf;
	location / {
	   proxy_pass http://192.168.1.222:80;
	}
    }
}
    
  
Comments
Currently Deactivated - Contact me on Twitter, Mastodon or email if you have questions or suggestions.