GNU/Linux >> Tutoriels Linux >  >> Linux

Servir plusieurs domaines en utilisant des hôtes virtuels

La plupart des gens servent plus d'un domaine sur leur serveur cloud. Que vous desserviez différents domaines ou différents sous-domaines du même domaine, la procédure est la même. Cet article explique comment créer des hôtes virtuels pour servir plusieurs domaines et comment résoudre les problèmes liés aux configurations d'hôtes virtuels basées sur le nom Apache.

Création d'hôtes virtuels pour plusieurs domaines

Lorsqu'un navigateur envoie une requête à l'adresse IP de votre serveur demandant le contenu de votre nom de domaine (par exemple, https://yourexampledomain.com ), votre serveur Web fournit une représentation HTTP de votre site. Si le serveur ne sert qu'un seul site Web, il sert le HTML dans votre /var/www/html répertoire, commençant par index.html . Mais avoir un serveur unique pour chaque site Web que vous souhaitez servir est coûteux et constitue une utilisation inefficace de vos ressources.

Hôtes virtuels basés sur le nom vous permettent de diffuser du contenu pour plusieurs sites Web à partir d'un seul serveur.

L'une des premières lignes de tout fichier de configuration d'hôte virtuel spécifie le nom de domaine associé à l'hôte virtuel. Voici un exemple de configuration d'hôte virtuel pour Apache, servant domain1.com :

    <VirtualHost \*:80>

      ServerName  domain1.com

      ServerAlias www.domain1.com

    </VirtualHost>

L'exemple suivant montre une configuration d'hôte virtuel pour NGINX :

    server {

      server_name  www.domain1.com;

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

Chaque configuration démarre légèrement différemment, mais le même principe s'applique :cet hôte virtuel particulier répond aux requêtes pour domain1.com et www.domain1.com .

Pour diffuser un contenu différent pour différents domaines, vous ajoutez un autre hôte virtuel.

Par exemple, vous avez un sous-domaine appelé blog.domain1.com qui dessert un blog.

Vous créez d'abord un dossier dans votre dossier public_html avec les fichiers pertinents pour le blog (par exemple, une installation WordPress).

Ensuite, vous créez un hôte virtuel avec le server_name ou ServerName spécifié comme blog.domain1.com et configurez-le pour qu'il pointe vers les fichiers et dossiers du blog dans votre public_html dossier.

Pour plus d'informations sur les hôtes virtuels, utilisez le document Apache Name-base Virtual Hosts

Dépannage

Cette section vous montre comment résoudre les problèmes liés aux configurations d'hôtes virtuels basées sur le nom d'Apache. Il fournit des commandes utiles pour tester la configuration de votre hôte virtuel, décrit comment interpréter leur sortie et explique comment elles aident à résoudre les problèmes courants de configuration de l'hôte virtuel.

Redémarrer Apache

Avant de pouvoir diagnostiquer un problème, assurez-vous d'avoir redémarré Apache depuis la dernière fois que vous avez apporté des modifications à vos fichiers de configuration Apache :

  • Pour les distributions Red Hat, utilisez :

      sudo /usr/sbin/httpd -k restart
    
  • Pour les distributions Debian, utilisez :

      sudo /usr/sbin/apache2 -k restart
    

Si Apache vous donne un avertissement ou un message d'erreur, notez-le pour plus tard. Votre prochaine étape consiste à obtenir des informations sur la configuration de l'hôte virtuel.

Obtenir un rapport de configuration

Exécutez le -S commande sur le serveur Web pour vérifier la configuration de votre hôte virtuel

  • Pour les distributions dérivées de Red Hat, utilisez :

      sudo /usr/sbin/httpd -S
    
  • Pour les distributions dérivées de Debian, utilisez :

      sudo /usr/sbin/apache2 -S
    

La sortie affiche les paramètres de l'hôte virtuel à partir du fichier de configuration. L'exemple suivant montre le rapport de configuration pour un serveur configuré avec deux hôtes virtuels basés sur le nom :vh1.example.com et vh2.example.com. Les lignes numérotées sont expliquées en suivant l'exemple.

      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
  • La ligne [1] indique que le serveur Web écoute sur le port par défaut 80 pour toutes les adresses IP écoutées par Apache et que l'hébergement virtuel basé sur le nom est activé. Le * est un caractère générique spécifiant toutes les adresses IP.

  • La ligne [2] signale l'hôte virtuel par défaut que le serveur Web ServerAlias ​​pour toutes les requêtes pour lesquelles aucun nom d'hôte spécifique n'est demandé. Il indique également le chemin d'accès au fichier de configuration et le numéro de ligne où cette configuration est définie.

  • La ligne [3] indique le port et le nom de la première configuration d'hôte virtuel trouvée, le fichier dans lequel il est configuré et le numéro de ligne sur lequel sa configuration commence.

  • La ligne [4] indique le port et le nom de la deuxième configuration d'hôte virtuel trouvée, le fichier dans lequel elle est configurée et le numéro de ligne sur lequel sa configuration commence.

  • La ligne [5] indique si la syntaxe de configuration est correcte, bien que cela ne signifie pas nécessairement que votre site fonctionne

La sortie suivante a été produite en suivant la configuration du fichier d'hôte virtuel :

  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>

Maintenant que vous avez vu une configuration de base d'hôte virtuel et comment elle correspond au propre rapport de configuration d'Apache, vous pouvez utiliser ces rapports pour examiner les problèmes de configuration courants. Les sections suivantes décrivent certains de ces problèmes et fournissent des conseils pour les résoudre.

Hôtes non configurés en tant qu'hôtes virtuels basés sur le nom

Si vous exécutez httpd -S signale l'avertissement suivant :

[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

Cet avertissement indique que plusieurs hôtes virtuels tentent d'utiliser le même "socket" sans être configurés en tant qu'hôtes virtuels basés sur le nom. Cette erreur se produit souvent lors de la première création des hôtes virtuels Apache, car le paramètre par défaut NameVirtualHost directive est commentée avec un symbole dièse. Ce symbole indique à Apache d'ignorer la directive.

Pour résoudre ce problème dans un fichier de configuration Apache par défaut, vérifiez que le NameVirtualHost *:80 directive n'est pas commentée. Si vous travaillez avec un fichier de configuration Apache minimal, ajoutez un NameVirtualHost *:80 au-dessus des configurations d'hôte virtuel individuelles.

L'exemple suivant montre la directive commentée qui a provoqué l'erreur :

#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>

Élément manquant dans la directive VirtualHost

Si vous exécutez httpd -S signale le message d'erreur suivant :

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

Ce message signifie que le VirtualHost de l'hôte virtuel directive manque un élément nécessaire. Le VirtualHost La directive est la première ligne de toute configuration d'hôte virtuel individuelle. Dans ce cas, l'erreur est sur la ligne 8 du fichier de configuration /etc/httpd/conf/custom/virtualhost.conf .

Voici la configuration Apache qui a produit l'erreur ci-dessus :

    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>

Notez que le deuxième VirtualHost la directive n'a pas d'adresse IP ou de port spécifié, ce qui est la cause de l'erreur.

Voici une version corrigée de l'exemple précédent, avec l'ajout de \*:80 à la directive de l'hôte virtuel. Comme toujours, le \* est un caractère générique spécifiant toutes les adresses IP.

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>

Les numéros de port ne correspondent pas

Si vous exécutez httpd -S , indique qu'un hôte virtuel est répertorié au-dessus de is a NameVirtualHost ligne :

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

Dans cet exemple, le test de configuration signale le vh2.example.com configuration avant de signaler le NameVirtualHost configuration. Vous pouvez voir cette erreur si l'adresse IP ou le port VirtualHost ne correspond pas à l'adresse IP ou au port du serveur Web NameVirtualHost directif. Dans cet exemple, le rapport indique que vh2.example.com utilise le port 800 plutôt que le port 80. Le numéro de port a été mal saisi lorsque le vh2.example.com le port d'écoute de l'hôte virtuel a été configuré. En conséquence, Apache traite vh2.example.com en tant qu'hôte virtuel basé sur un port distinct.

Le httpd -S la commande de test n'avertit pas vous parler de ce problème car il est permis de configurer des hôtes virtuels pour utiliser n'importe quel port, tel que 800, sans qu'ils fassent partie de la configuration d'hôte virtuel basée sur le nom sur le même serveur.

Si vous rencontrez cette erreur, vous verrez probablement le contenu de l'hôte virtuel par défaut (vh1.example.com dans cet exemple) lorsque vous essayez d'afficher le site dans votre navigateur Web.

Pour vous aider à mapper la sortie précédente à son fichier de configuration, voici la configuration de l'hôte virtuel qui a créé cette erreur :

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>

Le répertoire racine du document n'existe pas

Si vous exécutez httpd -S signale l'erreur suivante :

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

Cette erreur indique que le répertoire spécifié comme contenant les fichiers du site Web pour vh2.example.com l'hôte virtuel n'existe pas ou qu'Apache ne peut pas y accéder. Des erreurs similaires peuvent apparaître pour tous les chemins de fichiers spécifiés dans une configuration d'hôte virtuel, tels que les chemins d'accès aux fichiers journaux de l'hôte virtuel.

Pour corriger cette erreur, assurez-vous d'avoir créé le répertoire. Si vous l'avez créé, vérifiez qu'il n'y a pas d'erreurs dans le DocumentRoot directif. Une erreur courante consiste à omettre la barre oblique initiale du chemin (/). Omettre la barre oblique indique à Apache de lire le chemin—le DocumentRoot path dans ce cas, en tant que chemin relatif, c'est-à-dire en tant que chemin relatif au ServerRoot de la configuration principale d'Apache chemin.

L'exemple suivant montre une seule des manières dont cette erreur est créée. Le chemin du DocumentRoot directive dans le premier hôte virtuel commence par une barre oblique, mais pas le second.

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>

Utiliser cURL pour tester votre site

Après avoir vérifié les fichiers de configuration de l'hôte virtuel et le httpd -S commande ne signale aucun problème, essayez d'accéder à votre site en utilisant cURL :

    curl -I www.example.com

Le résultat devrait ressembler à ceci :

    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

La première ligne affiche le code d'état. Vous voulez voir 200 OK , comme indiqué dans l'exemple. Si c'est ce que vous voyez, testez le serveur Web avec votre navigateur, mais considérez que votre navigateur peut afficher une page en cache.

Si vous ne voyez pas 200 OK , l'un des messages courants suivants peut s'afficher :

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

    Si cURL signale qu'il ne trouve pas l'hôte, vérifiez qu'il existe un enregistrement A pour le domaine qui pointe vers l'adresse IP correcte de votre serveur. Vous pouvez utiliser la fouille pour faire ceci :

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

    Vérifiez que vos fichiers de configuration Apache incluent les éléments Listen nécessaires directives et qu'elles ne sont pas commentées. Il a besoin de Listen 80 au moins.

    Une autre façon de vérifier cela consiste à consulter le journal des erreurs. Le journal des erreurs par défaut se trouve dans /var/log/httpd/error_log sur les systèmes Red Hat et /var/log/apache2/error_log sur les systèmes Debian. Si aucun port n'est spécifié pour l'écoute d'Apache, le message aucune prise d'écoute disponible, fermeture suit la tentative de redémarrage d'Apache.

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

Cette réponse indique que les autorisations permettant à Apache d'accéder à la page que vous demandez ne sont pas correctes. Peut-être que les autorisations du répertoire sont incorrectes, ou il peut s'agir de la page elle-même.

Vous pouvez également voir une réponse 403 dans les situations suivantes :

- 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.

Les journaux d'erreurs d'Apache indiquent généralement le répertoire ou le fichier dont les autorisations sont définies de manière incorrecte. Les hôtes virtuels individuels peuvent écrire des erreurs dans leurs propres journaux s'ils ont été configurés pour cela, alors vérifiez également ces journaux.

Ne soyez pas découragé par la quantité de données dans les fichiers journaux d'un serveur occupé. Au lieu de cela, utilisez la commande tail pour afficher de manière sélective uniquement les dix lignes les plus récentes d'un journal. Par exemple :

    tail /var/log/apache2/error\_log

Vous pouvez voir les nouvelles entrées au fur et à mesure qu'elles sont ajoutées au journal des erreurs, ou à n'importe quel journal, pendant que vous testez le serveur si vous demandez à la tail commande pour "suivre" le journal. Par exemple :

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

Voici des exemples d'erreurs de configuration courantes liées aux autorisations qui peuvent apparaître dans les journaux d'Apache :

  • L'entrée de journal suivante montre que les autorisations sur index.html fichier pour vh2.example.com refusent l'accès à Apache.

    [error] [client 203.0.113.96] (13)Permission denied: access to /index.html denied
    
  • L'entrée de journal suivante montre que les autorisations sur /var/www/vhosts/vh2 bloquent la demande de lecture d'Apache.

    [error] [client 203.0.113.96] (13)Permission denied: file permissions deny server access: /var/www/vhosts/vh2/index.html
    
  • L'entrée de journal suivante montre qu'Apache n'a pas d'autorisations d'exécution ou de lecture sur l'un des répertoires au-dessus de DocumentRoot .

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

Linux
  1. Comment ajouter plusieurs hôtes dans phpMyAdmin

  2. Machines virtuelles multipasses à l'aide d'Ansible

  3. Ssh - Scp via plusieurs hôtes ?

  4. Comment renommer plusieurs fichiers à l'aide de Find ?

  5. Utilisation de SNI pour héberger plusieurs certificats SSL dans Apache

Héberger plusieurs domaines de messagerie dans PostfixAdmin sur CentOS/RHEL

Comment configurer les hôtes virtuels Apache sur Rocky Linux

Comment configurer les hôtes virtuels Apache sur Debian 11

Comment configurer les hôtes virtuels Apache sur Ubuntu 18.04

Comment configurer des hôtes virtuels Apache sur Ubuntu 20.04

Gestion des hôtes dédiés