Apache avec Virtual Hosts sur Debian
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'outilapache2ctl
. - Les répertoires
mods-available
etmods-enabled
contiennent la configuration des modules. - Les répertoires
sites-available
etsites-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 demods-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 modulesa2dismod
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
httpd.conf
est le fichier de configuration principal