Installation d’un serveur Web LAMP sur Debian
LAMP est le nom donné a la suite de logiciels qui permettent de faire fonctionner de nombreux serveurs Web :
- Linux : c’est l’OS
- Apache : c’est le serveur Web
- MySQL : c’est le système de gestion de bases de données
- PHP : C’est le moteur qui va permettre de dynamiser les sites web et de lier les deux éléments précédents.
Pré-requis :
Connaissances
- Connaissances de base en systèmes X (Linux, Unix, *BSD …)
- Culture générale en informatique
- Un système installé comme dans ce tuto
Spécifications :
- OS : Linux
- Distribution : Debian Etch
- Objectif : Mise en place d’un serveur Web
Le HTTP
Avant de commencer sur le chapitre Apache, il est utile de savoir avec quoi on va travailler, et comment ça marche.
Le HTTP ou HyperText Transport Protocol est un protocole de la couche 7 du modèle OSI (Application), il fonctionne en TCP sur le port 80 (par défaut).
Il permet d’intéragir avec un serveur Web avec des commandes simples comme : GET, POST, HEAD, PUT, DELETE.
Après chaque requête est retourné un code de réponse classifié selon son type :
- 2XX : La requête a été executée avec succès
- 3XX : La requête est redirigée
- 4XX : Le client provoque une erreur
- 5XX : Le serveur est en erreur
Vous trouverez bien plus d’informations sur ces pages :
- http://www.commentcamarche.net/contents/internet/http.php3
- http://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol
Il faut retenir simplement que pour communiquer de base avec votre serveur (pour diagnostiques), il suffit de faire un :
# telnet site.com 80
Et ensuite saisir vos requêtes.
Exemple avec une requête pour my-linux.fr
# telnet www.my-linux.fr 80
Trying 91.121.156.166…
Connected to my-linux.fr.
Escape character is ‘^]’.
GET / HTTP/1.1
Host: my-linux.fr
<html> …
Connection closed by foreign host.
Et les explications :
- telnet www.my-linux.fr 80 : telnet est l’utilitaire réseau permettant de communiquer sur un socket (TCP), www.my-linux.fr est l’IP où le nom d’hôte de la ressource que l’on cherche à atteindre, 80 est le port du socket (ici HTTP).
- Trying 91.121.156.166… : Le nom d’hôte a été traduit par son IP 91.121.156.166 par le service DNS, le telnet va maintenant tenter de s’y connecter via le port 80.
- Connected to my-linux.fr. : Nous avons réussi à nous y connecter.
- Escape character is ‘^]’. : Le caractère d’échappement qui fonctionne est Ctrl-$.
- GET / HTTP/1.1 : C’est la requête que j’ai tapé : GET correspond à la demande au serveur de me retourner une page, / correspond à l’URI demandée (soit le dernier / de http://www.my-linux.fr/ ), et HTTP/1.1 correspond à la version du HTTP utilisée.
- Host: my-linux.fr : Est une option d’entête, cela correspond à l’host que l’on utilise pour notre requête (Voir la partie VirtualHosts)
- <html> …. : Après avoir validé la requête par deux « Entrée », le résultat est retourné.
- Connection closed by foreign host. : Le serveur ferme la requête dés que son exécution est terminée.
Cela peut vous paraitre abstrait mais en mettant tout cela en pratique, ça rentrera plus facilement.
Installation d’Apache
Sur Debian il n’est pas compliqué d’installer Apache (en package), alors GO :
SRV-Linux:~# apt-get install apache2
Le serveur est déjà opérationnel après installation, pour tester il suffit d’aller via votre navigateur sur l’URL : http://Ip_du_serveur
… et un beau It Works! devrait s’afficher.
Configuration :
Sur Debian l’arborescence de la configuration diffère beaucoup de celle d’autres systèmes, l’ensemble des fichiers de conf est dans le repertoire /etc/apache2, et le fichier de configuration principal est /etc/apache2/apache2.conf.
Pour prendre en compte les modifications il faut redémarrer l’Apache avec la commande /etc/init.d/apache2 restart
Configuration générale : /etc/apache2/apache2.conf
Dans ce fichier, bien qu’il soit éclaté, il reste des options importantes pour la sécurité du serveur et le tunning de celui-ci, voici quelques une d’entre elles que l’on peut déjà configurer :
- User www-data : L’utilisateur sous lequel sera utilisé Apache, et sous lequel seront créés les fichiers
- Group www-data : Le groupe sous lequel sera utilisé Apache, et sous lequel seront créés les fichiers
- ErrorLog /var/log/apache2/error.log : Log d’erreur du serveur
- LogLevel warn : Verbosité du log
- Include * : Ces directives permettent l’inclusion d’autres fichiers dans ce fichier.
- ServerTokens Full : Il est conseillé de remplacer Full par Prodj, afin que le serveur ne donne pas des informations techniques comme l’OS, les versions ….
- ServerSignature On : Permet d’afficher une signature dans les pages générées par Apache (Erreurs 404 par exemple)
- ServerAdmin email@domaine.com : Vous pouvez rajouter cette option afin de préciser l’email du contact à afficher en cas de pépin.
Configuration réseau : /etc/apache2/ports.conf
Dans ce fichier est configuré, les ports et IP qui seront en écoute. Pour connaitre cette information en pratique, il suffit de saisir la commande :
SRV-Linux:/etc/apache2# netstat -ntpl | grep 80
tcp6 0 0 :::80 :::* LISTEN 2407/apache2
Ici le serveur Apache écoute sur toutes les IP sur le port 80.
Dans le fichier de configuration est configuré un Listen 80 ,donc si l’IP n’est pas précisée, toutes les IP seront écoutées.
Si on souhaite en plus écouter uniquement sur l’IP 127.0.0.1 sur le port 8080, on rajoutera Listen 127.0.0.1:8080 ,ce qui donnera :
SRV-Linux:/etc/apache2# netstat -ntpl | grep 80
tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN 2531/apache2
tcp6 0 0 :::80 :::* LISTEN 2531/apache2
Le résultat est bien au rendez vous.
Si on veut approfondir nos tests il suffit de faire un telnet IP PORT (Comme vu précédemment), pour voir si l’on parvient bien à se connecter.
Le charset par défaut : /etc/apache2/conf.d/charset
Le charset configuré par défaut est configuré dans ce fichier :
- AddDefaultCharset UTF-8 : Rien de compliqué, il suffit de choisir son Charset.
Les modules : /etc/apache2/mods-available et /etc/apache2/mods-enabled
Apache permet l’ajout de modules (ou extensions), permettant ainsi d’accroitre ses capacités, parmi :
- mod_php (Non installé avec Apache) : permet de travailler avec du PHP.
- mod_alias : Permet de manipuler des URL
- mod_rewrite : Permet de manipuler aussi des URL, avancé.
- mod_proxy : Permet de faire d’Apache un proxy HTTP simple
- mod_ssl : Permet de faire du SSL (https)
- L’ensemble des modules est disponible sur http://httpd.apache.org/docs/2.2/mod/ .
Le répertoire mods-available contient les fichiers chargements des modules et les fichiers de configurations de ceux-ci, mais désactivés.
Le répertoire mods-enabled contient la même chose mais activé.
Cette activation est tout simplement due à l’inclusion de tous les fichiers du répertoire mods-enabled, mais pas celle du répertoire mods-available.
Les modules en eux même sont dans /usr/lib/apache2/modules/ .
Une commande livrée avec le package Debian permet d’activer directement le modue en ligne de commande : a2enmod nom_du_module , cette commande créera un lien symbolique dans le répertoire mods-enabled vers les fichiers du module dans mods-available.
Pour désactiver le module : a2dismod nom_du_module
Un restart Apache est tout de même nécessaire après l’exécution de ces commandes pour prendre en compte les modifications.
Pour vérifier la présence d’un module :
SRV-Linux:/# apache2 -M
Les sites : /etc/apache2/sites-available /etc/apache2/sites-enabled
Même principe que pour les modules, les configurations des sites sont dans deux fichiers.
Pour activer un site : a2ensite nom_du_site (nom du fichier)
Pour le désactiver : a2dissite nom_du_site (nom du fichier)
Mais que mettre dedans ?
Réponse : Des VirtualHosts et/ou des configurations propres à chaque site hebergé.
Un VirtualHost c’est un environnement Apache propre à une ou plusieurs Hosts. Vous pourrez y mettre la plupart des fonctionnalités présentes dans la configuration générale, sauf qu’elles seront limités à l’host configurée.
Cette fonction permet entre autres de configurer plusieurs sites sur un même serveur, chacun pouvant pointer vers un répertoire différent, avec des logs différents, et autres configuration spécifiques aux sitse … .
L’host c’est quoi ? C’est le paramètre « Host: » envoyé à Apache (Souvenez vous, l’introduction du HTTP), c’est la partie que vous voyez dans votre barre d’adresse, composée comme suit en général : « sou(s)-domaine(s) . domaine . TLD (extension), comme www.my-linux.fr, mais elle peut être aussi une IP.
Attention : www.my-linux.fr n’est pas le même host que my-linux.fr ou que bichon.my-linux.fr
Ici my-linux.fr pourrait très bien pointer vers /var/www/root/
www.my-linux.fr vers /var/www/www/
bichon.my-linux.fr vers /var/www/admin
Avant de mettre tout cela en pratique nous allons revoir un peu la configuration de base fournie dans le package apache de Debian.
Un 000-default est déjà présent dans le répertoire des sites activées; désactivons le avec a2dissite 000-default
Le préfixe numéroté (000), permet de placer ce fichier en première position; les fichiers sont lus dans l’ordre alphabétique par leur nom.
Le premier VirtualHost est considéré comme VirtualHost par défaut, il faudra donc le définir dans un fichier qui se placera en début de liste; celui-ci sera appliquée à tout les Hosts non définit dans les autres Virtualhost.
Nous allons créer un premier fichier 000-Conf-Vhosts ou l’on définira les VirtualHost et leur nom, dedans on mettra la directive suivante.
NameVirtualHost *:80
Cette directive peut être insérée autant de fois que l’on souhaite, en changeant le paramètre (ici *:80), qui filtre l’action par IP (*) ici toutes, et le port (80).
Dans un second fichier 001-mon-super-site nous allons créer notre VirtualHost www.mon-super-site.fr qui doit pointer sur le répertoire /var/www/mon-super-site/ :
<VirtualHost *:80>
ServerName www.mon-super-site.fr
ServerAlias www.mon-super-site.fr www.monsupersite.fr monsupersite.fr
DocumentRoot /var/www/mon-super-site/
ErrorLog /var/log/apache2/mon-super-site/error_log
CustomLog /var/log/apache2/mon-super-site/access_log combined
</VirtualHost>
Rien de bien sorcier.
- <VirtualHost *:80> : On commence le virtualhost avec le nom (*:80) donné précédemment.
- ServerName www.mon-super-site.fr :C’est le nom principal de l’Host
- ServerAlias www.mon-super-site.fr www.monsupersite.fr monsupersite.fr 192.168.2.110 : Les alias du nom ci-dessus qui seront pris aussi en compte dans ce Vhost, vous remarquerez qu’une IP est un argument valide.
- DocumentRoot /var/www/mon-super-site/ : Repertoire du système sur lequel on fait pointer le site
- ErrorLog /var/log/apache2/mon-super-site/error_log : Fichier du log d’erreur
- CustomLog /var/log/apache2/mon-super-site/access_log combined : Fichier du log d’accès
- </VirtualHost> : Fermeture du VirtualHost
Attention au répertoires des fichiers de log, si ils n’existent pas, Apache ne les créera pas et plantera au redémarrage.
Et voilà, ce bloc peut être répété autant de fois que vous le souhaitez, en changeant les paramètres à votre guise. Vous aurez devinez qu’étant le seul Virtualhost, mysupersite sera le site par défaut.
Pour prendre en compte tout ça, activez les deux fichiers avec a2ensite, et rechargez Apache (/etc/init.d/apache2 reload).
Pour vérifier ces modifications, vous pouvez taper la commande apache2 -S
SRV-Linux:/# apache2 -S
VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:80 is a NameVirtualHost
default server www.mon-super-site.fr (/etc/apache2/sites-enabled/001-mon-super-site:1)
port 80 namevhost www.mon-super-site.fr (/etc/apache2/sites-enabled/001-mon-super-site:1)
Syntax OK
On voit bien les VirtualHost avec celui qui est pris par défaut.
Pour tester ça de votre PC, si l’Host de votre VirtualHost n’est pas géré sur un serveur DNS et/ou ne pointe pas sur votre serveur, vous pouvez (uniquement pour votre PC), forcer votre système à aller chercher l’IP de votre serveur quand vous ferez appel à celui-ci en modifiant votre fichier « hosts ».
- Sur Windows le fichier est placé dans C:\WINDOWS\system32\drivers\etc
- Sur Linux il est dans /etc/hosts
Rien de bien compliquer dans ce fichier, il suffit d’ajouter l’IP de votre serveur suivit des hosts, comme ceci :
192.168.2.110 www.mon-super-site.fr
Attention l’IP donnée ici est l’IP du serveur sur le réseau local, si votre serveur est accessible par Internet mettez son IP publique.
Pour tester ces modifications, vous pouvez tout simplement tester ça avec un ping :
C:\>ping www.mon-super-site.fr
Envoi d’une requête ‘ping’ sur www.mon-super-site.fr [192.168.2.110] avec 32 oct
ets de données :
Réponse de 192.168.2.110 : octets=32 temps=1 ms TTL=64
Réponse de 192.168.2.110 : octets=32 temps<1ms TTL=64
Réponse de 192.168.2.110 : octets=32 temps<1ms TTL=64
Réponse de 192.168.2.110 : octets=32 temps<1ms TTL=64
Statistiques Ping pour 192.168.2.110:
Paquets : envoyés = 4, reçus = 4, perdus = 0 (perte 0%),
Durée approximative des boucles en millisecondes :
Minimum = 0ms, Maximum = 1ms, Moyenne = 0ms
Si vous voulez que l’host soit gérée par un serveur DNS reportez vous au tuto sur Bind.
Testons ces modifications, dans le répertoire vers lequel pointe votre site (ici /var/www/mon-super-site/) créez un fichier index.html dans lequel vous mettez que ce que vous souhaitez. Allez ensuite sur celui ci (www.mon-super-site.fr), si tout se passe bien vous devriez retrouver le contenu de votre index.html .
Nous avons à présent mis en place Apache, le plus gros du boulot est fait, mais il reste encore quelques étapes avant que vous puissiez faire fonctionner vos sites web en PHP/MySQL sur notre serveur.
PHP/MySQL
Nous n’irons pas dans les détails car il n’y a pas grand chose à configurer pour des tâches basiques.
MySQL :
Installons pour commencer MySQL-Server :
SRV-Linux:/# apt-get install mysql-server
Tout comme Linux MySQL a son compte root. Par défaut il n’a pas de mot de passe, il va falloir donc lui en configurer un.
Tapez la commande mysql ,un prompt va s’afficher.
Puis changeons le mot de passe ou « monmdp » est le mot de passe :
mysql> UPDATE mysql.user SET password = PASSWORD(‘monmdp‘) WHERE user=’root’ ;
Et appliquons ça :
mysql> flush privileges ;
PHP5
PHP est un langage de programmation, mais surtout un moteur qui quand il fonctionne avec Apache génère des pages Web.
Le fonctionnement normal sans PHP est le suivant :
- L’utilisateur va demander une page (page.html)
- Apache va voir si elle est gérée par une application : AddType n’est pas présent pour les « .html » dans la configuration Apache.
- Apache se contente donc de la renvoyer tel qu’elle est sur le serveur à l’utilisateur.

Le fonctionnement est le suivant pour un site en PHP :
- L’utilisateur va demander une page (page.php)
- Apache de son coté va voir si l’extension (.php) est gérée par une application : AddType application/x-httpd-php .php .phtml .php3), php est bien là, Apache envoi la page au module PHP (x-httpd-php).
- PHP analyse la page et la renvoi à Apache en HTML.
- Apache renvoi la page en HTML à l’utilisateur.

Avec maintenant avec la couche MySQL en plus de tout ça. Nous avons donc à présent du MySQL :
- L’utilisateur va demander une page (page.php)
- Apache de son coté va voir si l’extension (.php) est gérée par une application : AddType application/x-httpd-php .php .phtml .php3), php est bien là, Apache envoi la page au module PHP (x-httpd-php).
- PHP analyse la page et si il voit du MySQL dedans, va si les conditions du script le permette se connecter au serveur et effectuer des requêtes vers celui ci.
- PHP renvoi la page à Apache en HTML
- Apache renvoi la page en HTML à l’utilisateur.

Assez de théorie, installons le :
SRV-Linux:/# apt-get install php5 php5-mysql
Nous installons ici PHP5 + l’extension qui lui permet de communiquer avec MySQL.
Le module avec Apache est installé automatiquement avec le package : libapache2-mod-php5 (/etc/apache2/mods-enabled/php5.load et /etc/apache2/mods-enabled/php5.conf).
Testons à présent ces nouvelles modifications :
Dans le repertoire de notre Virtualhost, effaçons le index.html créé précédement et créons un index.php .
Dans ce fichier mettez le contenu suivant :
<?php
phpinfo();
?>
Retour sur notre site Web, et là une page pleine d’informations s’affiche :

Cette simple page indique que PHP est fonctionnel et qu’il est interpété, car c’est PHP qui la génere et la renvoi à Apache.
PHPMyAdmin
Vous allez mettre à présent en pratique tout ce que vous avez appris en installant PHPMyAdmin.
PHPMyAdmin, est une interface de gestion MySQL en PHP.
Installation
Voilà ce que nous allons faire :
- Installer PHPMyadmin
- Le rendre accessible en HTTPS via une URL https://mysql.mon-super-site.fr
- Rediriger http://mysql.mon-super-site.fr vers https://mysql.mon-super-site.fr
Pour commencer, nous allons créer le repertoire dans lequel sera installé PhpMyAdmin :
SRV-Linux:/# mkdir /var/www/phpmyadmin
SRV-Linux:/# cd /var/www/phpmyadmin
On télécharge sur le site officiel http://www.phpmyadmin.net l’application (gratuite) :
SRV-Linux:/var/www/phpmyadmin# wget http://ovh.dl.sourceforge.net/sourceforge/phpmyadmin/phpMyAdmin-3.1.2-all-languages.tar.gz
On extrait :
SRV-Linux:/var/www/phpmyadmin# tar zxf phpMyAdmin-3.1.2-all-languages.tar.gz
Puis on renomme :
SRV-Linux:/var/www/phpmyadmin# mv phpMyAdmin-3.1.2-all-languages pma
Puis on lui donne les droits Apache :
SRV-Linux:/var/www/phpmyadmin# chown -R www-data: pma/
Le DocumentRoot de notre VirtualHost pour PhpMyAdmin sera donc /var/www/phpmyadmin/pma.
Création du VirtualHost
Nouvelle subtilité, vous avez du lire précédemment que le VirtualHost allait être en HTTPS (SSL), ce protocole (SSL) (responsable du cadenas jaune que vous voyez dans la barre d’adresse de votre navigateur quand il est activé), crypte les données qui transitent entre votre navigateur et le serveur Web. il fonctionne sur le port 443.
Pour commencer il faut installer OpenSSL :
SRV-Linux:/# apt-get install openssl
Et activer le module SSL d’Apache :
SRV-Linux:/# a2enmod ssl
Ensuite, ajoutez ce port dans la configuration Apache afin qu’il puisse écouter dessus (/etc/apache2/ports.conf), et après avoir redémarrer Apache, vérifiez qu’il écoute bien sur ce port.
Le SSL a besoin d’une clef et d’un certificat pour fonctionner.Pour que ce dernier soit certifié (qu’il soit un certificat de confiance) il faut passer par des autorités de certifications comme Thawte ou Verisign, et le coût peut être très elevé. Dans notre cas nous passerons par une alternative, qui est d’autosigner celui-ci. Le cryptage se fera bien, mais les utilisateurs qui iront sur votre site devront valider qu’ils ont confiance en ce certificat.
Attention ! Nouvelle subtilité, il n’est possible de définir qu’un seul certificat par IP.
Commencons par créer la clé :
SRV-Linux:/# openssl genrsa -out /etc/apache2/pma.key 1024
Puis le certificat :
SRV-Linux:/# openssl req -new -x509 -days 3650 -key /etc/apache2/pma.key -out /etc/apache2/pma.crt
Ici nous créons ensuite notre certificat auto signé avec 10 ans de validité.
Remplissez ensuite avec vos informations :
Country Name (2 letter code) [AU]:FR
State or Province Name (full name) [Some-State]:Ile de France
Locality Name (eg, city) []:Paris
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Mon Super Site
Organizational Unit Name (eg, section) []:Mon Super Site
Common Name (eg, YOUR name) []:mysql.mon-super-site.fr
Email Address []:admin@mon-super-site.fr
Nos deux fichiers sont à présent créés.
Nous allons donc créer le VirtualHost.
Dans le fichier 000-Conf-Vhosts nous allons ajouter une nouvelle ligne contenant l’IP locale et le port 443.
NameVirtualHost 192.168.2.110:443
Nous allons créer ensuite le VirtualHost dans un fichier 002-PhpMyAdmin :
<VirtualHost 192.168.2.110:443>
ServerName mysql.mon-super-site.fr
DocumentRoot /var/www/phpmyadmin/pma
SSLEngine On
SSLCertificateFile /etc/apache2/pma.crt
SSLCertificateKeyFile /etc/apache2/pma.key
CustomLog /var/log/apache2/pma/access_log combined
ErrorLog /var/log/apache2/pma/error_log
</VirtualHost>
- SSLEngine On : On active le SSL
- SSLCertificateFile /etc/apache2/pma.crt : On indique le chemin du certificat
- SSLCertificateKeyFile /etc/apache2/pma.key : On indique le cheminvers la clé
Le VirtualHost est créé, on va maintenant en faire un sur le port 80, qui redirige vers le site en HTTPS.
Dans le même fichier vous pouvez ajouter :
<VirtualHost *:80>
ServerName mysql.mon-super-site.fr
Redirect / https://mysql.mon-super-site.fr
</VirtualHost>
Ce Virtualhost va rediriger tout ce qui arrive avec l’host mysql.mon-super-site.fr sur le port 80 vers https://mysql.mon-super-site.fr .
On enregistre, on applique (a2ensite 002-PhpMyAdmin), et on redémarre.
La liste des VirtualHost est à présent :
VirtualHost configuration:
192.168.2.110:443 is a NameVirtualHost
default server mysql.mon-super-site.fr (/etc/apache2/sites-enabled/002-PhpMyAdmin:5)
port 443 namevhost mysql.mon-super-site.fr (/etc/apache2/sites-enabled/002-PhpMyAdmin:5)
wildcard NameVirtualHosts and _default_ servers:
*:80 is a NameVirtualHost
default server www.mon-super-site.fr (/etc/apache2/sites-enabled/001-mon-super-site:1)
port 80 namevhost www.mon-super-site.fr (/etc/apache2/sites-enabled/001-mon-super-site:1)
port 80 namevhost mysql.mon-super-site.fr (/etc/apache2/sites-enabled/002-PhpMyAdmin:1)
N’oubliez pas de mettre à jour votre fichier host ou votre DNS pour ce nouvel Host.
Allez à présent sur http://mysql.mon-super-site.fr/, vous devriez être redirigé vers https://mysql.mon-super-site.fr/, et une demande de confirmation pour le certificat devrait être faite > Acceptez.
Vous pouvez à présent vous connecter sur PhpMyAdmin avec comme login « root », et comme mot de passe le mot de passe définit dans la partie MySQL.
PhpMyAdmin necessite comme vous pouvez le voir dans l’interface, la librairie mcrypt, pour l’installer :
SRV-Linux:/# apt-get install php5-mcrypt
Ce tuto est à présent terminé. Si vous recontrez des soucis, n’hesitez pas à passer par le forum.