Mise en place d'un "serveur web" de A à Z

Bien que développé avec une distribution Debian 6 squeeze ce mini tutoriel sur la mise en place d'un environnement web peut servir d'exemple par son architecture pour d'autres distribution ou une distribution plus récente.

État des lieux et objectifs

Au terme de nos manipulations on aura:

On commence par se connecter en ssh sur le serveur.

$ ssh root@90.90.90.90
password: 

Créer les utilisateurs

On crée deux utilisateurs, toto pour toto.com et titi pour titi.com

# adduser toto
Enter new UNIX password: 
...
# adduser titi
Enter new UNIX password: 
...

On crée les répertoires "logs" et "www" dans chaque répertoire personnel des utilisateurs:

# mkdir /home/toto/logs
# mkdir /home/toto/www
# mkdir /home/titi/logs
# mkdir /home/titi/www

Comme c'est root qui fait tout depuis le début on rends les droits sur ses répertoires aux utilisateurs respectifs:

# chown -R toto:toto /home/toto
# chown -R titi:titi /home/titi

On veux désormais interdire le shell à ces deux utilisateurs (donc pas de ssh non plus).
Si la ligne "/bin/false" n'existe pas dans le fichier "/etc/shells" ce qui est le cas ici ...

# cat /etc/shells
/bin/csh
/bin/sh
/usr/bin/es
/usr/bin/ksh
/bin/ksh
/usr/bin/rc
/usr/bin/tcsh
/bin/tcsh
/usr/bin/esh
/bin/dash
/bin/bash
/bin/rbash

... on l'ajoute

# echo "/bin/false" >> /etc/shells

Maintenant on modifie le shell des utilisateurs.

# usermod -s /bin/false toto
# usermod -s /bin/false titi

On aurais pu créer les utilisateurs sans accès au shell directement avec la commande # useradd -s /bin/false toto

Installer et configurer le serveur ftp vsftpd

On l'installe bien sûr

# apt-get install vsftpd

puis on modifie le fichier de configuration

# nano /etc/vsftpd.conf

# mode standalone du serveur
listen=YES
# autoriser ou non les connections annonymes
anonymous_enable=NO
# autoriser les utilisateurs locaux à se connecter
local_enable=YES
# permettre aux utilisateurs d'écrire
write_enable=YES
# umask des utilisateurs locaux.
local_umask=022
# restreindre les utilisateurs à leur répertoire personnel
chroot_local_user=YES
# Personnaliser le message d'accueil
ftpd_banner=Bienvenue sur 90.90.90.90

Il ne reste plus qu'à redémarrer le serveur

# /etc/init.d/vsftpd restart

Voila, désormais chaque utilisateur du système à un accès à son répertoire local en ftp.

Depuis vsftpd 3 > il faudra ajouter l'option allow_writeable_chroot=YES à votre fichier de configuration si vous souhaitez activer l'option chroot_local_user=YES.
Vérifiez la version de votre vsftpd : $ vsftpd -v

Voir au besoin le wiki Debian et/ou Debian Facile

Installer le serveur web Apache

Le serveur proprement dit

# apt-get  install apache2

Une suite d'outils complémentaires

# apt-get  install apache2-utils

A ce stade le serveur est fonctionnel pour des pages html placées dans /var/www/. Les noms de domaines, s'il redirigent bien vers 90.90.90.90, doivent aussi permettre d'accéder à ce répertoire.

Il faut maintenant créer un fichier de configuration pour chaque domaine dans le quel on inscrira, entre autre, les chemin vers les répertoires respectifs "logs" et "www" qui ont été créés plus haut.
Par convention, ces fichiers seront nommés comme le domaine qu'ils représente: toto.com.conf et titi.com.conf.
On les crée dans le répertoire /etc/apache2/sites-available/.

# nano /etc/apache2/sites-available/toto.com.conf

On crée alors deux hôtes virtuels pour chaque domaine, un pour www.toto.com et un pour toto.com (sans www) qui répondront sur le port 80.

<VirtualHost *:80>
        ServerName www.toto.com
        DocumentRoot /home/toto/www
        ErrorLog /home/toto/logs/error_log
        CustomLog /home/toto/logs/access_log combined
        <Directory /home/toto/www>
         Options ExecCGI -Indexes -MultiViews +SymLinksIfOwnerMatch
                AddHandler cgi-script .cgi .pl
                Order deny,allow
                Allow from all
                AllowOverride All
                php_flag apc.cache_by_default On
        </Directory>
        <IfModule mpm_itk_module>
                AssignUserId toto toto
        </IfModule>
        php_admin_value default_charset UTF-8
</VirtualHost>

<VirtualHost *:80>
        ServerName toto.com
        DocumentRoot /home/toto/www
        ErrorLog /home/toto/logs/error_log
        CustomLog /home/toto/logs/access_log combined
        <Directory /home/toto/www>
         Options ExecCGI -Indexes -MultiViews +SymLinksIfOwnerMatch
                AddHandler cgi-script .cgi .pl
                Order deny,allow
                Allow from all
                AllowOverride All
        </Directory>
        <IfModule mpm_itk_module>
                AssignUserId toto toto
        </IfModule>
        php_admin_value default_charset UTF-8
</VirtualHost>

On répète la même opération mais pour le domaine titi.com.

# nano /etc/apache2/sites-available/titi.com.conf
...

On se rends maintenant dans le répertoire "sites-enabled", voisin de "sites-available", d'où l'on y créera des liens symboliques vers les deux fichiers fraichement créés.

# cd /etc/apache2/sites-enabled/
ln -s ../sites-available/toto.com.conf toto.com.conf
ln -s ../sites-available/titi.com.conf titi.com.conf

on peut aussi utiliser les outils a2ensite et a2dissite

Et enfin on relance le serveur Apache

# /etc/init.d/apache2 restart

On peut maintenant tester le bon fonctionnement des deux domaines en plaçant un fichier .html quelconque mais au contenu différent pour chaque domaine afin de constater une différence.

Attention, Php n'est pas encore installé, les pages .php ne seront donc pas interprétés mais lues comme de simple fichier texte.

Installer Php et MySql

# apt-get  install php5 php5-dev php5-gd

On pourrais se contenter de apt-get install php5

On redémarre Apache pour que les changements soient pris en compte

# /etc/init.d/apache2 restart

Voila c'est tout pour Php, installons maintenant MySql

# apt-get install mysql-server php5-mysql

Durant l'installation il est demandé de choisir un mot de passe, tachez de vous en souvenir.

Pour des raisons de sécurité et de logique il est conseillé de créer un utilisateur MySql et de lui attribuer une ou plusieurs base de données.
Pour cela connectons nous en tant que root MySql avec le mot de passe précédemment créé

# mysql -u root -p
Enter password:

Une fois sur le prompt MySql on crée un utilisateur et une bdd pour chaque domaine.

mysql> CREATE USER 'toto'@'localhost' IDENTIFIED BY 'mot_de_passe1';
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT USAGE ON * . * TO 'toto'@'localhost' IDENTIFIED BY 'mot_de_passe1' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT ALL PRIVILEGES ON `totodb` . * TO 'toto'@'localhost';
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE USER 'titi'@'localhost' IDENTIFIED BY 'mot_de_passe2';
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT USAGE ON * . * TO 'titi'@'localhost' IDENTIFIED BY 'mot_de_passe2' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;
Query OK, 0 rows affected (0.00 sec)
mysql> GRANT ALL PRIVILEGES ON `titidb` . * TO 'titi'@'localhost';
Query OK, 0 rows affected (0.00 sec)

Voila qui est fait, on peut quitter le prompt MySql en tapant exit, quit, \q ou [CTRL+d].

Enfin pour conclure il ne nous reste plus qu'à installer un outil "graphique" pour administrer nos bases de données.

# apt-get install phpmyadmin

Qui sera accessible depuis les adresses:

Toute installation classique de PhpMyAdmin utilisera ce chemin pour accéder à l'interface d'administration. On peut modifier cela en modifiant l'alias dans le fichier "apache.conf" de phpmyadmin.

# nano /etc/phpmyadmin/apache.conf

Puis modifier la ligne

Alias /phpmyadmin /usr/share/phpmyadmin

par

Alias /ce_que_vous_voulez /usr/share/phpmyadmin

Il faudra alors entrer l'adresse "http://www.domaine.com/ce_que_vous_voulez" pour accéder à l'interface d'administration de phpmyadmin.

Petites retouches et bon à savoir

Ajouter un sous domaine

On ajoute un sous domaine un peu de la même manière que l'on crée un nouveau domaine.
On édite un fichier sd1.toto.com.conf dans le répertoire /etc/apache2/sites-available et on crée un lien symbolique de ce fichier dans le répertoire sites-enabled.

Le contenu du fichier sera plus succinct que ceux créés plus haut

<VirtualHost *:80>
       DocumentRoot /home/toto/www
       ServerName sd1.toto.com
       <Directory /home/toto/www>
               Options -Indexes +FollowSymLinks
               AllowOverride All
       </Directory>
</VirtualHost>

On oubliera pas de redémarrer apache

Lister les modules actifs d'Apache

# apache2ctl -t -D DUMP_MODULES

On peut aussi obtenir ces informations avec "phpinfo()"

Prise en charge par défaut d'un charset

# nano /etc/apache2/conf.d/charset

dé-commenter la ligne

AddDefaultCharset UTF-8

Dig un outil pour tester sa configuration DNS

# dig toto.com +short
90.90.90.90

Un peu plus à propos de la commande dig

^