GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Bedienen Sie mehrere Domains mithilfe virtueller Hosts

Die meisten Leute bedienen mehr als eine Domain auf ihrem Cloud-Server. Unabhängig davon, ob Sie verschiedene Domains oder verschiedene Subdomains derselben Domain bedienen, das Verfahren ist das gleiche. Dieser Artikel beschreibt, wie Sie virtuelle Hosts erstellen, um mehrere Domains zu bedienen, und wie Sie Probleme mit Apache-namenbasierten virtuellen Hostkonfigurationen beheben.

Virtuelle Hosts für mehrere Domains erstellen

Wenn ein Browser eine Anfrage an die IP-Adresse Ihres Servers sendet, die nach dem Inhalt Ihres Domainnamens fragt (z. B. https://yourexampledomain.com ) stellt Ihr Webserver eine HTTP-Darstellung Ihrer Website bereit. Wenn der Server nur eine Website bedient, stellt er den HTML-Code in Ihrem /var/www/html bereit Verzeichnis, beginnend mit index.html . Aber einen eigenen Server für jede Website zu haben, die Sie bedienen möchten, ist kostspielig und eine ineffiziente Nutzung Ihrer Ressourcen.

Namensbasierte virtuelle Hosts ermöglichen es Ihnen, Inhalte für mehrere Websites von einem Server bereitzustellen.

Eine der ersten Zeilen in jeder Konfigurationsdatei für virtuelle Hosts gibt den Domänennamen an, der dem virtuellen Host zugeordnet ist. Im Folgenden finden Sie ein Beispiel für eine virtuelle Hostkonfiguration für Apache, die domain1.com bedient :

    <VirtualHost \*:80>

      ServerName  domain1.com

      ServerAlias www.domain1.com

    </VirtualHost>

Das folgende Beispiel zeigt eine virtuelle Hostkonfiguration für NGINX:

    server {

      server_name  www.domain1.com;

      rewrite ^/(.\*) https://domain1.com/$1 permanent;

Jede Konfiguration beginnt etwas anders, aber es gilt das gleiche Prinzip:Dieser bestimmte virtuelle Host antwortet auf Anfragen für domain1.com und www.domain1.com .

Um unterschiedliche Inhalte für unterschiedliche Domänen bereitzustellen, fügen Sie einen weiteren virtuellen Host hinzu.

Beispiel:Sie haben eine Subdomain namens blog.domain1.com, die einen Blog bedient.

Zuerst erstellen Sie in Ihrem Ordner public_html einen Ordner mit den relevanten Dateien für den Blog (z. B. eine WordPress-Installation).

Dann erstellen Sie einen virtuellen Host mit dem server_name oder ServerName angegeben als blog.domain1.com und konfigurieren Sie es so, dass es auf die Blogdateien und -ordner in Ihrem public_html verweist Ordner.

Weitere Informationen zu virtuellen Hosts finden Sie im Apache-Dokument Name-base Virtual Hosts

Fehlerbehebung

In diesem Abschnitt erfahren Sie, wie Sie Probleme mit Apache-namenbasierten virtuellen Hostkonfigurationen beheben. Es enthält nützliche Befehle zum Testen Ihrer Konfiguration virtueller Hosts, beschreibt, wie deren Ausgabe zu interpretieren ist, und beschreibt, wie sie dabei helfen, allgemeine Probleme bei der Konfiguration virtueller Hosts zu beheben.

Apache neu starten

Bevor Sie ein Problem diagnostizieren können, vergewissern Sie sich, dass Sie Apache neu gestartet haben, seit Sie das letzte Mal Änderungen an Ihren Apache-Konfigurationsdateien vorgenommen haben:

  • Verwenden Sie für Red Hat-Distributionen:

      sudo /usr/sbin/httpd -k restart
    
  • Verwenden Sie für Debian-Distributionen:

      sudo /usr/sbin/apache2 -k restart
    

Wenn Apache Ihnen eine Warn- oder Fehlermeldung ausgibt, notieren Sie sich diese für später. Ihr nächster Schritt besteht darin, Informationen über die Konfiguration des virtuellen Hosts abzurufen.

Konfigurationsbericht abrufen

Führen Sie -S aus Befehl auf dem Webserver, um die Konfiguration Ihres virtuellen Hosts zu überprüfen

  • Verwenden Sie für von Red Hat abgeleitete Distributionen:

      sudo /usr/sbin/httpd -S
    
  • Verwenden Sie für von Debian abgeleitete Distributionen:

      sudo /usr/sbin/apache2 -S
    

Die Ausgabe zeigt die virtuellen Hosteinstellungen aus der Konfigurationsdatei. Das folgende Beispiel zeigt den Konfigurationsbericht für einen Server, der mit zwei namensbasierten virtuellen Hosts konfiguriert ist:vh1.example.com und vh2.example.com. Die nummerierten Zeilen werden anhand des Beispiels erklärt.

      VirtualHost configuration:

          wildcard NameVirtualHosts and \_default\_ servers:

      [1] \*:80        is a NameVirtualHost
      [2] default server vh1.example.com (/etc/httpd/conf/custom/virtualhost.conf:3)
      [3] port 80 namevhost vh1.example.com (/etc/httpd/conf/custom/virtualhost.conf:3)
      [4] port 80 namevhost vh2.example.com (/etc/httpd/conf/custom/virtualhost.conf:8)
      [5] Syntax OK
  • Zeile [1] meldet, dass der Webserver auf dem Standardport 80 auf alle IP-Adressen lauscht, die Apache abhört, und dass namensbasiertes virtuelles Hosting aktiviert ist. Das * ist ein Platzhalter, der alle IP-Adressen angibt.

  • Zeile [2] meldet den standardmäßigen virtuellen Host, den der Webserver ServerAlias ​​für alle Anfragen hat, für die kein bestimmter Hostname angefordert wird. Es zeigt auch den Pfad zur Konfigurationsdatei und die Zeilennummer, wo diese Konfiguration festgelegt wird.

  • Zeile [3] meldet den Port und den Namen der ersten gefundenen virtuellen Hostkonfiguration, die Datei, in der sie konfiguriert ist, und die Zeilennummer, auf der ihre Konfiguration beginnt.

  • Zeile [4] meldet den Port und den Namen der zweiten gefundenen virtuellen Hostkonfiguration, die Datei, in der sie konfiguriert ist, und die Zeilennummer, auf der ihre Konfiguration beginnt.

  • Zeile [5] meldet, ob die Konfigurationssyntax korrekt ist, obwohl das nicht unbedingt bedeutet, dass Ihre Website funktioniert

Die folgende Ausgabe wurde durch die folgende Konfiguration der virtuellen Hostdatei erzeugt:

  NameVirtualHost \*:80   Turns on name-based host resolution and binds the virtual server to IP addresses and ports as in [1] above. The \* is a wildcard specifying all IP addresses.

      <VirtualHost \*:80>   Configures the first and default virtual host in [2] & [3] above. It is the default because it is the first virtual host whose IP and port matches those in the NameVirtualHost directive before it.
      ServerName vh1.example.com
      DocumentRoot /var/www/vhosts/vh1
    </VirtualHost>

      <VirtualHost \*:80>   Configures the second virtual host in [4] above.
        ServerName vh2.example.com
        DocumentRoot /var/www/vhosts/vh2
      </VirtualHost>

Nachdem Sie nun gesehen haben, wie eine grundlegende virtuelle Hostkonfiguration aussieht und wie sie dem eigenen Konfigurationsbericht von Apache zugeordnet ist, können Sie diese Berichte verwenden, um allgemeine Konfigurationsprobleme zu untersuchen. In den folgenden Abschnitten werden einige dieser Probleme beschrieben und Anleitungen zu deren Behebung bereitgestellt.

Hosts, die nicht als namensbasierte virtuelle Hosts eingerichtet sind

Wenn httpd -S ausgeführt wird meldet die folgende Warnung:

[Wed May 18 15:24:51 2011] [warn] \_default\_ VirtualHost overlap on port 80, the first has precedence
	VirtualHost configuration:
	wildcard NameVirtualHosts and \_default\_ servers:
	\*:80                   vh1.example.com (/etc/httpd/conf/custom/virtualhost.conf:3)
	\*:80                   vh2.example.com (/etc/httpd/conf/custom/virtualhost.conf:8)
	Syntax OK

Diese Warnung weist darauf hin, dass mehrere virtuelle Hosts versuchen, denselben „Socket“ zu verwenden, ohne als namensbasierte virtuelle Hosts eingerichtet zu sein. Dieser Fehler tritt häufig auf, wenn virtuelle Apache-Hosts zum ersten Mal erstellt werden, da der Standard NameVirtualHost Direktive wird mit einem Hash-Symbol auskommentiert. Dieses Symbol weist Apache an, die Direktive zu ignorieren.

Um dieses Problem in einer standardmäßigen Apache-Konfigurationsdatei zu beheben, stellen Sie sicher, dass die Datei NameVirtualHost *:80 Direktive ist nicht auskommentiert. Wenn Sie mit einer minimalen Apache-Konfigurationsdatei arbeiten, fügen Sie einen NameVirtualHost *:80 hinzu Direktive über den einzelnen virtuellen Hostkonfigurationen.

Das folgende Beispiel zeigt die kommentierte Direktive, die den Fehler verursacht hat:

#NameVirtualHost \*:80

	<VirtualHost \*:80>
      ServerName vh1.example.com
      DocumentRoot /var/www/vhosts/vh1
	</VirtualHost>

	<VirtualHost \*:80>
      ServerName vh2.example.com
      DocumentRoot /var/www/vhosts/vh2
	</VirtualHost>

Element fehlt in VirtualHost-Direktive

Wenn httpd -S ausgeführt wird meldet die folgende Fehlermeldung:

Syntax error on line 8 of /etc/httpd/conf/custom/virtualhost.conf:
	<VirtualHost> directive requires additional arguments

Diese Meldung bedeutet, dass der VirtualHost des virtuellen Hosts Richtlinie fehlt ein notwendiges Element. Der VirtualHost Direktive ist die erste Zeile jeder individuellen virtuellen Hostkonfiguration. In diesem Fall steht der Fehler in Zeile 8 der Konfigurationsdatei /etc/httpd/conf/custom/virtualhost.conf .

Es folgt die Apache-Konfiguration, die diesen obigen Fehler erzeugt hat:

    NameVirtualHost \*:80

	<VirtualHost \*:80>
      ServerName vh1.example.com
      DocumentRoot /var/www/vhosts/vh1
	</VirtualHost>

	<VirtualHost>
      ServerName vh2.example.com
      DocumentRoot /var/www/vhosts/vh2
	</VirtualHost>

Beachten Sie, dass der zweite VirtualHost Direktive hat keine IP-Adresse oder keinen Port angegeben, was die Fehlerursache ist.

Es folgt eine korrigierte Version des vorherigen Beispiels mit dem Zusatz \*:80 an die Direktive des virtuellen Hosts. Wie immer der \* ist ein Platzhalter, der alle IP-Adressen angibt.

NameVirtualHost \*:80

	<VirtualHost \*:80>
      ServerName vh1.example.com
      DocumentRoot /var/www/vhosts/vh1
	</VirtualHost>

	<VirtualHost \*:80>
      ServerName vh2.example.com
      DocumentRoot /var/www/vhosts/vh2
	</VirtualHost>

Portnummern stimmen nicht überein

Wenn httpd -S ausgeführt wird , zeigt, dass ein virtueller Host über is a NameVirtualHost aufgeführt ist Zeile:

VirtualHost configuration:
	wildcard NameVirtualHosts and \_default\_ servers:
	\*:800                  vh2.example.com (/etc/httpd/conf/custom/virtualhost.conf:8)
	\*:80                   is a NameVirtualHost
	default server vh1.example.com (/etc/httpd/conf/custom/virtualhost.conf:3)
	port 80 namevhost vh1.example.com (/etc/httpd/conf/custom/virtualhost.conf:3)
	Syntax OK

In diesem Beispiel meldet der Konfigurationstest vh2.example.com Konfiguration, bevor es den NameVirtualHost meldet Aufbau. Dieser Fehler wird möglicherweise angezeigt, wenn die IP-Adresse oder der Port des virtuellen Hosts nicht mit der IP-Adresse oder dem Port des NameVirtualHost des Webservers übereinstimmt Richtlinie. In diesem Beispiel zeigt der Bericht, dass vh2.example.com verwendet Port 800 statt Port 80. Die Portnummer wurde falsch eingegeben, als vh2.example.com Der Überwachungsport des virtuellen Hosts wurde konfiguriert. Infolgedessen behandelt Apache vh2.example.com als separater portbasierter virtueller Host.

Der httpd -S Testbefehl warnt nicht Sie über dieses Problem, weil es zulässig ist, virtuelle Hosts so zu konfigurieren, dass sie jeden Port verwenden, z. B. 800, ohne dass sie Teil der namensbasierten virtuellen Hostkonfiguration auf demselben Server sind.

Wenn dieser Fehler auftritt, sehen Sie wahrscheinlich Inhalte vom standardmäßigen virtuellen Host (vh1.example.com in diesem Beispiel), wenn Sie versuchen, die Website in Ihrem Webbrowser anzuzeigen.

Um Ihnen zu helfen, die vorhergehende Ausgabe seiner Konfigurationsdatei zuzuordnen, folgt die Konfiguration des virtuellen Hosts, die diesen Fehler verursacht hat:

NameVirtualHost \*:80

	<VirtualHost \*:80>
      ServerName vh1.example.com
      DocumentRoot /var/www/vhosts/vh1
	</VirtualHost>

	<VirtualHost \*:800>
      ServerName vh2.example.com
      DocumentRoot /var/www/vhosts/vh2
	</VirtualHost>

Stammverzeichnis des Dokuments existiert nicht

Wenn httpd -S ausgeführt wird meldet folgenden Fehler:

Warning: DocumentRoot [/etc/httpd/var/www/vhosts/vh2] does not exist

Dieser Fehler weist darauf hin, dass das angegebene Verzeichnis die Website-Dateien für vh2.example.com enthält virtueller Host nicht existiert oder dass Apache nicht darauf zugreifen kann. Ähnliche Fehler können für alle Dateipfade auftreten, die in einer virtuellen Hostkonfiguration angegeben sind, z. B. die Pfade zu den Protokolldateien des virtuellen Hosts.

Um diesen Fehler zu beheben, stellen Sie sicher, dass Sie das Verzeichnis erstellt haben. Wenn Sie es erstellt haben, vergewissern Sie sich, dass es keine Fehler im DocumentRoot gibt Richtlinie. Ein häufiger Fehler besteht darin, den Schrägstrich (/) am Anfang des Pfads wegzulassen. Das Weglassen des Schrägstrichs weist Apache an, den Pfad zu lesen – das DocumentRoot path in diesem Fall – als relativer Pfad, d. h. als Pfad relativ zum ServerRoot der Apache-Hauptkonfiguration Pfad.

Das folgende Beispiel zeigt nur eine der Möglichkeiten, wie dieser Fehler erzeugt wird. Der Pfad für DocumentRoot Direktive im ersten virtuellen Host beginnt mit einem Schrägstrich, die zweite nicht.

ServerRoot /etc/httpd

	NameVirtualHost \*:80

	<VirtualHost \*:80>
      ServerName vh1.example.com
      DocumentRoot /var/www/vhosts/vh1
	</VirtualHost>

	<VirtualHost \*:80>
      ServerName vh2.example.com
      DocumentRoot var/www/vhosts/vh2
	</VirtualHost>

Mit cURL Ihre Website testen

Nachdem Sie die Konfigurationsdateien des virtuellen Hosts und den httpd -S überprüft haben Befehl keine Probleme meldet, versuchen Sie, mit cURL:

auf Ihre Website zuzugreifen
    curl -I www.example.com

Die Ausgabe sollte in etwa so aussehen:

    HTTP/1.1 200 OK
	Date: Sat, 07 May 2011 15:09:50 GMT
	Server: Apache/2.2.3 (CentOS)
	Last-Modified: Mon, 25 Apr 2011 11:07:43 GMT
	ETag: "2c32e-77-4a1bc37723dc0"
	Accept-Ranges: bytes
	Content-Length: 119
	Content-Type: text/html; charset=UTF-8

Die erste Zeile zeigt den Statuscode. Sie möchten 200 OK sehen , wie im Beispiel gezeigt. Wenn Sie dies sehen, testen Sie den Webserver mit Ihrem Browser, aber bedenken Sie, dass Ihr Browser möglicherweise eine zwischengespeicherte Seite anzeigt.

Wenn 200 OK nicht angezeigt wird , sehen Sie möglicherweise eine der folgenden allgemeinen Meldungen:

  • curl: (6) Couldn't resolve host vh1.example.com

    Wenn cURL meldet, dass es den Host nicht finden kann, vergewissern Sie sich, dass es einen A-Eintrag für die Domäne gibt, der auf die richtige IP-Adresse für Ihren Server verweist. Dazu können Sie dig verwenden:

      dig vh1.example.com
    
  • curl: (7) couldn't connect to host

    Stellen Sie sicher, dass Ihre Apache-Konfigurationsdateien das erforderliche Listen enthalten Direktiven und dass sie nicht auskommentiert sind. Es braucht Listen 80 zumindest.

    Eine andere Möglichkeit, dies zu überprüfen, besteht darin, das Fehlerprotokoll zu überprüfen. Das Standardfehlerprotokoll befindet sich unter /var/log/httpd/error_log auf Red Hat-Systemen und /var/log/apache2/error_log auf Debian-Systemen. Wenn kein Port angegeben ist, auf dem Apache lauschen soll, folgt die Meldung no listening sockets available, shutdown folgt auf den Versuch von Apache, neu zu starten.

    [notice] SIGHUP received.  Attempting to restart no listening sockets available, shutting down
        Unable to open logs
    
  • HTTP/1.1 403 Forbidden

Diese Antwort weist darauf hin, dass die Berechtigungen, die Apache den Zugriff auf die angeforderte Seite ermöglichen, nicht korrekt sind. Vielleicht sind die Verzeichnisberechtigungen falsch, oder es könnte die Seite selbst sein.

In den folgenden Situationen wird möglicherweise auch eine 403-Antwort angezeigt:

- The `DocumentRoot` contains no index file—-typically named `index.html` or `index.php`. Note that the file name is case sensitive.

- The virtual host doesn't contain a `DirectoryIndex` directive specifying the default index file.

Die Apache-Fehlerprotokolle zeigen normalerweise, für welches Verzeichnis oder welche Datei die Berechtigungen falsch eingestellt sind. Einzelne virtuelle Hosts schreiben möglicherweise Fehler in ihre eigenen Protokolle, wenn sie so konfiguriert wurden, also überprüfen Sie auch diese Protokolle.

Lassen Sie sich nicht von der Datenmenge in den Protokolldateien eines ausgelasteten Servers entmutigen. Verwenden Sie stattdessen den Befehl tail, um selektiv nur die letzten zehn Zeilen eines Protokolls anzuzeigen. Zum Beispiel:

    tail /var/log/apache2/error\_log

Sie können neue Einträge sehen, wenn sie dem Fehlerprotokoll oder einem beliebigen Protokoll hinzugefügt werden, während Sie den Server testen, wenn Sie tail anweisen Befehl, dem Protokoll zu „folgen“. Zum Beispiel:

    tail -f /var/log/httpd/error\_log

Im Folgenden finden Sie Beispiele für einige häufige Konfigurationsfehler im Zusammenhang mit Berechtigungen, die in den Protokollen von Apache erscheinen können:

  • Der folgende Protokolleintrag zeigt, dass Berechtigungen auf die index.html Datei für vh2.example.com verweigern den Zugriff auf Apache.

    [error] [client 203.0.113.96] (13)Permission denied: access to /index.html denied
    
  • Der folgende Protokolleintrag zeigt, dass Berechtigungen auf der /var/www/vhosts/vh2 Verzeichnis blockieren die Leseanforderung von Apache.

    [error] [client 203.0.113.96] (13)Permission denied: file permissions deny server access: /var/www/vhosts/vh2/index.html
    
  • Der folgende Protokolleintrag zeigt, dass Apache keine Ausführungs- oder Leseberechtigungen für eines der Verzeichnisse über DocumentRoot hat .

    [error] [client 203.0.113.96] (13)Permission denied: access to / denied
    

Linux
  1. Virtuelle Multipass-Maschinen mithilfe von Ansible

  2. Ssh – SCP über mehrere Hosts?

  3. Wie benenne ich mehrere Dateien mit Find um?

  4. Verwenden von SNI zum Hosten mehrerer SSL-Zertifikate in Apache

  5. Mehrere glibc-Bibliotheken auf einem einzigen Host

Hosten Sie mehrere E-Mail-Domänen in PostfixAdmin auf CentOS/RHEL

So konfigurieren Sie virtuelle Apache-Hosts unter Rocky Linux

So richten Sie Apache Virtual Hosts unter Debian 11 ein

So richten Sie Apache Virtual Hosts unter Ubuntu 18.04 ein

So richten Sie virtuelle Apache-Hosts unter Ubuntu 20.04 ein

Verwalten von dedizierten Hosts