Apache avec Virtual Hosts sur Debian

En cours de rédaction

Ce sujet est très bien documenté sur le Net, par contre le faire à la “façon Debian” est plus rare, surtout quand on ne parle pas anglais.

Installation

Pour installer Apache, c'est très simple : le paquet apache2 contient tout ce qu'il faut. Ensuite, Apache a une architecture modulaire, on peut donc ajouter des modules disponibles dans des paquets dont le nom est libapache2-<nom du module>.

# aptitude install apache2

Spécificités Debian

Sous Debian, les répertoires importants sont :

  • /etc/apache2: contient la configuration
  • /var/www: contient la racine de l'arborescence accessible par défaut
  • /var/log/apache2: contient les logs

Organisation de la configuration

Sous Debian, la configuration est eclatée en plusieurs fichiers et répertoires dans /etc/apache2, qui permettent de plus facilement gérer les modules et les virtual hosts :

  • Le fichier de configuration principal est apache2.conf.
  • Le fichier habituel1) httpd.conf est vide par défaut. On peut l'utiliser pour ajouter des configuration spécifiques.
  • Le fichier ports.conf contient la configuration nécessaire pour faire écouter Apache sur certains port TCP.
  • Le fichier envvars contient les variables d'environnement qui seront utilisées par les processus Apache et l'outil apache2ctl.
  • Les répertoires mods-available et mods-enabled contiennent la configuration des modules.
  • Les répertoires sites-available et sites-enabled contiennent la configuration des virtual hosts.

Gestion des modules

Comme dit précédemment, la gestion des modules s'articule autour des répertoires mods-available et mods-enabled. Le principe est très simple :

  • La configuration spécifique de chaque modules est stockées dans mods-available dans 2 fichiers par module:
    • un module.load pour charger le module
    • un module.conf pour la configuration particulière du module
  • Lorsqu'un module est activé, 2 liens symboliques sont créés par module (un pour chacun fichier) dans mods-enabled pointant vers les fichiers de mods-available

Dans le fichier de configuration principal apache2.conf, seuls le contenu de mods-enabled est inclut ; cette organisation permet d'avoir un certain nombre de configurations prêtes à être activés.

Pour gérer ces fichiers plus facilement, deux outils spécifiques à Debian sont fournis :

  • a2enmod pour activer des modules
  • a2dismod pour les désactiver

Voici un exemple:

# a2enmod
Your choices are: actions alias asis auth_basic auth_digest auth_plain authn_alias authn_anon
authn_dbd authn_dbm authn_default authn_file authnz_ldap authz_dbm authz_default authz_groupfile
authz_host authz_owner authz_user autoindex cache cern_meta cgi cgid charset_lite dav dav_fs
dav_lock dbd deflate dir disk_cache dump_io env expires ext_filter file_cache filter headers
ident imagemap include info ldap log_forensic mem_cache mime mime_magic negotiation php5 proxy
proxy_ajp proxy_balancer proxy_connect proxy_ftp proxy_http rewrite setenvif speling ssl status
substitute suexec unique_id userdir usertrack version vhost_alias
Which module(s) do you want to enable (wildcards ok)?
ssl
Enabling module ssl.
See /usr/share/doc/apache2.2-common/README.Debian.gz on how to configure SSL and create self-signed certificates.
Run '/etc/init.d/apache2 restart' to activate new configuration!

Sans argument, a2enmod demande quels modules activer (on aurait pour taper a2enmod ssl directement) et fournit des informations. Il indique surtout qu'elle commande utiliser pour activer la nouvelle configuration.

Comme la configuration de SSL (HTTPS) n'est pas triviale, on se la garde pour plus tard, on va donc désactiver le module avec a2dismod:

# a2dismod ssl
Module ssl disabled.
Run '/etc/init.d/apache2 restart' to activate new configuration!

De la même manière que a2enmod, a2dismod indique la commande à lancer pour que la nouvelle configuration soit effective.

Gestion des sites (virtual hosts)

Tout d'abord, qu'est-ce qu'un virtual host ? Il s'agit d'un site virtuel, selon la façon dont accède au serveur, par un nom de domaine particulier, on peut obtenir un site web différent. Ainsi, le même serveur Apache peut servir plusieurs sites, et chaque configuration (nom, répertoires des fichiers) est dans un virtual host différent. Par exemple, http://www.andesi.org est le virtual host du présent wiki et http://forum.andesi.org est celui de notre forum.

La configuration des vitual hosts utilise le même principe que les modules, on crée un fichier de configuration par site dans sites-available et les sites sont activés par la création d'un lien symbolique vers le fichier de configuration dans sites-enabled.

Comme pour les modules, Debian fournit deux utilitaires pour gérer ces liens symboliques : a2ensite et a2dissite. Il faut noter que le site par défaut (nommé default) est traité différemment, le lien symbolique résultant est 000-default pour être sûr que ce fichier est chargé en premier par Apache.

Configuration initiale

Sauf pour des besoins particuliers, rien ne sert de modifier le fichier de configuration principal (apache2.conf). Il contient les paramètres de configuration bas-niveau ainsi que les limites pour requêtes et l'inclusion du reste de la configuration.

Ici, on va modifier le virtual host par défaut. Plus tard, on va utiliser /var/www comme répertoire de stockage des virtual hosts, mais ce répertoire est la racine du virtual host par défaut, ce qui fait que tout les sites seraient visibles dedans. On va donc changer ça pour utiliser /var/www/default à la place.

On édite donc /etc/apache2/sites-available/default. La configuration est entourée par <VirtualHost> et </VirtualHost> indiquant qu'il s'agit d'un virtual host. On va donc changer :

  • Le DocumentRoot et ses accès, pour utiliser /var/www/default.
  • Désactiver le CGI par défaut, pour plus de sécurité on ne l'activera que dans les virtuals hosts qui en ont besoin.
  • La configuration des logs pour utiliser /var/log/apache2/default.

On obtient:

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/default
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/default>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>
#       ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
#       <Directory "/usr/lib/cgi-bin">
#               AllowOverride None
#               Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
#               Order allow,deny
#               Allow from all
#       </Directory>
        ErrorLog /var/log/apache2/default/error.log
        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn
        CustomLog /var/log/apache2/default/access.log combined
    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>
</VirtualHost>

Ensuite, on crée les répertoires :

# mkdir /var/www/default
# mv /var/www/index.html /var/www/default
# mkdir /var/log/apache2/default

Enfin, il faut modifier la configuration de logrotate pour prendre en compte le nouvel emplacement des logs, il faut éditer /etc/logrotate.d/apache2 :

/var/log/apache2/*/*.log
/var/log/apache2/*.log {
        weekly
        missingok
        rotate 52
...

Pour tester, on relance Apache et on va visiter http://localhost/, on doit obtenir un énorme “It works!” :)

Créer un virtual host

En se basant sur le virtual host default, on peut facilement ajouter un nouveau site. Pour ce nouveau site, on a besoin des informations suivantes :

  • Le port réseaux sur lequel il sera accessible, pour l'exemple, on prendra le port TCP/80 (par défaut)
  • Le nom de domaine du site, pour l'exemple, on prendra vhost1.mondomaine.org

Voici donc l'exemple, à placer dans /etc/apache2/sites-available/vhost1.mondomaine.org :

<VirtualHost *:80>
        ServerAdmin [email protected]
        ServerName vhost1.mondomaine.org
        DocumentRoot /var/www/mondomaine.org/vhost1
        <Directory /var/www/mondomaine.org/vhost1>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>
        ErrorLog /var/log/apache2/mondomaine.org_vhost1/error.log
        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn
        CustomLog /var/log/apache2/mondomaine.org_vhost1/access.log combined
</VirtualHost>

Voici les point importants pour cette configuration:

  • On indique le port dans la balise <VirtualHost>
  • La directive ServerName indique le nom de domaine complet du site
  • On place le virtual host dans /var/www/<domaine>/<site> (DocumentRooot)
  • On configure l'accès au répertoire avec un directive <Directory>
  • On sépare enfin les logs.

Pour utiliser un port réseau particulier dans un virtual host, il faut que le fichier /etc/apache2/ports.conf contienne les directives NameVirtualHost et Listen, pour qu'Apache autorise les virtual hosts pour ce port et qu'il écoute sur le port TCP, par exemple pour le port 8080 :

NameVirtualHost *:8080
Listen 8080

Ensuite, on doit définir le nom complet du site avec la directive ServerName. Ce nom doit exister dans le DNS et et pointer sur la machine hébergeant le serveur Apache.

Pour définir le répertoire de stockage des fichiers du site, on utilise la directive DocumentRoot. Ici, on a fait le choix de créer une arborescence baser où il y aura un répertoire par domaine, chaque virtual host ayant son sous-répertoire dans son domaine. Cela permet de partir de ranger dès le départ ses sites. La variable DocumentRoot ne suffit pas, il faut configurer les droits d'accès au répertoire, avec un bloc Directory :

  • Options: les options minimales pour afficher le contenu des répertoires sans fichier index (Indexes), suivre les liens symboliques (FollowSymLinks) et autorise la négociation de contenu (MultiViews) pour mettre des fichiers multilingues par exemple.
  • AllowOverride All: permet de modifier les options par fichier .htaccess au sein du répertoire.
  • Enfin, autorisation d'accès à tout le monde.

Pour les logs, notre configuration de logrotate ne gère qu'un niveau de sous-répertoires de /var/log/apache2, c'est pourquoi on les place dans /var/log/apache2/<domaine>_<site>.

Maintenant qu'on a un virtual host prêt, il faut créer les répertoires manquants:

# mkdir -p /var/www/mondomaine.org/vhost1
# mkdir /var/log/apache2/mondomaine.org_vhost1

Finalement, on active le nouveau site :

# a2ensite vhost1.mondomaine.org
Enabling site vhost1.mondomaine.org.
Run '/etc/init.d/apache2 reload' to activate new configuration!
# invoke-rc.d apache2 reload

On peut désormais visiter http://vhost1.mondomaine.org.

Configurer l'accès en HTTPS

Support des langages de scripts

PHP

Ruby on Rails

Python

Perl

FastCGI

Authentification

LDAP

MySQL

PostgreSQL

1) Sur beaucoup d'autres distributions, httpd.conf est le fichier de configuration principal
 
web/apache-avec-des-virtual-hosts.txt · Dernière modification: 11/12/2010 17:42 par orgrim