Apache/HTTP/Virtuelle Server/Beispiele: Unterschied zwischen den Versionen

Aus Foxwiki
 
(2 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 87: Zeile 87:
Beachten Sie auch, dass Sie im obigen Beispiel die Liste der IP-Adressen durch * ersetzen können, was dazu führt, dass der Server auf alle Adressen gleich antwortet.
Beachten Sie auch, dass Sie im obigen Beispiel die Liste der IP-Adressen durch * ersetzen können, was dazu führt, dass der Server auf alle Adressen gleich antwortet.


=== Betrieb verschiedener Websites auf verschiedenen Ports ===
=== Verschiedene Websites auf verschiedenen Ports ===


Sie haben mehrere Domänen, die auf dieselbe IP-Adresse verweisen, und möchten auch mehrere Ports bedienen.
Sie haben mehrere Domänen, die auf dieselbe IP-Adresse verweisen, und möchten auch mehrere Ports bedienen.
Zeile 129: Zeile 129:
</syntaxhighlight>
</syntaxhighlight>


Anfragen an eine Adresse, die nicht in einer der <VirtualHost>-Direktiven angegeben ist (z.
Anfragen an eine Adresse, die nicht in einer der <VirtualHost>-Direktiven angegeben ist (z.&nbsp;B.&nbsp;localhost), werden an den Hauptserver weitergeleitet, sofern ein solcher vorhanden ist.
* B.
* localhost), werden an den Hauptserver weitergeleitet, sofern ein solcher vorhanden ist.
top
Gemischte port- und ip-basierte virtuelle Hosts


Der Server-Rechner hat zwei IP-Adressen(172.20.30.40 und 172.20.30.50), die zu den Namen www.example.com bzw.
=== Gemischte port- und ip-basierte virtuelle Hosts ===
* www.
Der Server-Rechner hat zwei IP-Adressen(172.20.30.40 und 172.20.30.50), die zu den Namen www.example.com bzw. www.example.org aufgelöst werden.
* example.orgaufgelöst werden.
* In beiden Fällen wollen wir Hosts auf den Ports 80 und 8080 ausführen.
* In beiden Fällen wollen wir Hosts auf den Ports 80 und 8080 ausführen.
<syntaxhighlight lang="apache" line>
<syntaxhighlight lang="apache" line>
Listen 172.20.30.40:80
Listen 172.20.30.40:80
Zeile 203: Zeile 199:
_Standard_ vhosts für alle Ports
_Standard_ vhosts für alle Ports


Abfangen jeder Anfrage an eine nicht spezifizierte IP-Adresse und einen nicht spezifizierten Port, d .
Abfangen jeder Anfrage an eine nicht spezifizierte IP-Adresse und einen nicht spezifizierten Port, d.&nbsp;h.&nbsp;eine Kombination aus Adresse und Port, die für keinen anderen virtuellen Host verwendet wird.
* h.
* eine Kombination aus Adresse und Port, die für keinen anderen virtuellen Host verwendet wird.
<syntaxhighlight lang="apache" line>
<syntaxhighlight lang="apache" line>
<VirtualHost _default_:*>
<VirtualHost _default_:*>
Zeile 218: Zeile 212:


Sie können AliasMatch oder RewriteRule verwenden, um jede Anfrage auf eine einzelne Informationsseite (oder ein Skript) umzuschreiben.
Sie können AliasMatch oder RewriteRule verwenden, um jede Anfrage auf eine einzelne Informationsseite (oder ein Skript) umzuschreiben.
_Standard_ vhosts für verschiedene Ports
 
=== _Standard_ vhosts für verschiedene Ports ===


Wie Setup 1, aber der Server lauscht auf mehreren Ports und wir wollen einen zweiten _Standard_ vhost für Port 80 verwenden.
Wie Setup 1, aber der Server lauscht auf mehreren Ports und wir wollen einen zweiten _Standard_ vhost für Port 80 verwenden.
Zeile 235: Zeile 230:
Der Standard-Vhost für Port 80 (der vor jedem Standard-Vhost mit einem Wildcard-Port stehen muss ) fängt alle Anfragen ab, die an eine nicht spezifizierte IP-Adresse gesendet wurden.
Der Standard-Vhost für Port 80 (der vor jedem Standard-Vhost mit einem Wildcard-Port stehen muss ) fängt alle Anfragen ab, die an eine nicht spezifizierte IP-Adresse gesendet wurden.
* Der Hauptserver wird nie zur Bearbeitung einer Anfrage verwendet.
* Der Hauptserver wird nie zur Bearbeitung einer Anfrage verwendet.
_Standard_ vhosts für einen Anschluss
 
=== _Standard_ vhosts für einen Port ===


Wir möchten einen Standard-Vhost für Port 80 haben, aber keine anderen Standard-Vhosts.
Wir möchten einen Standard-Vhost für Port 80 haben, aber keine anderen Standard-Vhosts.
Zeile 249: Zeile 245:


Jede Verwendung von * in einer Deklaration eines virtuellen Hosts hat einen höheren Vorrang als _default_.
Jede Verwendung von * in einer Deklaration eines virtuellen Hosts hat einen höheren Vorrang als _default_.
top
Migrieren eines namensbasierten vhosts zu einem IP-basierten vhost


=== Migrieren eines namensbasierten vhosts zu einem IP-basierten vhost ===
Der namensbasierte vhost mit dem Hostnamen www.example.org (aus unserem namensbasierten Beispiel, Setup 2) sollte seine eigene IP-Adresse erhalten.
Der namensbasierte vhost mit dem Hostnamen www.example.org (aus unserem namensbasierten Beispiel, Setup 2) sollte seine eigene IP-Adresse erhalten.
* Um Probleme mit Nameservern oder Proxies zu vermeiden, die die alte IP-Adresse für den namensbasierten vhost zwischengespeichert haben, wollen wir während einer Migrationsphase beide Varianten anbieten.
* Um Probleme mit Nameservern oder Proxies zu vermeiden, die die alte IP-Adresse für den namensbasierten vhost zwischengespeichert haben, wollen wir während einer Migrationsphase beide Varianten anbieten.


Die Lösung ist einfach, denn wir können die neue IP-Adresse (172.20.30.50) einfach in die VirtualHost-Richtlinieaufnehmen.
Die Lösung ist einfach, denn wir können die neue IP-Adresse (172.20.30.50) einfach in die VirtualHost-Richtlinieaufnehmen.
<syntaxhighlight lang="apache" line>
<syntaxhighlight lang="apache" line>
Listen 80
Listen 80
Zeile 272: Zeile 268:


Der vhost kann nun über die neue Adresse (als IP-basierter vhost) und über die alte Adresse (als namensbasierter vhost) erreicht werden.
Der vhost kann nun über die neue Adresse (als IP-basierter vhost) und über die alte Adresse (als namensbasierter vhost) erreicht werden.
top
Verwendung der ServerPath-Richtlinie


=== Verwendung der ServerPath-Richtlinie ===
Wir haben einen Server mit zwei namensbasierten vhosts.
Wir haben einen Server mit zwei namensbasierten vhosts.
* Um den richtigen virtuellen Host zu finden, muss ein Client den richtigen Host:Header senden.
* Um den richtigen virtuellen Host zu finden, muss ein Client den richtigen Host:Header senden.
* Alte HTTP/1.0-Clients senden einen solchen Header nicht und der Apache hat keine Ahnung, welchen vhost der Client zu erreichen versucht hat (und bedient die Anfrage vom primären vhost).
* Alte HTTP/1.0-Clients senden einen solchen Header nicht und der Apache hat keine Ahnung, welchen vhost der Client zu erreichen versucht hat (und bedient die Anfrage vom primären vhost).
* Um so viel Abwärtskompatibilität wie möglich zu gewährleisten, erstellen wir einen primären vhost, der eine einzelne Seite mit Links mit einem URL-Präfix zu den namensbasierten virtuellen Hosts zurückgibt.
* Um so viel Abwärtskompatibilität wie möglich zu gewährleisten, erstellen wir einen primären vhost, der eine einzelne Seite mit Links mit einem URL-Präfix zu den namensbasierten virtuellen Hosts zurückgibt.
<syntaxhighlight lang="apache" line>
<syntaxhighlight lang="apache" line>
<VirtualHost 172.20.30.40>
<VirtualHost 172.20.30.40>

Aktuelle Version vom 5. Mai 2024, 19:35 Uhr

Namensbasierter Websites

Betrieb mehrerer namensbasierter Websites unter einer einzigen IP-Adresse

Ihr Server hat mehrere Hostnamen, die zu einer einzigen Adresse aufgelöst werden, und Sie möchten für www.example.comund www.example.org unterschiedlich reagieren

Hinweis
Das Erstellen von virtuellen Hostkonfigurationen auf Ihrem Apache-Server bewirkt nicht auf magische Weise, dass DNS-Einträge für diese Hostnamen erstellt werden.
  • Sie müssen die Namen im DNS haben, die zu Ihrer IP-Adresse aufgelöst werden, oder niemand wird Ihre Website sehen können.
  • Sie können Einträge in Ihrer hosts-Datei für lokale Tests vornehmen, aber das funktioniert nur von dem Rechner aus, der diese hosts-Einträge hat.
  1. Sicherstellen, dass Apache auf Port 80 lauscht
Listen 80
<VirtualHost *:80>
 DocumentRoot "/www/example1"
 ServerName www.example.com 
 # Andere Direktiven hier
</VirtualHost>
<VirtualHost *:80>
 DocumentRoot "/www/example2"
 ServerNamewww.example.org 
 # Andere Direktiven hier
</VirtualHost>

Die Sternchen passen zu allen Adressen, so dass der Hauptserver keine Anfragen bedient.

  • Da der virtuelle Host mit ServerName www.example.com in der Konfigurationsdatei an erster Stelle steht, hat er die höchste Priorität und kann als Standard- oder Primärserver angesehen werden.
  • Das heißt, wenn eine Anfrage eingeht, die nicht mit einer der angegebenen ServerName-Direktiven übereinstimmt, wird sie von diesem ersten <VirtualHost> bedient.

Die obige Konfiguration sollten Sie in fast allen Fällen verwenden, in denen ein virtuelles Hosting auf Namen basiert.

  • Die einzige Sache, für die diese Konfiguration nicht funktioniert, ist, wenn Sie unterschiedliche Inhalte auf der Grundlage unterschiedlicher IP-Adressen oder Ports bereitstellen.
Hinweis

Sie können * durch eine bestimmte IP-Adresse auf dem System ersetzen.

  • Solche virtuellen Hosts werden nur für HTTP-Anfragen verwendet, die bei einer Verbindung mit der angegebenen IP-Adresse eingehen.

Es ist jedoch auch nützlich, * auf Systemen zu verwenden, bei denen die IP-Adresse nicht vorhersehbar ist - zum Beispiel, wenn Sie eine dynamische IP-Adresse bei Ihrem ISP haben und eine Art dynamische DNS-Lösung verwenden.

  • Da * mit jeder IP-Adresse übereinstimmt, würde diese Konfiguration ohne Änderungen funktionieren, wenn sich Ihre IP-Adresse ändert.

Namensbasierte Hosts auf mehr als einer IP-Adresse

Hinweis
Jede der hier beschriebenen Techniken kann auf eine beliebige Anzahl von IP-Adressen ausgedehnt werden.

Der Server hat zwei IP-Adressen

  • Auf der einen(172.20.30.40) wird der "Hauptserver" server.example.com betrieben und auf der anderen(172.20.30.50) werden zwei oder mehr virtuelle Hosts betrieben.
Listen 80

# Dies ist der "Haupt"-Server, der auf 172.20.30.40 läuft
ServerName server.example.comDocumentRoot "/www/mainserver"

<VirtualHost 172.20.30.50>
 DocumentRoot "/www/example1"
 ServerName www.example.com # Andere Direktiven hier ...
</VirtualHost>

<VirtualHost 172.20.30.50>
 DocumentRoot "/www/example2"
 ServerNamewww.example.org # Andere Direktiven hier ...
</VirtualHost>

Jede Anfrage an eine andere Adresse als 172.20.30.50 wird vom Hauptserver zugestellt.

  • Eine Anfrage an 172.20.30.50 mit einem unbekannten Hostnamen oder ohne Host: Header wird von www.example.com zugestellt.
  • Bereitstellung desselben Inhalts auf verschiedenen IP-Adressen (z. .B. einer internen und einer externen Adresse).
Der Server-Rechner hat zwei IP-Adressen(192.168.1.1und 172.20.30.40)
  • Der Rechner befindet sich zwischen einem internen (Intranet) und einem externen (Internet) Netz.
  • Außerhalb des Netzes wird der Name server.example.com zur externen Adresse(172.20.30.40) aufgelöst, aber innerhalb des Netzes wird derselbe Name zur internen Adresse (192.168.1.1) aufgelöst.

Mit nur einem <VirtualHost>-Abschnitt kann der Server dazu gebracht werden, auf interne und externe Anfragen mit demselben Inhalt zu antworten.

<VirtualHost 192.168.1.1 172.20.30.40>
 DocumentRoot "/www/server1"
 ServerName server.example.com ServerAlias server</VirtualHost>

Jetzt werden Anfragen aus beiden Netzen von demselben <VirtualHost> bedient.

Anmerkung

Im internen Netzwerk kann man statt des voll qualifizierten Hostnamens server.example.com einfach den Nameserver verwenden.

Beachten Sie auch, dass Sie im obigen Beispiel die Liste der IP-Adressen durch * ersetzen können, was dazu führt, dass der Server auf alle Adressen gleich antwortet.

Verschiedene Websites auf verschiedenen Ports

Sie haben mehrere Domänen, die auf dieselbe IP-Adresse verweisen, und möchten auch mehrere Ports bedienen.

  • Das nachstehende Beispiel zeigt, dass die Namenszuordnung erfolgt, nachdem die am besten passende Kombination aus IP-Adresse und Port ermittelt wurde.
Listen 80
Listen 8080

<VirtualHost 172.20.30.40:80>
 ServerNamewww.example.com DocumentRoot "/www/domain-80"
</VirtualHost>

<VirtualHost 172.20.30.40:8080>
 ServerNamewww.example.com DocumentRoot "/www/domain-8080"
</VirtualHost>

<VirtualHost 172.20.30.40:80>
 ServerNamewww.example.org DocumentRoot "/www/otherdomain-80"
</VirtualHost>

<VirtualHost 172.20.30.40:8080>
 ServerNamewww.example.org DocumentRoot "/www/otherdomain-8080"
</VirtualHost>

IP-basiertes virtuelles Hosting

Der Server hat zwei IP-Adressen(172.20.30.40 und 172.20.30.50), die zu den Namen www.example.com bzw.

  • www.
  • example.orgaufgelöst werden.
Listen 80

<VirtualHost 172.20.30.40>
 DocumentRoot "/www/example1"
 ServerName www.example.com</VirtualHost>

<VirtualHost 172.20.30.50>
 DocumentRoot "/www/example2"
 ServerName www.example.org</VirtualHost>

Anfragen an eine Adresse, die nicht in einer der <VirtualHost>-Direktiven angegeben ist (z. B. localhost), werden an den Hauptserver weitergeleitet, sofern ein solcher vorhanden ist.

Gemischte port- und ip-basierte virtuelle Hosts

Der Server-Rechner hat zwei IP-Adressen(172.20.30.40 und 172.20.30.50), die zu den Namen www.example.com bzw. www.example.org aufgelöst werden.

  • In beiden Fällen wollen wir Hosts auf den Ports 80 und 8080 ausführen.
Listen 172.20.30.40:80
Listen 172.20.30.40:8080
Listen 172.20.30.50:80
Listen 172.20.30.50:8080

<VirtualHost 172.20.30.40:80>
 DocumentRoot "/www/example1-80"
 ServerName www.example.com</VirtualHost>

<VirtualHost 172.20.30.40:8080>
 DocumentRoot "/www/example1-8080"
 ServerName www.example.com</VirtualHost>

<VirtualHost 172.20.30.50:80>
 DocumentRoot "/www/example2-80"
 ServerName www.example.org</VirtualHost>

<VirtualHost 172.20.30.50:8080>
 DocumentRoot "/www/example2-8080"
 ServerName www.example.org</VirtualHost>

Gemischte namensbasierte und IP-basierte vhosts

Jede Adresse, die im Argument eines virtuellen Hosts genannt wird und nie in einem anderen virtuellen Host auftaucht, ist ein rein IP-basierter virtueller Host.

Listen 80
<VirtualHost 172.20.30.40>
 DocumentRoot "/www/example1"
 ServerName www.example.com</VirtualHost>

<VirtualHost 172.20.30.40>
 DocumentRoot "/www/example2"
 ServerName www.example.org</VirtualHost>

<VirtualHost 172.20.30.40>
 DocumentRoot "/www/example3"
 ServerName www.example.net</VirtualHost>

 # IP-basiert
<VirtualHost 172.20.30.50>
 DocumentRoot "/www/example4"
 ServerName www.example.edu</VirtualHost>

<VirtualHost 172.20.30.60>
 DocumentRoot "/www/example5"
 Servername www.example.gov</VirtualHost>

Gemeinsame Verwendung von Virtual_host und mod_proxy

Das folgende Beispiel ermöglicht es einem Front-End-Rechner, einen virtuellen Host an einen Server weiterzuleiten, der auf einem anderen Rechner läuft.

  • Im Beispiel wird ein virtueller Host mit demselben Namen auf einem Rechner unter 192.168.111.2 konfiguriert.
  • Die Anweisung ProxyPreserveHost On wird verwendet, damit der gewünschte Hostname durchgereicht wird, falls wir mehrere Hostnamen an einen einzelnen Rechner weiterleiten.
<VirtualHost *:*>
 ProxyPreserveHost On
 ProxyPass "/" "http://192.168.111.2/"
 ProxyPassReverse "/" "http://192.168.111.2/"
 ServerName hostname.example.com</VirtualHost>

Verwendung von _Standard_vhosts

_Standard_ vhosts für alle Ports

Abfangen jeder Anfrage an eine nicht spezifizierte IP-Adresse und einen nicht spezifizierten Port, d. h. eine Kombination aus Adresse und Port, die für keinen anderen virtuellen Host verwendet wird.

<VirtualHost _default_:*>
 DocumentRoot "/www/default"
</VirtualHost>

Die Verwendung eines solchen Standard-Vhosts mit einem Wildcard-Port verhindert effektiv, dass eine Anfrage an den Hauptserver geht.

Ein Standard-Vhost bedient niemals eine Anfrage, die an eine Adresse/Port gesendet wurde, die für namensbasierte Vhosts verwendet wird.

  • Wenn die Anfrage einen unbekannten oder keinen Host:-Header enthielt, wird sie immer vom primären namensbasierten vhost bedient (der vhost für diese Adresse/Port, der in der Konfigurationsdatei an erster Stelle steht).

Sie können AliasMatch oder RewriteRule verwenden, um jede Anfrage auf eine einzelne Informationsseite (oder ein Skript) umzuschreiben.

_Standard_ vhosts für verschiedene Ports

Wie Setup 1, aber der Server lauscht auf mehreren Ports und wir wollen einen zweiten _Standard_ vhost für Port 80 verwenden.

<VirtualHost _default_:80>
 DocumentRoot "/www/default80"
 #...
</VirtualHost>
<syntaxhighlight lang="apache" line>
<VirtualHost _default_:*>
 DocumentRoot "/www/default"
 #...
</VirtualHost>

Der Standard-Vhost für Port 80 (der vor jedem Standard-Vhost mit einem Wildcard-Port stehen muss ) fängt alle Anfragen ab, die an eine nicht spezifizierte IP-Adresse gesendet wurden.

  • Der Hauptserver wird nie zur Bearbeitung einer Anfrage verwendet.

_Standard_ vhosts für einen Port

Wir möchten einen Standard-Vhost für Port 80 haben, aber keine anderen Standard-Vhosts.

<VirtualHost _default_:80>
 DocumentRoot "/www/default"
...
</VirtualHost>

Eine Anfrage an eine nicht spezifizierte Adresse an Port 80 wird vom Standard-Vhost bedient.

  • Alle anderen Anfragen an eine nicht spezifizierte Adresse und einen nicht spezifizierten Port werden vom Hauptserver zugestellt.

Jede Verwendung von * in einer Deklaration eines virtuellen Hosts hat einen höheren Vorrang als _default_.

Migrieren eines namensbasierten vhosts zu einem IP-basierten vhost

Der namensbasierte vhost mit dem Hostnamen www.example.org (aus unserem namensbasierten Beispiel, Setup 2) sollte seine eigene IP-Adresse erhalten.

  • Um Probleme mit Nameservern oder Proxies zu vermeiden, die die alte IP-Adresse für den namensbasierten vhost zwischengespeichert haben, wollen wir während einer Migrationsphase beide Varianten anbieten.

Die Lösung ist einfach, denn wir können die neue IP-Adresse (172.20.30.50) einfach in die VirtualHost-Richtlinieaufnehmen.

Listen 80
ServerNamewww.example.comDocumentRoot "/www/example1"

<VirtualHost 172.20.30.40 172.20.30.50>
 DocumentRoot "/www/example2"
 ServerNamewww.example.org # ...
</VirtualHost>

<VirtualHost 172.20.30.40>
 DocumentRoot "/www/example3"
 ServerNamewww.example.net ServerAlias *.example.net # ...
</VirtualHost>

Der vhost kann nun über die neue Adresse (als IP-basierter vhost) und über die alte Adresse (als namensbasierter vhost) erreicht werden.

Verwendung der ServerPath-Richtlinie

Wir haben einen Server mit zwei namensbasierten vhosts.

  • Um den richtigen virtuellen Host zu finden, muss ein Client den richtigen Host:Header senden.
  • Alte HTTP/1.0-Clients senden einen solchen Header nicht und der Apache hat keine Ahnung, welchen vhost der Client zu erreichen versucht hat (und bedient die Anfrage vom primären vhost).
  • Um so viel Abwärtskompatibilität wie möglich zu gewährleisten, erstellen wir einen primären vhost, der eine einzelne Seite mit Links mit einem URL-Präfix zu den namensbasierten virtuellen Hosts zurückgibt.
<VirtualHost 172.20.30.40>
 # primary vhost
 DocumentRoot "/www/subdomain"
 RewriteEngine On
 RewriteRule "." "/www/subdomain/index.html"
 #...
</VirtualHost>

<VirtualHost 172.20.30.40>
 DocumentRoot "/www/subdomain/sub1"
 ServerName www.sub1.domain.tld ServerPath "/sub1/"
 RewriteEngine On
 RewriteRule "^(/sub1/.*)" "/www/subdomain$1"
 #...
</VirtualHost>

<VirtualHost 172.20.30.40>
 DocumentRoot "/www/subdomain/sub2"
 ServerNamewww.sub2.domain.tld ServerPath "/sub2/"
 RewriteEngine On
 RewriteRule "^(/sub2/.*)" "/www/subdomain$1"
 # ...
</VirtualHost>

Aufgrund der ServerPath-Direktive wird eine Anfrage an die URL http://www.sub1.domain.tld/sub1/ immer vom sub1-vhost bedient. Eine Anfrage an die URL http://www.sub1.domain.tld/ wird nur dann vom sub1-vhost bedient, wenn der Client einen korrekten Host: Header gesendet hat.

  • Wenn kein Host: Header gesendet wird, erhält der Client die Informationsseite vom primären Host.

Bitte beachten Sie, dass es eine Besonderheit gibt: Eine Anfrage an http://www.sub2.domain.tld/sub1/ wird auch dann vom sub1-vhost bedient, wenn der Client keinen Host: Header gesendet hat.

Die RewriteRule-Direktiven werden verwendet, um sicherzustellen, dass ein Client, der einen korrekten Host:- Header gesendet hat, beide URL-Varianten verwenden kann, d. h. mit oder ohne URL-Präfix.