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.