Linux:Administration d'Apache2

Un article de Djjnet.

Cette section va décrire les principales directives de configuration d'un site (VirtualHost) sous Apache et des éléments de configuration globaux. Nous verrons plus loin dans la documentation des éléments plus particuliers de la configuration.

Les éléments indiqués sont basés sur une distribution Debian mais sont valables hors chemin des fichiers de configuration pour une autre distribution.

Sommaire

Généralités

Les directives peuvent être simple et d'autres sous forme de blocs incluant d'autres directives.

  • Simple :
Element Valeur
  • Bloc :
<bloc>
 Element1 Valeur
 <sousbloc>
  Element2 Valeur2
  Element3 Valeur3
  Element1 Valeur5
 </sousbloc>
 Element4 Valeur4
</bloc>

Un élément défini dans la configuration peut souvent être défini dans un bloc (par exemple un VirtualHost), il sera alors valable que pour ce bloc.

Fichiers de configuration

  • Principal : /etc/apache2/apache2.conf ou /etc/httpd/conf/httpd.conf pour RedHat.
  • Inclusion :

Il est possible de faire des inclusions pour organiser la configuration, soit un fichier simple ou tous les fichiers d'un dossier. Les inclusions sont faites depuis le fichier principale, ensuite il peut y avoir des inclusions dans un fichier inclus. Par exemple :

# Include module configuration:
Include /etc/apache2/mods-enabled/*.load
Include /etc/apache2/mods-enabled/*.conf
# Include ports listing
Include /etc/apache2/ports.conf

Configuration Globale

  • Ports d'écoute d'Apache /etc/apache2/ports.conf :
Listen 80
Listen 443

S'il n'y a pas Listen 443, un site en https ne pourra pas marcher. Vérifier avec netstat ...

  • Information sur le serveur, sur les versions, il est préférable de les cacher :
ServerSignature Off
ServerTokens    Prod
  • Gestion des processus :
<IfModule mpm_prefork_module>
   StartServers          5
   MinSpareServers      10
   MaxSpareServers      20
   ServerLimit         1024
   MaxClients          768
   MaxRequestsPerChild   15000
</IfModule>

Dès qu'il y a PHP c'est ce module qui est utilisé pour la gestion des processus. Les trois principaux éléments de configuration sont :

MaxClients : qui définit la limite de clients autorisés à se connecter.

ServerLimit : doit être >= à MaxClients. Il doit être défini dès que MaxClient>256.

Si vous avez l'erreur suivante dans les logs Apache c'est que MaxClients n'est pas adapté. Attention, il ne faut pas l'augmenter sans réfléchir, il y a des conséquences sur l'utilisation Mémoire, par exemple avec memory_limit de php.

server reached MaxClients setting, consider raising the MaxClients setting

MaxRequestsPerChild : il faut idéalement ne pas laisser cette valeur à 0 (Par défaut) sinon il n'y a pas de recyclage des processus. 15000 est une bonne valeur.

  • Information sur l'état d'apache comme le nombre de connexions en cours par exemple :

Ces informations sont accessibles par l'adresse spécifique /server-status et est limitée en accès au serveur. Il ne faut pas l'autoriser pour n'importe quelle source.

<Location /server-status>
   SetHandler server-status
   Order deny,allow
   Deny from all
   Allow from 127.0.0.1
</Location>
  • Fichiers par défaut à utiliser pour l'accès à un dossier :
DirectoryIndex index.html index.cgi index.pl index.php index.xhtml

Pour l'accès à un dossier http://www.site.com ou http://www.site.com/dossier/ Apache regardera si un fichier nommé comme dans la liste existe en recherchant dans l'ordre indiqué et l'utilisera. Sinon si le listing est autorisé, alors il affichera la liste des fichiers/dossiers de celui-ci ou indiquera une interdiction d'accès (403).

Cette directive peut être définie spécifiquement par VirtualHost.

VirtualHost

Sous Debian, les VirtualHosts sont généralement mis dans /etc/apache2/site-available et activés par un lien symbolique dans /etc/apache2/site-enabled.

Il faut d'abord savoir qu'apache répondra sur le site par défaut si on lui adresse une demande pour un virtualhost non configuré. Les sites par défaut est le premier virtualhost qu'apache trouvera dans le fichier de configuration pour un port donné.

Pour commencer il faut mettre la directive NameVirtualHost par port d'écoute et/ou par ip d'écoute selon la configuration. Par exemple :

NameVirtualHost *:80

Dans ce cas, Apache écoute sur toutes les IP pour le port 80.

NameVirtualHost 192.168.100.101:80

Dans ce cas, Apache écoute sur l'ip 192.168.100.101 pour le port 80.

Attention dans le cas du 443, il ne doit normalement y avoir qu'un seule couple IP/Port par certificat SSL, donc il n'y a pas plusieurs virtualhost par certificat. Il n'y aura pas de NameVirtualHost si SSL est activé.

Ensuite les VirtualHost doivent garder la même syntaxe que le NameVirtualHost.

Exemple de définition d'un virtualhost (Ce n'est qu'un exemple et non pas ma configuration) :

<VirtualHost *>
       ServerAdmin webmaster AT dj-j.com
       ServerName www.dj-j.net
       ServerAlias dj-j.net

       DocumentRoot /var/www/www.dj-j.net/html/
       <Directory /var/www/www.dj-j.net/html/>
               Options -Indexes FollowSymLinks MultiViews
               AllowOverride All
               Order allow,deny
               allow from all
       </Directory>

       ScriptAlias /cgi-bin/ /var/www/www.dj-j.net/cgi-bin/
       <Directory "/var/www/www.dj-j.net/cgi-bin/">
               AllowOverride None
               Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
               Order allow,deny
               Allow from all
       </Directory>

       ErrorLog /var/www/www.dj-j.net/logs/error.log
       CustomLog /var/www/www.dj-j.net/logs/access.log combined

       Alias /stats/ /var/www/www.dj-j.net/stats/
       <Directory /var/www/www.dj-j.net/stats/>
               Options Indexes FollowSymLinks MultiViews
               AllowOverride All
               Order allow,deny
               allow from all
       </Directory>
</VirtualHost>
  • Signification des éléments du virtualhost :
    • ServerAdmin : indication de l'administrateur, non affiché si ServerSignature vaut Off et ServerTokens vaut Prod.
    • ServerName : il s'agit de l'adresse principale du site, elle est nécessaire dès qu'il ne s'agit pas du site par défaut. Il n'y a qu'une fois cette directive par Virtualhost.
    • ServerAlias : permet de définir d'autres adresses utilisées pour un site. Il peut y avoir plusieurs fois cette directive.
    • DocumentRoot: Indique le dossier où trouver les fichiers pour la racine du site.
    • Directory : Indique des options et les droits d'accès aux dossiers sur le serveur. Correspond généralement au dossier du DocumentRoot. Cette directive peut être mise en global à tout le serveur.
    • Options Indexes : dans ce cas, il est possible de lister le contenu d'un dossier. Il est préférable de mettre Options -Indexes pour l'interdire
    • Order allow,deny et Allow from all : cela permet de limiter l'accès par IP, dans ce cas tout le monde à accès, c'est ce qu'il faut pour un site standard, on ne détaille pas ce point dans cette documentation.
    • ScriptAlias et Alias : Défini une adresse du site pointant vers un dossier hors du DocumentRoot. ScriptAlias est utilisé pour l'exécution de script (il ne s'agit pas de script php ou de pages html standard mais des programmes en bash ou c par exemple). Pour ScriptAlias il faut ajouter Options ExecCGI pour autoriser l'exécution.


Modules

Apache permet de charger des modules complémentaires en fonction des besoins. Ils sont activés en indiquant à apache le chemin du module et des paramètres complémentaires si besoin.

Sous Debian, les modules disponibles sont dans /etc/apache2/mods-available/ et ceux activés dans /etc/apache2/mods-enabled.

Prenons le cas de PHP, il faut avoir une ligne de ce type pour l'activer :

  • Fichier /etc/apache2/mods-enabled/mods-enabled/php5.load
LoadModule php5_module /usr/lib/apache2/modules/libphp5.so

Puis le fichier de configuration pour indiquer d'interpréter le code php avec le module activé.

  • Fichier /etc/apache2/mods-enabled/mods-enabled/php5.conf
<IfModule mod_php5.c>
 AddType application/x-httpd-php .php .phtml .php3
 AddType application/x-httpd-php-source .phps
</IfModule>

Rewrite et Redirect

Nous verrons dans cette partie quelques exemple simples de redirections.

Dans l'exemple ci-dessous, nous allons tout simplement faire une redirection d'une adresse en http vers le site en https :

<VirtualHost *:80>
   ServerAdmin webmaster@dj-j.com
   ServerName site.dj-j.net
   Redirect / https://site.dj-j.net/
</VirtualHost>

Redirect indique à apache de renvoyer l'internaute vers https://site.dj-j.net/ lorsqu'il demande http://site.dj-j.net/

Il est possible de préciser le type de redirection (type 301 ou 302) et préciser des url précises avec RedirectMatch :

<VirtualHost *:80>
   ServerAdmin webmaster@dj-j.com
   ServerName site.dj-j.com
   RedirectMatch 301 /secure/(.*) https://site.dj-j.net/$1
</VirtualHost>

Les parenthèses délimitent la chaîne de caractère qui sera remplacé par $1, $2 ... il peut en effet y avoir plusieurs sélection avec les parenthèses.

Dans cet exemple, on renvoie vers le https uniquement les URL du sous-dossier /secure/. Ainsi http://site.dj-j.net/dj-j.php n'est pas renvoyé vers le site en https mais http://site.dj-j.net/secure/paiement.php est renvoyé vers https://site.dj-j.net/secure/paiement.php

.* signifie n'importe quel caractère (.) répété de 0 à n fois (*).

Rewrite permet de faire plus de chose et surtout avec des conditions plus avancée.

Il faut d'abord l'activer :

RewriteEngine On

Puis mettre des règles avec RewriteRule.

Par exemple, vous avez enlevé une image mais des personnes y accèdent toujours, vous pouvez leur afficher une autre image ainsi :

RewriteRule /images/image-supprimee.jpg /var/www/site.dj-j.net/images/nouvelleimage.jpg

Dans ce cas, on indique à Apache l'utilisation d'un autre fichier, l'utilisateur n'est pas renvoyé vers la nouvelle. C'est transparent pour l'internaute. Il faut dans ce cas, indiquer le chemin complet sur le système de fichiers du serveur.

Ajoutons des conditions :

 RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
 RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d
 RewriteRule ^.*\.(html|xml|pdf|json)$ /index.php [L]

Dans ce cas, si les fichiers demandés ne sont pas des fichiers ou des dossiers physiques sur le serveur alors on renvoie vers /index.php pour les URL termintant par html, xml, pdf ou json.

RewriteRule dispose d'options qui sont indiquées à la fin entre []. Là le L indique que c'est la dernière règle à appliquer si elle est utilisée.

Rewrite et RedirectMatch utilise les expressions régulières :

  • ^ signifie le début
  • $ signifie la fin

Plus de détail dans la documentation Apache : http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html

Sécuriser Apache

Pour sécuriser Apache, commencer par ne pas afficher d'information sur la version installée de votre apache, insérer dans le fichier de configuration :

ServerSignature Off
ServerTokens    Prod

Baisser la valeur du timeout à 300 par défaut à 60 (timeout est utilisé pour les GET/POST/PUT et ACK des paquets tcp) :

Timeout 60

Interdire les accès aux fichiers du système :

<Directory />
  Options -All -Multiviews
  AllowOverride None
  Order deny,allow
  Deny from all
  Allow from none
</Directory>

Attention, une inclusion ou un fopen en php fonctionne, il faut ajouter dans le vhost une valeur du type :

php_admin_value open_basedir /var/www/site

Supprimer des machines dans les logs Apache

Ajouter à votre virtualhost une variable d'environnement :

Pour enlever une seule machine :

SetEnvIf Remote_Addr 1\.2\.3\.4 dontlog

Pour enlever plusieurs machines :

SetEnvIf Remote_Addr ^(1\.2\.3\.4|2\.3\.4\.5) dontlog

Puis changer la ligne indiquant le fichier des logs d'accès :

CustomLog /var/logs/apache/site.log combined env=!dontlog


VirtualHost et paramètre PHP

Il est possible de donner pour un site précis une valeur spécifique à un paramètre.
Exemple : mettre à off register_globals alors qu'il est à on dans php.ini

<VirtualHost 213.251.16...:80>
   ServerName www.domaine.com
   ...
   php_value register_globals off
</VirtualHost>
php_value  nom  valeur   
php_flag  nom  on|off
php_admin_value  nom  valeur
php_admin_flag  name  on|off