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 deListen 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
Erreurs courantes liées aux autorisations
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 pourvh2.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