Vhosts

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Domaine Hôtes virtuels (VirtualHost) Apache
Convention Debian/Ubuntu sites-available/ + sites-enabled/
Convention RHEL/CentOS pas de convention native — arborescence libre + Include
Voir aussi Vhost drupal.conf · Proxy apache · Securiser apache 2

Les hôtes virtuels (vhosts) permettent à un même serveur Apache de servir plusieurs sites, distingués par nom de domaine (name-based) ou par IP/port dédiés (IP-based). Cette page couvre la convention sites-available/sites-enabled, héritée de Debian/Ubuntu mais reproductible manuellement sur toute distribution.

Préparation de l'arborescence

mkdir -p /etc/httpd/sites-available /etc/httpd/sites-enabled

Sur Debian/Ubuntu, cette arborescence existe nativement (/etc/apache2/sites-available, gérée par a2ensite/a2dissite) ; sur RHEL/CentOS, elle est à créer et à inclure manuellement dans httpd.conf :

# httpd.conf
Include /etc/httpd/sites-enabled/

(la directive historique NameVirtualHost, utilisée pour déclarer une IP:port comme hébergeant plusieurs vhosts par nom, a été supprimée en Apache 2.4 — le comportement est désormais automatique dès qu'au moins deux <VirtualHost> partagent la même adresse/port ; inutile de la déclarer sur une installation récente.)

Exemple de fichier de vhost

# /etc/httpd/sites-available/example.com.conf
<VirtualHost example.com:80>
    ServerAdmin admin@example.com
    ServerName  example.com
    ServerAlias www.example.com *.example.com

    DocumentRoot /home/ops/www/example.com/htdocs/
    <Directory "/home/ops/www/example.com/htdocs">
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog  /home/ops/www/example.com/logs/error.log
    CustomLog /home/ops/www/example.com/logs/access.log combined
</VirtualHost>

Pour un serveur local sans DNS, ajouter la résolution dans /etc/hosts de chaque poste client :

# /etc/hosts
192.0.2.10  example.com     example
192.0.2.10  dev.example.com dev

Activer le vhost

ln -s /etc/httpd/sites-available/example.com.conf /etc/httpd/sites-enabled/example.com.conf
mkdir -p /var/log/httpd/example.com/logs/
systemctl reload httpd

HTTPS

Génération d'un certificat auto-signé (test/dev)

# RHEL/CentOS
yum install mod_ssl
openssl pkcs12 -in fichier.pfx -nocerts -nodes -out privatekey.key
openssl pkcs12 -in fichier.pfx -clcerts -nokeys -out certificate.crt
# Debian
apt-get install openssl
mkdir /etc/ssl-certs && cd /etc/ssl-certs
openssl req -new -x509 -nodes -out server.crt -keyout server.key

Bloc VirtualHost HTTPS

<VirtualHost *:443>
    ServerAdmin webmaster@localhost

    SSLEngine on
    SSLProtocol -all +TLSv1.2 +TLSv1.3
    SSLCertificateFile    /etc/ssl-certs/server.crt
    SSLCertificateKeyFile /etc/ssl-certs/server.key

    DocumentRoot /var/www/monsite

    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>

    <Directory /var/www/monsite>
        Options FollowSymLinks MultiViews
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog /var/log/apache2/monsite-error.log
    LogLevel warn
    CustomLog /var/log/apache2/monsite-access.log combined
</VirtualHost>

(SSLProtocol et Require all granted modernisés par rapport à la source, qui n'excluait explicitement que SSLv2/SSLv3 et utilisait encore la syntaxe Apache 2.2 — voir Securiser apache 2 pour le choix des protocoles/suites en détail. Pour un certificat de production, préférer Let's Encrypt/Certbot à un certificat auto-signé.)

Voir aussi