Administration réseau sous Linux/Apache

Un livre de Wikilivres.



Apache est un serveur HTTP libre. Un serveur HTTP permet d'héberger des sites web qui seront accessibles avec un navigateur tel que Mozilla Firefox, Internet Explorer ou encore Chrome.

Un site web peut fournir tout type de contenu (des fichiers textes, HTML, Flash, zip…).

Ce contenu peut être statique (le serveur transmet un fichier au navigateur) ou dynamique (le contenu est généré par un programme exécuté par le serveur). Les sites web contiennent généralement plusieurs types de documents, certains étant statiques et d'autres dynamiques.

Nous traiterons ici d'Apache 2.2 sur un système Debian (et ses dérivés, comme Ubuntu).

Installation[modifier | modifier le wikicode]

LAMP[modifier | modifier le wikicode]

Logiciel tout-en-un pour Linux (Apache + MySQL + PHP), comme WAMP pour Windows.

commande nécessitant les privilèges root
# apt-get install tasksel
# tasksel install lamp-server

Installation manuelle[modifier | modifier le wikicode]

Apache sur Debian / Ubuntu[modifier | modifier le wikicode]

commande nécessitant les privilèges root
# apt-get install apache2

Le service peut ne pas être lancé par défaut, mais même s'il l'est on peut quand-même essayer de l'activer avec :

commande nécessitant les privilèges root
# /etc/init.d/apache2 start

On peut ensuite tester le serveur, pour voir si une page s'affiche ou s'il refuse la connexion :

commande

Cette adresse est le rebouclage, elle peut aussi être rentrée directement dans tout navigateur web.

Si Apache était déjà installé vérifier le fichier pour indiquer le démarrage automatique d'Apache 2 /etc/default/apache2 :

 # vi /etc/default/apache2
 ...
 NO_START=0
Installer PHP[modifier | modifier le wikicode]

On distingue principalement deux versions de PHP : celle dont le binaire est appelé par le serveur Web, et php-fpm qui possède son propre service daemon (aussi appelé par le serveur Web) testable ainsi :

telnet localhost 9000
CTRL + ALT + ]
quit

FPM signifie FastCGI Process Manager, puisque le processus PHP-fpm écoute les requêtes CGI[1]. Cela peut se traduire soit par des requêtes TCP/IP, soit par un socket Unix (.sock dans le vhost).

PHP peut-être installé avec toutes les déclinaisons de la distribution Debian (stable, testing, unstable). Il suffit pour cela d'insérer vos lignes préférées dans le fichier /etc/apt/sources.list :

deb http://ftp.fr.debian.org/debian/ stable main non-free contrib
deb-src http://ftp.fr.debian.org/debian/ stable main non-free contrib

Ce qui suit suppose que le serveur Web a bien été installé ; exécuter les commandes suivantes :

sudo apt-get update && apt-get install php8.2 && apt-get install libapache2-mod-php8.2

Une fois ces commandes exécutées, redémarrer le serveur Web. Dans le cas d'Apache cela s'effectue avec la commande suivante :

/etc/init.d/apache2 restart

Si tout s'est bien passé, vous disposez maintenant d'un serveur Web qui a la capacité d'exécuter des scripts PHP dans votre navigateur.

Testons :

commande

Pour débugger :

commande
$ tail /var/log/apache2/error.log
Mise à jour[modifier | modifier le wikicode]

Pour PHP 7 ou 8 sur Ubuntu :

sudo add-apt-repository ppa:ondrej/php

Sur Debian :

sudo wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
sudo sh -c 'echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'

Puis :

sudo apt update
sudo apt install php8.2 php8.2-common php8.2-cli php8.2-fpm

sudo a2enmod php8.2

Logo

Une fois les serveurs Web installés, ils se lancent automatiquement à chaque démarrage de la machine, ce qui est souhaitable pour un serveur, mais pas toujours pour un PC. Pour éviter cela, il suffit d'y désactiver les daemons :

sudo update-rc.d apache2 disable
sudo update-rc.d mysql disable
Bibliothèques[modifier | modifier le wikicode]

Voici une liste de bibliothèques fréquemment utilisées dans les applications :

# apt-get install -y \
    php8.2-mysql \
	php8.2-cli \
	php8.2-gd \
	php8.2-curl \
	php8.2-mbstring \
	php8.2-xml 

D'autres s'installent avec pecl au lieu de apt.

Pour les activer après installation, on peut éditer le php.ini ou lancer : phpenmod nom_du_module_php. Ex : sudo phpenmod gd.

Pour les désactiver : phpdismod nom_du_module_php

Pour détecter l'emplacement du php.ini de la version de PHP par défaut : php --ini.

Désinstaller PHP[modifier | modifier le wikicode]

Pour éviter de désinstaller tous les paquets PHP un par un (par exemple après une bascule de PHP7.0 vers PHP7.1), il existe "ppa-purge" :

sudo apt-get install ppa-purge
sudo ppa-purge ppa:ondrej/php-7.0

Apache sur Gentoo[modifier | modifier le wikicode]

Premièrement il faut installer Apache :

emerge apache

Ensuite, il faut installer PHP :

emerge dev-lang/php

Puis il faut qu'apache utilise PHP dans sa configuration.

Code : Configuration de apache
# nano -w /etc/conf.d/apache2
APACHE2_OPTS="-D PHP5"

MySQL seul[modifier | modifier le wikicode]

MySQL est disponible sur http://dev.mysql.com/downloads/gui-tools/5.0.html au format :

  1. .msi (Windows)
  2. .dmg (Mac)
  3. .rpm (Linux)
  4. .tar

En l'absence de gestionnaire de paquets, utiliser le .tar ainsi :

shell> groupadd mysql
shell> useradd -r -g mysql mysql
shell> cd /usr/local
shell> tar zxvf /path/to/mysql-VERSION-OS.tar.gz
shell> ln -s full-path-to-mysql-VERSION-OS mysql
shell> cd mysql
shell> chown -R mysql .
shell> chgrp -R mysql .
shell> scripts/mysql_install_db --user=mysql
shell> chown -R root .
shell> chown -R mysql data
shell> bin/mysqld_safe --user=mysql &

APT[modifier | modifier le wikicode]

$ sudo apt-get install mysql-server mysql_secure_installation
Variante[modifier | modifier le wikicode]

La dénomination des paquets mentionnés peut varier légèrement selon la version. Dans un terminal, entrez :

$ sudo apt-get install mysql-server

et confirmez.

(Remarque : il semblerait qu'en installant le paquet "mysql-server-5.0", au lieu du paquet mentionné plus haut, certaines personnes rencontrent des problèmes. Il est donc préférable d'installer ce paquet, ou d'installer la dernière version 4 stable avec : $ sudo apt-get install mysql-server-4.1. Consultez le forum pour plus d'informations : [1])

Lancez ensuite la commande :

cd && sudo mysql_secure_installation

Appuyez sur Entrée lorsqu'il vous demande le mot de passe root MySQL : pour le moment il n'y en a pas.


 MySQL a ses propres utilisateurs, avec leurs propres privilèges. Le root MySQL n'est donc pas le root système. Il est conseillé de ne pas mettre les mêmes mots de passes pour les utilisateurs MySQL et les utilisateur du système.

Le script vous demande alors si vous voulez mettre un mot de passe pour l'utilisateur root. Répondez Y, et entrez (2 fois le nouveau mot de passe du root MySQL). Il vous pose ensuite une série de questions. Si vous ne savez pas quoi répondre, acceptez les choix par défaut en appuyant simplement sur Enter.

Votre serveur MySQL est prêt. Par défaut il se lance à chaque démarrage du système, si vous ne le souhaitez pas, il vous suffit de lancer :

$ sudo dpkg-reconfigure mysql-server

et de répondre "Non" à la question du démarrage systématique de MySQL.

Sur Gentoo[modifier | modifier le wikicode]

emerge mysql

Modules[modifier | modifier le wikicode]

De nombreux modules complémentaires peuvent être installés sur Apache.

Pour les lister, on utilise apachectl (parfois apache2ctl) :

apachectl -t -D DUMP_MODULES

ou

apache2ctl -M

Pour activer un module :

a2enmod Nom_du_module

Un fichier est alors créé dans /etc/apache2/mods-enabled/.

Exemple pour la réécriture d'URL :

a2enmod rewrite

Pour le désactiver :

a2dismod Nom_du_module

La configuration du module reste toutefois disponible dans /etc/apache2/mods-available/.

 Les extensions PHP nécessitent une autre commande. Ex :
phpenmod mbstring

Sites[modifier | modifier le wikicode]

Pour lister les sites du serveur :

apachectl -S

Pour activer un site :

a2ensite Nom_du_site

Le fichier du site est alors visible dans /etc/apache2/sites-enabled/.

Pour le désactiver :

a2dissite Nom_du_site

Le site est dans /etc/apache2/sites-available/.

Problème d'encodage d'Apache2[modifier | modifier le wikicode]

Si vous rencontrez un problème d'encodage des caractères de vos pages, par exemple les caractères accentués apparaissant sous la forme "�" (<?>), c'est probablement parce qu'Apache2 déclare dans les en-têtes HTTP qui accompagnent les pages visionnées un encodage par défaut en Unicode (UTF-8) :

 Content-Type: text/html; charset=UTF-8

Tandis que les pages visionnées utilisent un autre encodage des caractères, comme par exemple Latin1 (ISO-8859-1). Même si vos documents indiquent le jeu de caractères utilisé, le paramètre donné par le serveur dans les en-têtes HTTP est prioritaire !

Pour corriger ce problème, il faudra éditer /etc/apache2/apache2.conf :

 $ sudo gedit /etc/apache2/apache2.conf

Encodage par défaut en Latin1 (ISO-8859-1)[modifier | modifier le wikicode]

Cherchez la ligne suivante :

 #AddDefaultCharset	ISO-8859-1

Décommentez-la en enlevant le # :

 AddDefaultCharset	ISO-8859-1

Pour ceux qui ont la locale iso-8859-15 (sinon vous pouvez faire "sudo dpkg-reconfigure locales" pour l'ajouter) et qui désirent l'utiliser par défaut, ajoutez un 5 en fin de ligne :

 AddDefaultCharset	ISO-8859-15

ainsi que la ligne suivante dans le paragraphe en-dessous :

 AddCharset ISO-8859-15 .iso8859-15  .latin15 .fr

Il ne vous reste plus qu'à mettre "fr" en première position dans la ligne LanguagePriority (juste au-dessus), et à demander à apache de relire sa configuration :

 $ sudo /etc/init.d/apache2 reload

Aucun encodage par défaut[modifier | modifier le wikicode]

Il est également possible de s'affranchir de tout encodage par défaut, de la manière suivante :

Cherchez la directive AddDefaultCharset :

 AddDefaultCharset	ISO-8859-1

Remplacez l'attribut par la valeur Off :

 AddDefaultCharset	Off

Là encore, on demandera à Apache de relire sa configuration :

 $ sudo /etc/init.d/apache2 reload

Maintenant, les en-têtes HTTP ne contiendront plus d'indication d'encodage des caractères. Attention : il faudra alors que chaque page indique l'encodage utilisé, car s'en remettre à la détection automatique par les navigateurs peut s'avérer assez aléatoire !




Fichiers log[modifier | modifier le wikicode]

Par défaut sous Debian, Apache enregistre les erreurs dans le fichier /var/log/apache2/error.log. Quand quelque chose ne fonctionne pas, ce fichier fournit souvent des pistes pour trouver la solution.

Il enregistre également toutes les requêtes dans /var/log/apache2/access.log.

Configuration de base[modifier | modifier le wikicode]

Sous Debian, Apache se lance automatiquement lorsqu'on l'installe et à chaque démarrage du système. Lorsqu'on modifie sa configuration, il faut lui faire prendre connaissance des changements avec la commande

/etc/init.d/apache2 reload

Pour l'arrêter, le lancer ou le relancer on utilisera la même commande avec stop, start ou restart.

Pour d'autres systèmes il faudra consulter la documentation du système ou celle d'Apache.

Configuration du serveur[modifier | modifier le wikicode]

La configuration du serveur se trouve dans /etc/apache2/apache2.conf. Ce fichier contient des instructions Include qui permettent de déplacer certaines parties de la configuration dans d'autres fichiers. Debian utilise cette fonctionnalité pour les modules (comme PHP) et la gestion des serveurs virtuels :

Configuration des modules[modifier | modifier le wikicode]

Le répertoire /etc/apache2/mods-available contient les modules installés. Le répertoire /etc/apache2/mods-enabled contient les modules activés. Les modules activés sont des liens symboliques vers les modules installés.

Pour activer ou désactiver un module, on peut manipuler directement les liens ou utiliser les commandes a2enmod et a2dismod (voir les pages de man).

Configuration des sites[modifier | modifier le wikicode]

De la même manière, le répertoire /etc/apache2/sites-available contient les sites web disponibles et /etc/apache2/sites-enabled les sites activés. Il en existe un préinstallé : le site default.

Les sites peuvent s'activer ou se désactiver en manipulant les liens dans sites-enabled ou en utilisant a2ensite et a2dissite.

Quelques directives classiques[modifier | modifier le wikicode]

La syntaxe d'Apache est assez simple. On trouve des blocs (ou contextes) comme par exemple :

<VirtualHost ...> # début de bloc VirtualHost
  ...
  <Directory ...> # début de bloc Directory
     ...
  </Directory>    # fin de bloc Directory
  ...
</VirtualHost>    # fin de bloc VirtualHost

et des directives comme par exemple

Include /etc/apache2/sites-enabled/

Les directives qui permettent de configurer le serveur lui-même sont généralement placées dans apache2.conf. Celles qui ne concernent qu'un site web sont déportées dans le fichier de configuration du site (sites-available/mon-site-web).

La directive DocumentRoot fixe la racine du serveur Web, c'est-à-dire le répertoire de base où se trouvent les documents. Par exemple avec la directive DocumentRoot /var/www/html, si le navigateur demande la page http://serveur/repertoire/fichier.txt, le serveur cherchera le fichier /var/www/html/repertoire/fichier.txt.

UserDir permet d'indiquer le répertoire personnel des utilisateurs du système. La directive UserDir public_html signifie qu'un utilisateur peut publier ses pages web personnelles dans un sous-répertoire public_html de son répertoire personnel. Pour l'utilisateur toto, c'est généralement /home/toto/public_html. Sa page d'accueil sera alors accessible par l'URL spéciale http://serveur/~toto.

DirectoryIndex indique la liste des fichiers qu'Apache cherchera à afficher si l'URL n'en précise pas. Par exemple si la configuration contient DirectoryIndex index.html index.php et qu'on demande l'URL http://serveur/repertoire/, Apache va chercher dans le répertoire un fichier index.html ou index.php. Si un de ces fichiers existe, il sera affiché. Sinon, Apache affichera soit la liste des fichiers, soit une erreur (suivant la présence de Indexes dans la directive Options).

AccessFileName définit le nom du fichier qu'on peut placer dans un répertoire pour en modifier sa configuration. Cela permet, par exemple, d'interdire localement l'affichage de la liste des fichiers, ou de protéger par mot de passe un répertoire et ses sous répertoires.

Listen indique à Apache sur quel port TCP il doit écouter. Le port par défaut du protocole HTTP est 80.

ServerName indique à Apache son nom de domaine et éventuellement son port. Il s'en sert lorsqu'il doit communiquer son adresse au client (le navigateur). C'est le cas par exemple lorsqu'on demande l'adresse http://serveur/repertoire sans slash (/) à la fin. Comme ce n'est pas une URL valide (l'URL d'un répertoire doit se terminer par un slash), Apache utilise la directive ServerName pour reconstruire une adresse avec un slash et la renvoi au client.

Gestion du nombre d'instances d'Apache[modifier | modifier le wikicode]

Le serveur Apache utilise plusieurs processus et prend en charge plusieurs types de stations multi-processeurs en utilisant les modules MPM (multi processing modules)[2].

Le premier module prefork utilise des processus (pour systèmes stables ou plus anciens), le deuxième worker utilise des threads, et le dernier des threads par processus. Le dernier module perchild est en cours de développement et n'est pas recommandé.

Celui utilisé par défaut sous Linux est prefork.

Exemple commenté[modifier | modifier le wikicode]

La partie du fichier de configuration traitant la gestion du nombre de processus est la suivante :

##
## Server-Pool Size Regulation (MPM specific) ##

# prefork MPM
# StartServers ......... nb de processus serveur au demarrage
# MinSpareServers ...... nb minimum de processus serveurs '''libres'''  instanciés
# MaxSpareServers ...... nb maximum de processus serveurs '''libres'''  instanciés. S'il y en a MaxSpareServers+1 on les tues
# MaxClients ........... nb maximum de processus serveurs qui peuvent demarrer
# MaxRequestsPerChild .. nb maximum de requètes gérées par processus serveur.
#                        Apres MaxRequestsPerChild requètes, le processus meurt.
#                        Si MaxRequestsPerChild=0, alors le processus n'expire jamais.

<IfModule prefork.c>
  StartServers 5
  MinSpareServers 5
  MaxSpareServers 10
  MaxClients 20
  MaxRequestsPerChild 0
</IfModule>

# pthread MPM # StartServers ......... initial  number of server processes to start
# MaxClients ........... maximum number of server processes allowed to start
# MinSpareThreads ...... minimum number of worker threads which are kept spare
# MaxSpareThreads ...... maximum  number of worker threads which are kept spare
# ThreadsPerChild ...... constant number of worker threads in each server process
# MaxRequestsPerChild .. maximum number of requests a server process serves

<IfModule worker.c>
  StartServers 2
  MaxClients 150
  MinSpareThreads 25
  MaxSpareThreads 75
  ThreadsPerChild 25
  MaxRequestsPerChild 0
</IfModule>

# perchild MPM # NumServers ........... constant number of server processes
# StartThreads ......... initial  number of worker threads in each server process
# MinSpareThreads ...... minimum number of worker threads which are kept spare
# MaxSpareThreads ...... maximum  number of worker threads which are kept spare
# MaxThreadsPerChild ... maximum  number of worker threads in each server process
# MaxRequestsPerChild .. maximum number of connections per server process (then it dies)

<IfModule perchild.c>
  NumServers 5
  StartThreads 5
  MinSpareThreads 5
  MaxSpareThreads 10
  MaxThreadsPerChild 20
  MaxRequestsPerChild 0
  AcceptMutex fcntl
</IfModule>

Pour activer le module :

 a2enmod mpm_prefork

On voit ensuite les processus d'avance :

$ ps -ef |grep apache
root     32026     1  0 15:16 ?        00:00:00 /usr/sbin/apache2 -k start
www-data 32029 32026  2 15:16 ?        00:00:00 /usr/sbin/apache2 -k start
www-data 32030 32026  0 15:16 ?        00:00:00 /usr/sbin/apache2 -k start
www-data 32031 32026  0 15:16 ?        00:00:00 /usr/sbin/apache2 -k start
www-data 32032 32026  0 15:16 ?        00:00:00 /usr/sbin/apache2 -k start
www-data 32033 32026  0 15:16 ?        00:00:00 /usr/sbin/apache2 -k start

Paramétrage des répertoires[modifier | modifier le wikicode]

Chaque répertoire auquel Apache accède peut être configuré indépendamment (et ses sous-répertoires en héritent).

Le paramétrage d'un répertoire se met dans un "conteneur" délimité par <Directory chemin_du_répertoire> et </Directory>. La configuration s'applique au répertoire et à tous ses sous répertoires. Si un sous-répertoire possède également sa propre configuration, elle vient s'ajouter à celle du parent.

Voici quelques exemples de contrôle d'accès. Plus de détails sont donnés dans la section "Un exemple de configuration".

# Configuration du répertoire racine du système
<Directory />
  # On n'autorise aucune option particulière
  Options None

  # Aucune modification n'est autorisé dans les fichiers .htaccess
  AllowOverride None
</Directory>

# Pour la racine du serveur:
<Directory /var/www/html>
  # Quelques options
  Options Indexes Includes FollowSymLinks

  # Les options peuvent être changées dans un .htaccess
  AllowOverride All

  # Permet à tout le monde d'accéder aux documents
  Allow from All

  # Spécifie comment appliquer la règle précédente
  Order allow,deny
</Directory>

# Le répertoire contenant des exécutables CGI
<Directory /usr/lib/cgi-bin>
  AllowOverride None
  Options ExecCGI
</Directory>

Les paramètres possibles de la directive Options sont : "None", "All", "Indexes", "Includes", "FollowSymLinks", "ExecCGI", ou "MultiViews".

Gérer les pages Web personnelles[modifier | modifier le wikicode]

Il est possible de permettre aux utilisateurs du système de diffuser des pages personnelles sans avoir à créer un site par utilisateur. Il faut pour cela utiliser le module userdir.

Le répertoire contenant le site web doit être créé dans le home de l'utilisateur et doit être accessible en lecture pour tous. Le nom du répertoire est défini par la directive UserDir. Par défaut il s'agit du répertoire public_html.

L'adresse pour accéder à ces sites personnels est le nom de l'utilisateur précédé d'un tilde (~).

Par exemple un utilisateur toto sur le serveur www.iut.clermont.fr peut créer les pages de son site dans le répertoire /home/toto/public_html, et on pourra y accéder avec l'adresse : http://www.iut.clermont.fr/~toto/.

Il est possible de n'autoriser que certains utilisateurs à bénéficier du UserDir. Par exemple pour n'autoriser que sasa et toto à avoir un site personnel :

UserDir disabled
UserDir enabled sasa toto

Pour définir les options de ces répertoires, on peut utiliser une clause Directory pour le répertoire /home/*/public_html :

<Directory /home/*/public_html>
  Order allow,deny
  Allow from all
</Directory>

La clause UserDir public_html ne fonctionne que pour des utilisateurs ayant un compte sur le système. L'URL http://www.iut.clermont.fr/~toto ne fonctionne que si toto est un véritable utilisateur (auquel cas l'expression Unix ~toto a un sens), pas seulement si le répertoire /home/toto/public_html existe.

On peut utiliser une autre forme de UserDir pour autoriser les répertoires sans forcément qu'il y ait un compte unix associé :

UserDir /home/*/public_html


Le CGI (Common Gateway Interface) est une norme permettant à Apache d'exécuter des programmes écrits en n'importe quel langage (Bash, C, Java, Perl, PHP, Python...), du moment qu'il est exécutable et qu'il respecte certaines contraintes d'entrées/sortie.

Configurer l'accès aux scripts CGI[modifier | modifier le wikicode]

Pour qu'Apache prenne en charge les scripts, il est nécessaire d'effectuer un minimum de paramétrage dans la configuration du site.

Activer le module[modifier | modifier le wikicode]

a2enmod cgi

ScriptAlias[modifier | modifier le wikicode]

La directive (de httpd.conf) :

ScriptAlias /cgi-bin/ /chemin des scripts/

précise le nom du répertoire où Apache est autorisé à exécuter des scripts CGI[3].

Exemple Unix :

ScriptAlias /cgi-bin/ /var/www/cgi-bin/

Exemple Windows, utiliser le format URL (pas d'antislash) :

ScriptAlias /cgi-bin/ "C:/wamp/bin/apache/apache2.2.27/cgi-bin/"

En fait le chemin /cgi-bin/ n'existe pas vraiment, il est dirigé vers le chemin des scripts défini par la directive, et cela permet d'écrire des URL comme http://serveur/cgi-bin/mon_script.

ExecCGI[modifier | modifier le wikicode]

La clause suivante active l'option ExecCGI dans /var/www/cgi-bin, ce qui autorise Apache à exécuter les scripts sur le serveur :

<Directory /var/www/cgi-bin>
  Options ExecCGI
</Directory>

Par exemple : vous écrivez un script essai.cgi, et vous voulez que /home/httpd/cgi-bin contienne les scripts.

Il faut donc au moins écrire :

<Directory /home/httpd/cgi-bin>
  Options ExecCGI
</Directory>

L'appel à un script essai.cgi sera effectué par l'URL : http://serveur/cgi-bin/essai.cgi

AddHandler[modifier | modifier le wikicode]

Cette clause permet de choisir les extensions de fichiers qui seront autorisés, ex :

AddHandler cgi-script .cgi .exe .pl .py .vbs

Récapitulatif[modifier | modifier le wikicode]

Exemple complet sur Windows, dans la configuration Apache :

ScriptAlias /cgi-bin/ "E:/www/cgi-bin/"
<Directory "E:/www/cgi-bin/">
  Options FollowSymLinks Indexes
  AllowOverride All
  Order deny,allow
  Allow from all
  Require all granted		
</Directory>

Dans E:/www/cgi-bin/.htaccess :

AddHandler cgi-script .cgi .exe .pl .py .vbs

Écrire un programme CGI[modifier | modifier le wikicode]

La contrainte principale concerne la sortie du programme. Si un programme CGI génère des données sur sa sortie standard, il doit les précéder d'un en-tête HTTP permettant de les identifier.

Bash[modifier | modifier le wikicode]

Voici un exemple de programme CGI écrit en bash :

#!/bin/bash

# Header
echo "Content-type: text/html"

# Fin du header
echo ""

# Contenu à afficher dans le navigateur
echo "<html><body>Hello World!</body></html>"

Ce script génère une page HTML.

Perl[modifier | modifier le wikicode]

#!c:/perl/perl/bin/perl.exe -w
use CGI;
my $query = new CGI;
my $Name = $query->param('Name');
print $query->header();
print "Hello World!"

Python[modifier | modifier le wikicode]

#!C:\Program Files (x86)\Python\python.exe
# -*- coding: UTF-8 -*-
print "Content-Type: text/plain;charset=utf-8"
print
print "Hello World!"
Pour plus de détails voir : Programmation Python/L'interface CGI.

VBS[modifier | modifier le wikicode]

Pour Windows[4].

'!c:/windows/system32/cscript //nologo
Wscript.Echo "Content-type: text/html" & vbLF & vbLF
WScript.Echo "Hello World!"
Wscript.Quit 0

Références[modifier | modifier le wikicode]

Le module PHP[modifier | modifier le wikicode]

PHP a normalement été intégré au serveur Apache sous forme d'un module chargeable situé comme tous les autres modules d'Apache dans /usr/lib/apache2/modules.

Les fichiers /etc/apache2/mods-availiable/php5.load et /etc/apache2/mods-availiable/php5.conf contiennent les directives LoadModule et AddType qui permettent à Apache d'exécuter du PHP quand on demande un fichier se terminant par .php. Ils doivent être liés dans /etc/apache2/mods-enabled pour activer PHP. On peut utiliser pour cela la commande a2enmod.

En marge de Apache, PHP possède lui aussi son fichier de configuration, souvent /etc/php.ini. Il n'est pas particulièrement conseillé d'y intervenir sauf si on sait ce que l'on fait. On peut néanmoins y observer que PHP prend bien en compte le module d'extension MySQL, contenant les fonctions d'accès au "moteur" de base de données MySQL (qui a dû être installé à part), par la présence de extension=mysql.so.

En cas de modification d'un fichier de configuration, comme PHP fonctionne comme module d'Apache, il faut redémarrer Apache pour qu'il réinitialise PHP par la lecture de php.ini.

/etc/init.d/apache2 restart



Principe[modifier | modifier le wikicode]

Pour protéger un répertoire en particulier (et ses sous-répertoires), il suffit de placer un fichier nommé .htaccess dedans. Apache appliquera instantanément ensuite les règles qu'il contient, uniquement dans cette arborescence. La syntaxe pour définit ces règles (ex : redirections ou protections) est la même que dans les vhosts, sauf que cela n'affectera que le répertoire du fichier .htaccess (donc pas de clause Directory).

Logo

L'explorateur de fichiers de Windows ne permet pas de rebaptiser des fichiers commençant par des points, il faut donc passer par un éditeur de texte.

Installation[modifier | modifier le wikicode]

Pour autoriser les .htaccess dans le .conf du site, utiliser AllowOverride[1] :

AllowOverride All

Pour les interdire :

AllowOverride None
Information :link={{{link}}}

Il est possible de tester ses directives en ligne (sans redémarrer Apache), par exemple sur https://htaccess.madewithlove.be/.

Références[modifier | modifier le wikicode]

Serveurs virtuels (virtual hosts)[modifier | modifier le wikicode]

Principe du vhost[modifier | modifier le wikicode]

Apache peut gérer plusieurs sites web simultanément. Ils seront tous accessibles à partir de la même adresse IP et du même port.

Pour les différencier, Apache se sert de l'adresse demandée par le navigateur.

Par exemple si site1.com et site2.com pointent sur la même adresse IP, les URL http://site1.com/ et http://site2.com/ aboutiront sur le même serveur.

Mais au moment de la requête, le navigateur précise qu'il a demandé l'adresse http://site1.com/ ou http://site2.com/.

Apache se sert de cette information pour savoir quel site afficher. On parle de serveur virtuel ou virtual host (vhost).

Configuration[modifier | modifier le wikicode]

Pour indiquer à Apache quel site correspond à un nom de domaine, on utilise une section <VirtualHost *>. Sous Debian, il y a généralement un fichier par section VirtualHost dans le répertoire /etc/apache2/sites-available.

La section devra contenir une directive ServerName[1] qui indiquera le nom associé à ce serveur virtuel.

Elle pourra également contenir une directive ServerAlias si on veut que d'autres noms aboutissent à ce site.

Par exemple[2] :

  • En Windows éditer C:\Program Files (x86)\EasyPHP\binaries\conf_files\httpd.conf
  • En Unix-like : /etc/apache2/httpd.conf ou /etc/apache2/apache2.conf
<VirtualHost _default_:80>
     ServerAdmin admin@site1.com
     DocumentRoot /home/site1/public_html
     ServerName site1.com
     ServerAlias www.site1.com
</VirtualHost>

<VirtualHost MonIP2:80>
     ServerAdmin admin@site2.com
     DocumentRoot /home/site2/public_html
     ServerName site2.com
     ServerAlias www.site2.com
     AccessLog /home/site2/access.log
     ErrorLog /home/site2/error.log
     <Directory /home/site2/public_html>
         AllowOverride All
     </Directory>
</VirtualHost>

Pour affecter tous les sites et ports, remplacer ceux-ci dans la première balise par *.

En cas d'erreur Apache d'ajouter une "directive" lors de sa relance, ajouter une ligne NameVirtualHost MonIP:MonPort.

La documentation d'Apache sur les serveurs virtuels[3] contient des informations détaillées sur le sujet.

Pour que ce serveur virtuel fonctionne, il est impératif que les noms site1.com et www.site1.com soient connus par la machine qui tente d'y accéder (celle qui lance le navigateur).

Pour cela il y a plusieurs méthodes :

  • acheter le nom de domaine en question et le configurer pour qu'il pointe sur la bonne adresse IP
  • utiliser un serveur DNS qui renverra la bonne IP pour ce domaine
  • modifier le fichier hosts sur la machine cliente pour faire correspondre ce domaine à la bonne adresse IP (voir le livre Installation et configuration d'une carte réseau)

Include[modifier | modifier le wikicode]

Pour éviter de copier-coller les mêmes lignes dans plusieurs vhost, il est possible de les inclure avec la directive "include"[4]. Exemple :

Include /etc/apache2/common.conf

ProxyPassMatch[modifier | modifier le wikicode]

Pour utiliser les daemons PHP-FPM (qui écoutent sur le port 9000), Apache doit rediriger les connexions avec ProxyPassMatch[5][6]. Ex :

 ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/var/www/mon_site/$1

Références[modifier | modifier le wikicode]

  1. http://httpd.apache.org/docs/2.2/mod/core.html#servername
  2. https://httpd.apache.org/docs/2.4/fr/vhosts/examples.html
  3. http://httpd.apache.org/docs/2.2/vhosts/
  4. https://httpd.apache.org/docs/2.4/mod/core.html#include
  5. https://www.vincentliefooghe.net/content/configuration-apache-24-php-fpm Exemple sur machine hôte
  6. http://www.inanzzz.com/index.php/post/su76/creating-apache-mysql-and-php-fpm-containers-for-a-web-application-with-docker-compose Exemple avec Docker

Exemples de configuration[modifier | modifier le wikicode]

Voici quelques exemples de configuration. L'ensemble des directives possibles peut être consulté ici : http://httpd.apache.org/docs/2.2/mod/directives.html

Pensez que les directives doivent parfois se trouver dans apache2.conf, parfois dans le contexte VirtualHost d'un site donné.

ServerType[modifier | modifier le wikicode]

ServerType standalone

Cette ligne indique si le serveur Apache se lance en 'autonome' (standalone) ou via inetd (TCP_WRAPPER). Pour la plupart des configuration, c'est en standalone. Cette directive a disparu de Apache2, qui dispose d'un autre moyen pour définir cela. Le comportement est en fait choisi d'après le MTM (Multi-processing module) choisi.

ServerRoot[modifier | modifier le wikicode]

ServerRoot /etc/apache2

(config serveur uniquement, pas dans un VirtualHost)

Vous indiquez ici le répertoire d'installation d'Apache. Normalement les scripts d'installation ont bien renseigné cette ligne. Vérifiez quand même.

LockFile[modifier | modifier le wikicode]

LockFile /var/run/httpd.lock

(config serveur uniquement, pas dans un VirtualHost)

Laissez cette ligne comme elle est, c'est à dire en commenté pour 90% des cas (# devant).

PidFile[modifier | modifier le wikicode]

PidFile /var/run/httpd.pid

(config serveur uniquement, pas dans un VirtualHost)

Vérifiez bien que cette ligne est décommentée. Elle indique au script de démarrage d'enregistrer le numéro de processus d'Apache pour que lors de l'arrêt du système le processus Apache soit stoppé correctement.

ScoreBoardFile[modifier | modifier le wikicode]

ScoreBoardFile /var/run/httpd.scoreboard

(config serveur uniquement, pas dans un VirtualHost)

Ce fichier stocke des informations pour le bon fonctionnement d'Apache.

Timeout[modifier | modifier le wikicode]

Timeout 300

(config serveur uniquement, pas dans un VirtualHost)

Temps en secondes avant que le serveur n'envoie ou ne reçoive un timeout . Quand le serveur attend une "réponse" (ex : script CGI, connexion\ldots), si au bout de ce temps, il ne reçoit pas de réponse, il va s'interrompre et prévenir l'utilisateur de l'erreur. Laissez cette valeur par défaut à moins que vous n'effectuiez des traitements dépassant cette limite. Ne pas monter trop haut cette valeur non plus car si le programme externe à "planté", ou si une erreur est survenue, vous risquez de rendre inaccessible le serveur Apache pour trop de temps (il est toujours désagréable d'attendre pour rien).

KeepAlive[modifier | modifier le wikicode]

KeepAlive on

Autorise ou non les connexions persistantes (plusieurs requêtes par connexions). En fait cela permet aux utilisateurs de votre serveur de lancer plusieurs requêtes à la fois, et donc d'accélérer les réponses du serveur. Laissez cette valeur par défaut la plupart du temps. Pour de petits serveurs laissez cette option sur on . Pour un serveur très sollicité, dès que vous vous apercevez que le système ralentit énormément ou devient indisponible assez souvent, essayez avec la valeur off . Mais avant, essayez de baisser la valeur de l'option suivante.

MaxKeepAliveRequests[modifier | modifier le wikicode]

MaxKeepAliveRequests 100

En combinaison avec l'option précédente, indique le nombre de requêtes pour une connexion. Laissez cette valeur assez haute pour de très bonnes performances. Si vous mettez 0 comme valeur, vous en autorisez en fait un nombre illimité (attention donc). Laissez la valeur par défaut là aussi.

KeepAliveTimeout[modifier | modifier le wikicode]

KeepAliveTimeout 15

Valeur d'attente en secondes avant la requête suivante d'un même client, sur une même connexion, avant de renvoyer un timeout. Là aussi laisser la valeur par défaut.

MinSpareServers & MaxSpareServer[modifier | modifier le wikicode]

MinSpareServers 5
MaxSpareServers 10

(config serveur uniquement, pas dans un VirtualHost)

Ces valeurs servent à l'auto-régulation de charge du serveur. En fait le serveur Apache contrôle lui même sa charge, suivant le nombre de clients qu'il sert et le nombre de requêtes que demandent chaque client. Il fait en sorte que tout le monde puisse être servi et ajoute tout seul un certain nombre d'instances Apaches "idle", c'est-à-dire qui ne font rien, mais sont prêtes à servir de nouveaux clients qui se connecteraient. Si ce nombre est inférieur à MinSpareServers il en ajoute une (ou plusieurs). Si ce nombre dépasse la valeur de MaxSpareServer il en arrête une (ou plusieurs). Ces valeurs par défaut conviennent à la plupart des sites.

Listen[modifier | modifier le wikicode]

Listen 3000
Listen 12.34.56.78
Listen 12.34.56.78:3000

Indique au serveur des ports ou des adresses IP (il y en a une par interface réseau du serveur!), ou les deux, où il doit "écouter" les demandes de connexions, EN PLUS de l'adresse et port par défaut. Voir la directive VirtualHost plus loin.

BindAdress[modifier | modifier le wikicode]

BindAdress *

Redondant avec Listen, cela permet de spécifier des adresses IP d'interfaces réseau, pour écouter les requêtes. Cette directive a disparu dans Apache 2.

Port[modifier | modifier le wikicode]

Port 80

Redondant avec Listen, cela permet de spécifier le port d'écoute (80 par défaut). Cette directive a disparu dans Apache 2.

LoadModule, ClearModuleList & AddModule[modifier | modifier le wikicode]

LoadModule xxxxxx.mod libexec/yyyyyy.so
ClearModuleList
AddModule zzzz.c

(config serveur uniquement, pas dans un VirtualHost)

Support pour les modules DSO (Dynamic Shared Object). LoadModule permet de charger un module. Avant Apache 2, les directives ClearModuleList et AddModule permettaient de spécifier l'ordre d'exécution des modules, à cause de problèmes de dépendances. Apache 2 peut maintenant faire cela automatiquement, car les APIs de modules leur permet de spécifier eux-mêmes leur ordre. Sous Apache 1.*, il faut cependant y prêter une grande attention, et le maintenir à jour à l'ajout de tout nouveau module.

ExtendedStatus[modifier | modifier le wikicode]

ExtendedStatus on

(config serveur uniquement, pas dans un VirtualHost)

Indique si le serveur doit renvoyer des informations complètes de statut (on ) ou des informations réduites (off ). off par défaut. Laissez cette valeur par défaut sauf en cas de développement et de debuggage.

User & Group[modifier | modifier le wikicode]

User nobody
Group nobody

Une fois le serveur démarré, il serait dangereux de lui laisser les droits root pour répondre aux requêtes. Il est donc possible de modifier l'utilisateur et le groupe du processus pour lui donner un minimum de droits sur la machine du serveur. (En fait si quelqu'un arrive à "exploiter" votre serveur, par exemple s'il arrive à faire exécuter du code par le serveur Apache, il hérite des droits du serveur lui même. Donc si c'est nobody il n'a aucun droit spécifique. Si c'est root ou un utilisateur réel, il aura alors des droits lui permettant d'endommager votre système.)

ServerAdmin[modifier | modifier le wikicode]

ServerAdmin root@localhost.domainname

Adresse e-mail de l'administrateur du site. Cette adresse est affichée par le serveur par exemple en cas d'erreur, pour que les utilisateurs puissent en avertir l'administrateur.

ServerName[modifier | modifier le wikicode]

ServerName www.domainname

Adresse que le serveur va renvoyer au client web. Il est préférable de mettre une adresse résolue par DNS au lieu du nom de la machine réelle, pour que les visiteurs ne voient pas le nom réel de votre machine (utile pour la sécurité aussi).

DocumentRoot[modifier | modifier le wikicode]

DocumentRoot /var/lib/apache/htdocs

Répertoire racine ou se trouve vos pages Web.

Directory[modifier | modifier le wikicode]

<Directory /var/lib/apache/htdocs>
  Options Indexes FollowSymlinks Multiviews
  AllowOverride None
  Order allow,deny
  Allow from all
</Directory>

Change les paramètres du repertoire /var/lib/apache/htdocs. On peut placer à l'intérieur les directives suivantes :

Options[modifier | modifier le wikicode]

on définit les options pour ce répertoire. Les options possibles sont les suivantes :

None Désactive toutes les options.
All Active toutes les options SAUF Multiviews.
Indexes Permet aux utilisateurs d'avoir des indexs généré par le serveur.

C'est à dire si l'index du répertoire (index.html le + souvent) est manquant, cela autorise le serveur a lister le contenu du répertoire (dangereux suivant les fichiers contenu dans ce répertoire).

FollowSymLinks Autorise a suivre les liens symboliques.
ExecCGI Autorise à exécuter des scripts CGI à partir de ce répertoire.
Includes Autorise des fichiers include pour le serveur.
IncludesNOEXEC Permet mais les includes mais empêche la commande EXEC (qui permet d’exécuter du code).
MultiViews Autorise les vue multiples suivant un contexte.

Par exemple permet d'afficher les pages dans un langage suivant la configuration du langage du client.

SymLinksIfOwnerMatch Autorise a suivre les liens seulement si l'user ID du fichier (ou répertoire) sur lequel le lien pointe est le même que celui du lien.

AllowOverride[modifier | modifier le wikicode]

définit comment sont gérés les fichiers .htaccess de ce répertoire :

All Gère tout ce qui est dans .htaccess
AuthConfig Active les directives d'autorisations AuthDBMGroupFile, AuthDBMUserFile, AuthGroupFile, AuthName, AuthType, AuthUserFile, Require, etc.
FileInfo Active les directives contrôlant le type de document (ErrorDocument, LanguagePriority, etc.)
Limit Active la directive d'autorisation Limit
None Ne lit pas le fichier .htaccess et laisse les droits "Linux" de ce répertoire.
Options Active la directive Option

Order[modifier | modifier le wikicode]

Donne l'ordre d'application des règles Allow/Deny  :

deny,allow Si le client ne correspond à aucune règle deny , mais correspond à une règle allow , alors on autorise (allow par défaut).
allow,deny Si le client ne correspond à aucune règle allow , mais correspond à une règle deny , on interdit (deny par defaut).\hline

Allow/Deny[modifier | modifier le wikicode]

Nom d'hôte Autorise/Refuse les hôtes spécifié, les adresses IP, le nom de domaine, etc...
All Autorise/Refuse tout le monde

À vous de placer vos règles suivant le contenu de vos répertoire accessibles par le Web. Il existe les mêmes règles pour les fichiers (<Files> </Files>) et les locations (<Location> </Location>). Voir un exemple pour les fichiers (file) plus bas.

DirectoryIndex[modifier | modifier le wikicode]

DirectoryIndex index.html index.htm index.php index.php5

Indique le ou les fichiers à charger lorsqu'on accède à un répertoire sans préciser de fichier. Dans cet exemple, si on accède à http://example.com/repertoire/, Apache cherchera un des fichiers mentionnés (index.html, index.htm...) et s'il en trouve un il l'affichera. S'il n'en trouve pas, il affichera la liste des fichiers ou interdira l'accès (suivant la présence ou non de l'option Indexes sur le répertoire).

AccessFileName[modifier | modifier le wikicode]

AccessFileName .htaccess

Nom du fichier des règles d'accès pour les règles AllowOverride. Un conseil: placez comme vu précédemment une règle file du style:

<Files .ht*>     #pour interdire aux visiteurs de voir le contenu des Order allow,deny
                 #fichiers .ht qui contiennent les règles de
  Deny from all  #sécurité.
</Files>

CacheNegotiatedDocs[modifier | modifier le wikicode]

#CacheNegotiatedDocs

Autorise ou pas les proxies à mettre en cache les documents (pour autoriser, enlevez le commentaire # en début de ligne)

UseCanonicalName[modifier | modifier le wikicode]

UseCanonicalName On

Placé sur on , réécrit l'URL par rapport aux valeurs Server et Port spécifiées plus haut dans le fichier httpd.conf.

Sur off , l'URL reste celle donnée par le client.

Attention, mettez sur on si vous utilisez des CGI avec des variables SERVER_NAME, car si l'URL du client n'est pas la même que celle du CGI, votre script CGI ne marchera pas.

DefaultType[modifier | modifier le wikicode]

DefaultType text/plain

Type mime par défaut que le serveur renvoie au clients. Convient dans la plupart des cas.

HostNameLookups[modifier | modifier le wikicode]

HostNameLookups off

Sur on , le serveur le nom du client grâce à une requête DNS inverse. Sinon, il se contente de l'adresse IP, ce qui génère beaucoup moins de trafic réseau.

ErrorLog[modifier | modifier le wikicode]

ErrorLog /var/log/error_log

Chemin complet du fichier où les erreurs seront enregistrées.

LogLevel[modifier | modifier le wikicode]

LogLevel warn

Niveau d'enregistrement des erreurs avec comme valeurs possibles, par ordre décroissant d'importance, donc croissant en bavardage:

emerg urgence : le serveur devient inutilisable
alert une intervention est nécessaire
crit erreurs critiques (accès réseau impossible par exemple)
error les erreurs dans les pages, scripts
warn les erreurs non bloquantes (pages mal codées, scripts comportant des erreurs non blocantes...
notice événement normal mais méritant d'être remarqué
info informations utiles (comme "serveur très chargé")
debug Enregistre TOUT ce qui peut se passer sur le serveur

Le niveau crit est le minimum recommandé, et on monte généralement à warn.

ServerSignature[modifier | modifier le wikicode]

ServerSignature on
on ajoute la signature (version, OS…) du serveur lorsqu'il génère des pages lui-même (index manquant, erreur de script, etc.)
off ne montre que l'erreur.
email ajoute un lien vers l'email définit par ServerAdmin

Alias[modifier | modifier le wikicode]

Alias faux_nom nom_réel

permet de faire des alias de répertoires (des liens en quelque sorte) (similaire à ScriptAlias /cgi-bin chemin_complet_des_cgi

AddType[modifier | modifier le wikicode]

AddType type extensions

(sous Apache2, cette directive devrait être dans un fichier mods-availabe/nom_module.conf, au lieu de apache2.conf)

Spécifie que des fichiers utilisant de telles extensions sont du type précisé. Cela permet de décider quoi en faire. Pour ajouter le support PHP, le fichier mods-enabled/php5.conf contient par exemple :

  AddType application/x-httpd-php .php .phtml .php3
  AddType application/x-httpd-php-source .phps

AddHandler[modifier | modifier le wikicode]

AddHandler cgi-script .cgi

Pour utiliser les scripts CGI.