Photographies, informatique et bien d'autres choses…

Serveur dédié – Apache, PHP, MySQL et phpMyAdmin

26 octobre 2010 | Posté dans Serveur dédié | Vu 845 fois

Maintenant que la base de notre serveur est en place, nous allons nous atteler à la mise en place des outils nécessaire au bon fonctionnement de nos sites web.

Pour ce faire, nous allons utiliser les programmes suivants :

  • le serveur web Apache
  • le serveur de bases de données MySQL
  • le moteur de scripts PHP
  • et le gestionnaire de bases de données MySQL, phpMyAdmin

L’installation des 3 premiers programmes peut se faire en une seule ligne de commande :
[root@serveur:~]# apt-get install apache2 mysql-server libapache2-mod-php5 php5-curl php5-gd php5-mysql

Il ne nous reste plus qu’à configurer ces programmes.

Configuration d’Apache

La configuration par défaut proposée par Debian est presque parfaite et il n’y a à mon avis qu’une seule modification à effectuer dans le fichier /etc/apache2/conf.d/security :
ServerSignature Offafin d’éviter que les versions d’Apache, de PHP et de Linux ne soient affichées sur les pages d’erreurs de nos sites.

Avant de nous attaquer à la configuration des hôtes virtuels pour chaque site que nous hébergerons, modifions légèrement la page d’accueil de l’hôte par défaut, qui sera affichée pour chaque site redirigé sur notre serveur dont nous n’aurons pas encore défini l’hôte virtuel. Ainsi nous pourrons avoir un message d’erreur personnalisé au lieu du simple « It works! » affiché par défaut.

Commençons par renommer le fichier /var/www/index.html en /var/www/index.php :
[root@serveur:~]# mv /var/www/index.html /var/www/index.php puis on l’édite :
[root@serveur:~]# vim /var/www/index.php et on remplace le contenu actuel par le suivant :
<html>
<head>
<title><?php echo $_SERVER['HTTP_HOST']; ?></title>
<style>
body {text-align: center;}
h1 {margin-top: 20%;}
</style>
</head/>
<body>
<h1><?php echo $_SERVER['HTTP_HOST']; ?></h1>
<p>est actuellement en cours de construction.</p>
<p>Merci de revenir plus tard.</p>
</body></html>
Ainsi la page par défaut d’un site pas encore configuré affichera un message du type « www.mondomaine.ch est actuellement en cours de construction. Merci de revenir plus tard. »www.mondomaine.ch est automatiquement remplacé par le nom du site demandé.

Ceci étant fait, passons à la configuration des hôtes virtuels de chacun des sites que nous hébergeons. Créons tout d’abord le répertoire qui contiendra tous nos sites ainsi qu’un sous-répertoire par site :
[root@serveur:~]# mkdir /home/www
[root@serveur:~]# mkdir /home/www/mondomaine.ch
[root@serveur:~]# mkdir /home/www/monautresite.ch
[root@serveur:~]# chown -R www-data:www-data /home/www/
La dernière commande permet de définir le propriétaire de tous ces dossiers à www-data, qui est l’utilisateur Apache, afin qu’il puisse accéder sans problème à nos dossiers.

Comme vous pouvez le voir, j’ai créé ces dossiers dans le répertoire /home, car comme le montre la commande df -h, le répertoire /home est sur une partition séparée et bien plus grande que le reste, ainsi nous ne risquons pas de surcharger notre partition de base avec nos sites :
[root@serveur:~]# df -h
/dev/sda1 5.0G 826M 4.0G 18% /
tmpfs 984M 0 984M 0% /lib/init/rw
udev 10M 2.7M 7.4M 27% /dev
tmpfs 984M 0 984M 0% /dev/shm
/dev/sda2 226G 209M 215G 1% /home

Dirigeons-nous maintenant dans le répertoire /etc/apache2/sites-available/ pour y configurer notre premier hôte virtuel. Nous créons le fichier de configuration au nom de notre site :
[root@serveur:/etc/apache2/sites-available]# vim mondomaine.ch et ajoutons-y les instructions suivantes :
<VirtualHost *:80>
ServerName www.mondomaine.ch
ServerAlias mondomaine.ch *.mondomaine.ch
ServerAdmin hostmaster@mondomaine.ch
DocumentRoot /home/www/mondomaine.ch
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /home/www/mondomaine.ch>
Options -Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
ErrorLog /var/log/apache2/mondomaine.ch.error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog /var/log/apache2/mondomaine.ch.access.log combined
</VirtualHost>
sans oublier de rendre disponible le site et de recharger Apache pour qu’il prenne en compte notre configuration :
[root@serveur:/etc/apache2/sites-available]# a2ensite mondomaine.ch
[root@serveur:~]# /etc/init.d/apache2 reload
et le tour est joué, il ne nous reste plus qu’à mettre les fichiers de notre site dans son répertoire /home/www/mondomaine.ch et notre site sera disponible pour toute la planète !

Configuration de MySQL

La configuration par défaut de MySQL est très bien, si ce n’est que nos bases de données sont sauvegardées dans le répertoire /var/lib/mysql/ et comme nous l’avons vu plus tôt, la partition racine n’est pas bien grande, aussi si nous ne voulons pas nous retrouver coincé par manque de place et avoir un message du style « /etc/init.d/mysql: ERROR: The partition with /var/lib/mysql is too full! » lors d’un redémarrage de MySQL, nous avons intérêts à déplacer nos bases de données sur la partition /home.

On arrête le serveur MySQL :
[root@serveur:~]# /etc/init.d/mysql stop Déplacement des bases :
[root@serveur:~]# mv /var/lib/mysql/ /home/ Modification de la configuration de MySQL (fichier /etc/mysql/my.cnf) :
datadir = /home/mysql Redémarrage du serveur MySQL :
[root@serveur:~]# /etc/init.d/mysql start

Et le tour est joué ! Il ne nous reste plus qu’à créer notre première base de données pour notre premier site.

Connexion à MySQL en temps que root :
[etienne@serveur:~]$ mysql -u root -p
Enter password:
Créons la base de données pour notre premier site :
mysql> create database mondomaine; Créons un nouvel utilisateur :
mysql> create user "mondomaine"@"localhost"; Et attribuons lui un mot de passe :
mysql> set password for "mondomaine"@"localhost" = password("mot_de_passe"); Pour finir, donnons tous les droits à cet utilisateur sur la base de données que nous venons de créer :
mysql> grant all on mondomaine.* to "mondomaine"@"localhost"; Et nous indiquons à MySQL de prendre en compte la modification des autorisations :
mysql> flush privileges;

Vous pouvez maintenant vous déconnecter de MySQL (mysql> exit;), vous y reconnecter avec votre nouvel utilisateur (mysql -u mondomaine -p) et visualiser les bases de données auxquels il a accès (mysql> show databases;).

Configuration de PHP

La configuration de PHP se passe elle dans le fichier /etc/php5/apache2/php.ini. Afin d’assurer une sécurité optimale, les options suivantes sont à vérifier/modifier :
short_open_tag = Off
asp_tags = Off
safe_mode = Off
expose_php = Off
display_errors = Off ; empêche l'affichage des erreurs, très important sur un serveur en production
log_errors = On ; unique moyen de voir les erreurs sur un serveur en production si vous avez défini l'option display_errors à Off.
register_globals = Off

Si vous avez effectué des modifications dans ce fichier, n’oubliez pas de relancer Apache afin qu’il en tienne compte :
[root@serveur:~]# /etc/init.d/apache2 restart

Installation et configuration de phpMyAdmin

Pour ceux qui ne le savent pas encore, phpMyAdmin est un fabuleux programme développé en PHP qui nous permet d’agir directement en ligne sur nos bases de données MySQL.

Afin d’avoir une version toujours à jour, nous allons télécharger la dernière version depuis le site officiel de phpMyAdmin et créer un hôte virtuel du type sql.mondomaine.ch afin d’y accéder directement.

Commençons par créer le répertoire qui va accueillir le programme :
[root@serveur:~]# mkdir /home/phpmyadmin puis récupérons l’archive de la dernière version du logiciel, la version 3.3.8 dans mon cas :
[root@serveur:~]# cd /home/phpmyadmin
[root@serveur:/home/phpmyadmin]# wget http://downloads.sourceforge.net/project/phpmyadmin/phpMyAdmin/3.3.8/phpMyAdmin-3.3.8-all-languages.tar.gz
décompressons l’archive :
[root@serveur:/home/phpmyadmin]# tar -zxvf phpMyAdmin-3.3.8-all-languages.tar.gz renommons le dossier nouvellement créé afin de simplifier la suite :
[root@serveur:/home/phpmyadmin]# mv phpMyAdmin-3.3.8-all-languages stable supprimons l’archive qui ne nous est plus utile :
[root@serveur:/home/phpmyadmin]# rm phpMyAdmin.3.3.8-all-languages.tar.gz et changeons le propriétaire du dossier /home/phpmyadmin afin qu’Apache puisse y accéder sans problème :
[root@serveur:~]# chown -R www-data:www-data /home/phpmyadmin

Ensuite nous copions le fichier config.sample.inc.php en config.inc.php et nous l’éditons afin d’y ajouter un mot de passe permettant de crypter les données :
[root@serveur: ~]# cd /home/phpmyadmin/stable
[root@serveur: ~]# cp config.sample.inc.php config.inc.php
[root@serveur: ~]# vim config.inc.php
et nous éditions la ligne suivante :
$cfg['blowfish_secret'] = ''; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */ où nous ajoutons le mot de passe de notre choix entre les guillemets simples :
$cfg['blowfish_secret'] = 'un3suite2caractères'; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */

Passons maintenant à la configuration de notre sous-domaine sql.mondomaine.ch. Si vous avez suivi mon précédent article Serveur dédié – IP Failover, DNS et Reverse IP, vous devez commencez par ajouter le sous-domaine à la configuration du DNS. Éditons le fichier /etc/bind/db.mondomaine.ch et ajoutez-y le sous-domaine comme suit :
sql 10800 IN A 188.165.37.xx en indiquant bien entendu l’adresse IP de votre serveur et sans oublier de modifier le serial en début de page, puis redémarrons le serveur DNS :
[root@serveur:~]# /etc/init.d/bind9 restart

Créons maintenant le fichier de configuration de notre hôte virtuel. Tout se passe dans le répertoire /etc/apache2/sites-available :
[root@serveur:/etc/apache2/sites-available]# vim sql.mondomaine.ch
et ajoutons-y la configuration suivante :
<VirtualHost *:80>
ServerName sql.mondomaine.ch
ServerAdmin hotmaster@mondomaine.ch
DocumentRoot /home/phpmyadmin/stable
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /home/phpmyadmin/stable>
Options -Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
ErrorLog /var/log/apache2/sql.gwap.ch_error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog /var/log/apache2/sql.gwap.ch_access.log combined
</VirtualHost>

Ajoutons le site à la liste des sites actifs :
[root@serveur:/etc/apache2/sites-available]# a2ensite sql.mondomaine.ch
et rechargeons Apache :
[root@serveur:/etc/apache2/sites-available]# /etc/init.d/apache2 reload

Nous pouvons maintenant tester PhpMyAdmin en allant dans notre navigateur sur l’adresse sql.mondomaine.ch. Si vous avez un message vous informant que l’extension mcrypt ne peut être chargée par PHP, exécutez les lignes suivantes :
[root@serveur:~]# apt-get install php5-mcrypt
[root@serveur:~]# /etc/init.d/apache2 reload

et rechargez votre page en vidant le cache (Ctrl-F5 sur Firefox), le message devrait avoir disparu. Nous pouvons maintenant nous connecter à la base de données créée précédemment.

Connexion sécurisée à phpMyAdmin

Tout ceci est bien beau et bien utile, mais nos identifiants à MySQL transitent en clair entre notre domicile et notre serveur, ce qui n’est pas vraiment sécurisé. Aussi allons-nous créer un certificat SSL pour chiffrer toutes les données transitant entre notre domicile et l’hôte virtuel sql.mondomaine.ch.

On commence par créer une arborescence qui permettra le bon fonctionnement de nos commandes :
[etienne@serveur:~]$ mkdir ssl && cd ssl
[etienne@serveur:~/ssl]$ mkdir certs crl newcerts private
[etienne@serveur:~/ssl]$ echo "01" > serial
[etienne@serveur:~/ssl]$ touch index.txt
[etienne@serveur:~/ssl]$ cp /usr/lib/ssl/openssl.cnf .

et on édite le fichier openssl.cnf que l’on vient de copier afin de modifier la ligne dir = de la section [ CA_default ] afin de la faire correspondre à notre répertoire :
dir = /home/etienne/ssl

On crée notre clé privée :
openssl genrsa -des3 -out private/cakey.pem 4096

Puis on crée notre certificat auto-signé :
openssl req -new -x509 -nodes -sha1 -days 1825 -key private/cakey.pem -out cacert.pem et on répond aux quelques questions posées.

On continue avec la clé privée de notre domaine :
openssl genrsa -des3 -out mondomaine.key.pem 4096

Et on génère la demande de certificat :
openssl req -new -key mondomaine.key.pem -out mondomaine.csr.pem
et on répond aux questions, en faisant bien attention à mentionner *.mondomaine.ch à la question « Common Name (eg, YOUR name) []: ».

Ensuite nous signons la demande et produisons le certificat final :
openssl ca -config ./openssl.cnf -policy policy_anything -out mondomaine.cert.pem -infiles mondomaine.csr.pem

Afin d’éviter de devoir saisir le mot de passe de la clé privée de notre domaine à chaque redémarrage d’Apache, on va retirer la protection par mot de passe triple DES :
openssl rsa -in mondomaine.key.pem -out mondomaine.key.np.pem

On copie la clé privée ainsi obtenue ainsi que son certificat dans le dossier /etc/apache2/ssl et nous activons le module mod_ssl :
[root@serveur:~]# a2enmod ssl
sans oublier d’ajouter la ligne suivante dans le fichier /etc/apache2/ports.conf :
NameVirtualHost *:443 juste au dessus de la ligne Listen 443.

Passons maintenant à la modification de la configuration de notre hôte virtuel. Nous modifions le fichier /etc/apache2/sites-available/sql.mondomaine.ch comme suit (les changements sont en gras) :
<VirtualHost *:443>
ServerName sql.mondomaine.ch
ServerAdmin hotmaster@mondomaine.ch
DocumentRoot /home/phpmyadmin/stable

SSLEngine on
SSLCertificateFile /etc/apache2/ssl/mondomaine.cert.pem
SSLCertificateKeyFile /etc/apache2/ssl/mondomaine.key.np.pem
SSLOptions StrictRequire
SSLProtocol all -SSLv2

<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /home/phpmyadmin/stable>
SSLRequireSSL
Options -Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
ErrorLog /var/log/apache2/sql.gwap.ch_error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog /var/log/apache2/sql.gwap.ch_access.log combined
</VirtualHost>

Pour terminer, nous devons encore indiquer à Apache qu’il doit aussi lire les certificats .pem et pas uniquement les certificats .crt. Ajoutons la ligne suivante au fichier /etc/apache2/mods-available/ssl.conf :
AddType application/x-x509-ca-cert .pem

et redémarrons le serveur Apache :
[root@serveur:~]# /etc/init.d/apache2 restart

Si nous testons en allant avec notre navigateur sur la page https://sql.mondomaine.ch, nous devons accepter le certificat inconnu (normal, nous l’avons signé nous-même) et nous arrivons sur la version sécurisée de phpMyAdmin. Mais que ce passe-t-il si nous oublions de passer en mode sécurisé (sans le s de https://) ? Hé bien nous arrivons sur notre page d’accueil qui indique que le site est en cours de construction, ce que nous ne voulons pas, nous voulons être redirigé automatiquement sur la version sécurisée.

On commence par activer le module rewrite :
[root@serveur:~]# a2enmod rewrite

Puis nous reprenons notre hôte virtuel (/etc/apache2/sites-available) et ajoutons-y une petite instruction comme suit en tout début de fichier :
<VirtualHost *:80>
ServerName sql.mondomaine.ch
RewriteEngine on
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^/(.*) https://%{HTTP_HOST}/$1 [NC,R,L]
</VirtualHost>

Ce qui redirigera toute requête entrant sur le port 80 (non sécurisé) de notre site sql.mondomaine.ch sur le port 443 (sécurisé).

Prochaine étape : MySecureShell pour un SFTP sécurisé et personnalisé
Etape précédente : IP Failover, DNS et Reverse IP

Poster un commentaire