Transférer un site entre 2 serveurs release 2 OVH

Bon, je sens que ça va être long, il va falloir s’accrocher. Ca fait un bout de temps que je me suis promis d’écrire ce billet tant la question revient de manière régulière sur les forums OVH (tiens, pas plus tard qu’il n’y a pas longtemps, ici). Fainéant que je suis, j’en ai toujours différé la rédaction vu la grosse tartine que cela représente.

Cette fois, j’y vais.

Introduction

C’est parti pour la question à 1000 balles : comment déménager proprement un site d’un serveur en release 2 OVH vers un autre serveur avec cette même distribution ? Le fait de migrer un site d’un serveur à un autre est souvent vécu comme un cauchemar par les admins débutants. Je m’en vais essayer de les rassurer quelque peu en proposant ci-dessous une procédure en 10 étapes (relativement) simples et, je l’espère, décrites avec précision.

Notez bien que, dans les grandes lignes, ces 10 étapes sont valables pour le déménagement d’un site depuis et vers n’importe quel serveur dédié (pas spécialement en release 2). Seulement les détails que je fournis ci-dessous sont, eux, propre à cette distribution.

Pour la suite de ce billet, je pars du principe que :

  • Les 2 serveurs sont installés en release 2 OVH, sans modification majeure.
  • Les quelques commandes SSH décrites ci-dessous sont à passer en shell et en root.
  • J’appellerai le site à déménager monsite.com. Sur les 2 serveurs, il aura comme utilisateur “monsite” et comme répertoire “/home/monsite”.
  • monsite.com est un site type “PHP + MySQL”, du genre Prestashop, WordPress, phpBB, Joomla, etc.
  • J’appellerai ns1111.ovh.net le serveur où se trouve actuellement le site en production, et ns2222.ovh.net le serveur vers lequel on souhaite déménager le site.
  • Chaque serveur a son IP propre, pas d’utilisation d’IP failover (ce qui faciliterait considérablement la tâche … pas la peine de faire simple quand on peut faire compliqué :)).

1. Créer l’hébergement sur ns2222.ovh.net

Commençons par créer sur ns2222.ovh.net un hébergement identique à celui existant sur ns1111.ovh.net. Il faut donc aller créer un hébergement pour monsite.com dans OVHm, c’est à dire par là :

Webmin > ovhm > Ovh Virtual Hosting Management > Ajouter un domaine

Autrement dit, là : https://ns2222.ovh.net:10000/ovhm/formulaire_creer_domaine.cgi

Remplissez le formulaire en veillant à indiquer le même mot de passe que sur ns1111.ovh.net, histoire de créer 2 hébergements vraiment identiques sur les 2 serveurs.

Voilà qui devrait avoir créé tout le nécessaire … sauf les boites mails (et les alias) dont nous nous occuperons plus tard. Pas la peine d’aller se balader dans QmailAdmin (pour ceux qui connaissent), ni de s’amuser à créer manuellement les boites mails.

Sans que ce soit une obligation à ce stade (on y reviendra à la fin), vous pouvez d’ores et déjà rendre dans OVHm sur ns2222.ovh.net (Webmin > ovhm > Ovh Virtual Hosting Management) et de cliquer sur le lien “Redemarrer tous les services (pour prendre en compte les changements)”.

2. “Désactiver” le site sur ns1111.ovh.net

L’idée ici est de mettre le site “en maintenance”, ou, à tout le moins, de désactiver tous les aspects interractifs et/ou web 2.0 de monsite.com sur le serveur où il est actuellement en production. La plupart des CMS à l’heure actuelle permettent de désactiver un site si on le souhaite. L’affichage public du site est alors remplacé par un message du genre :

Notre site est temporairement indisponible pour cause de maintenance. Nous vous prions de nous excuser pour la gêne occasionnée et vous demandons de renouveler votre visite ultérieurement.

Cette étape est particulièrement importante si le site enregistre des commandes (boutique en ligne) ou bien si son contenu est fréquemment modifié (blog, forum,…). En effet, le futur déménagement du site supposera de changer les DNS du nom de domaine monsite.com. Cela aura pour effet que, pendant une période pouvant aller jusqu’à 48H après le changement de DNS (cette étape sera décrite plus loin), certains visiteurs pourront encore êtres amenés à visiter le site sur ns1111.ovh.net alors que d’autres voient déjà le site sur ns2222.ovh.net. Cette situation un peu exceptionnelle est liée à la fameuse “propagation des DNS” et peut poser de gros problèmes de pertes de données si le site fonctionne à la fois sur ns1111.ovh.net et sur ns2222.ovh.net. Il est donc prudent de désactiver le site sur ns1111.ovh.net. Il est alors possible que, pendant cette fameuse période, certains visiteurs voient le site “en maintenance” pendant quelques heures … mais c’est un moindre mal.

Notez également que cette étape est bien sûr superflue pour les sites statiques ou donc le contenu n’évolue pas : peu importe que certains visiteurs le visitent sur ns1111.ovh.net ou sur ns2222.ovh.net, ils y verront la même chose.

3. Backup de la base sur ns1111.ovh.net

Sauvegardons à présent la base de données du site sur ns1111.ovh.net. Pour ce faire, allons au plus simple, utilisons Webmin. Rendez-vous ici :

Webmin > Serveurs > Serveur de Bases de Données MySQL > monsite
Autrement dit : https://ns1111.ovh.net:10000/mysql/edit_dbase.cgi?db=monsite

Cliquez ensuite sur le bouton “Backup Database”. Dans le formulaire qui suit, il suffit de choisir un emplacement pour votre backup. Le nom du fichier est arbitraire, mais je vous conseille de placer votre backup à la racine de l’hébergement du site, soit pour moi : /home/monsite/backupmonsite.sql

Voilà qui va créer un “dump” de votre base de données que nous pourrons importer le moment venu sur ns2222.ovh.net.

4. Copier le site d’un serveur à l’autre

C’est la partie qui parait la plus complexe … en fait il n’en est rien. Nous allons nous connecter par SSH sur ns1111.ovh.net et taper la simple commande suivante :

scp -rp /home/monsite/ root@ns2222.ovh.net:/home/

Cette commande aura pour effet de copier le répertoire /home/monsite/ d’un serveur à l’autre (le mot de passe root de ns2222.ovh.net vous sera demandé au passage). Si vous vous êtes bien débrouillés, le dump de la base MySQL (qui devrait donc se trouver dans /home/monsite/ si vous avez suivi les recommandations du point 3) devrait faire partie du voyage.

5. Copier les boites mails d’un serveur à l’autre

Sur mon serveur en release 2, les boites mails de monsite.com se trouvent dans /home/vpopmail/domains/monsite.com. Je m’en vais donc repasser un coup de “scp” pour les copier d’un serveur à l’autre. Rendez-vous en SSH, toujours sur ns1111.ovh.net et tapez :

scp -rp /home/vpopmail/domains/monsite.com/ root@ns2222.ovh.net:/home/vpopmail/domains/

Notez que le pass root de ns2222.ovh.net vous est une nouvelle fois demandé.

Et hop, voilà toutes mes boites et tous mes alias transférés d’un coup. Elle est pas belle la vie ? 😉

6. Rétablir les bons propriétaires des fichiers

Cette étape est primordiale, ne la zappez pas !

Les deux copies un peu sauvages auxquelles nous venons de nous livrer ont quelque peu chamboulé les propriétaires des fichiers et dossiers sur ns2222.ovh.net. Il est indispensable de rectifier le tir, sans quoi ni le site, ni les boites mails ne fonctionneront correctement sur le nouveau serveur.

Faisons cela avec la commande “chown”, rendez-vous en SSH sur ns2222.ovh.net et tapez :

chown -R monsite:users /home/monsite
chown -R vpopmail:vchkpw /home/vpopmail/domains/monsite.com

7. Restaurer la base de données sur ns2222.ovh.net

Il est à présent temps d’importer la base de données sur ns2222.ovh.net. Pour ce faire, comme lors de la création du dump, nous utilisons Webmin … et exactement au même endroit :

Webmin > Serveurs > Serveur de Bases de Données MySQL > monsite
Autrement dit : https://ns2222.ovh.net:10000/mysql/edit_dbase.cgi?db=monsite

Cette fois, cliquez sur le bouton “Execute SQL” puis sur l’onglet “Run SQL from file”. Utilisez alors le petit formulaire pour sélectionner votre fichier “dump” (je ne vais pas vous faire l’insulte de vous rappeler encore une fois où il se trouve) et validez.

Lorsque la page se rafraichit (ça peut durer un moment, surtout si vous avez une grosse base de données), le message de confirmation n’est pas très bavard, c’est normal. Si vous souhaitez vous assurer que votre base a correctement été importée, le mieux est d’aller jeter un coup d’oeil dans PhpMyAdmin :

https://ns2222.ovh.net/phpMyAdmin/

8. “Activer” le site sur ns2222.ovh.net

Il s’agit de l’inverse du point 2 : sortir le site de son mode “maintenance”, cette fois sur ns2222.ovh.net.

Il est possible que ce point pose problème car, à ce stade, on n’a toujours pas changé des DNS du nom de domaine. Donc, lorsqu’on visite monsite.com le plus naturellement du monde, on tombe encore évidemment sur ns1111.ovh.net ! Or c’est bien sur ns2222.ovh.net qu’il convient de réactiver le site…

Pour contourner l’obstacle, la release 2 vous offre la possibilité de visiter votre site sur une adresse temporaire :

http://ns2222.ovh.net/~monsite/

Si cela ne suffit pas (problème de .htaccess par exemple), vous pouvez feinter en modifiant le fichier “host” sur votre PC et en forcant le nom de domaine monsite.com vers l’adresse IP de ns2222.ovh.net (je ne développe pas plus que ça, vous trouverez pleins d’infos sur Google à ce sujet).

9. Changer les DNS du nom de domaine

On y est presque, il ne reste plus qu’à changer les DNS de monsite.com … mais avant cela, il convient de gérer correctement le DNS secondaire. Comme vous le savez, un nom de domaine se doit d’avoir 2 serveurs DNS, le primaire et le secondaire. Le DNS primaire d’un nom de domaine hébergé sur un serveur en release 2 est en principe le nom du serveur lui-même. Donc, à ce stade, le DNS primaire de monsite.com est ns1111.ovh.net.

Comme il est obligatoire qu’un nom de domaine ait (au moins) 2 DNS, OVH met à notre disposition un serveur DNS secondaire. A l’heure où j’écris ces lignes, le DNS secondaire pour les serveurs OVH est sdns2.ovh.net (ns.kimsufi.com pour les serveurs Kimsufi).

En l’état actuel des choses les DNS de monsite.com sont donc :

ns1111.ovh.net
sdns2.ovh.net

Il va donc falloir changer cela par :

ns2222.ovh.net
sdns2.ovh.net

Si votre nom de domaine est enregistré chez OVH, vous pouvez faire cette opération dans votre manager OVH (https://www.ovh.com/managerv3) :

monsite.com > Domaine & DNS > Serveurs DNS

Si votre domaine n’est pas enregistré chez OVH, ma foi, vous trouverez certainement l’option dans le panel d’administration de votre registar.

OUI MAIS…

Si on se contente de ne faire que ça, notre ami le DNS secondaire (sdns2.ovh.net donc) ne sera pas au courant du changement et il continuera de fonctionner comme avant, c’est à dire d’envoyer le trafic (et les mails) de monsite.com vers ns1111.ovh.net !

Pour corriger cela, rendez vous dans votre manager OVH :

ns1111.ovh.net > Services > DNS secondaire

Puis supprimez le nom de domaine du DSN secondaire.

Restez alors dans votre manager OVH :

ns2222.ovh.net > Services > DNS secondaire

Et cette fois inscrivez le nom de domaine sur le DNS secondaire.

Voilà qui aura pour effet que le DNS secondaire cesse de communiquer avec ns1111.ovh.net et se mette à parler avec ns2222.ovh.net.

IMPORTANT

On approche de la fin, mais n’oubliez pas à l’issue de tout cela, de vous rendre dans OVHm sur ns2222.ovh.net (Webmin > ovhm > Ovh Virtual Hosting Management) et de cliquer sur le lien “Redemarrer tous les services (pour prendre en compte les changements)”. Faites le, même si vous l’avez déjà fait à le fin de l’étape 1.

10. Vérifier les mails pendant 48H

Et bien voilà, figurez-vous que la migration est terminée : votre site a bel et bien été déplacé d’un serveur à l’autre. Mais si, mais si ! Il est possible que cela ne saute pas aux yeux tout de suite car, victime que vous êtes de la propagation des DNS, vous continuez de voir votre site “en maintenance” car vous êtes encore dirigé vers ns1111.ovh.net. De fait, c’est à présent que commence cette période bizarre au cours de laquelle le trafic vers votre site bascule progressivement vers le nouveau serveur. Il n’y a pas grand chose à faire de votre côté, sinon peut-être tenter un ipconfig /flushdns (si vous êtes sous Windows, voir Google pour savoir ce que c’est) ou bien, comme cela a déjà été évoqué plus haut, forcer votre fichier “host”.

Il reste cependant un point quelque peu gênant auquel il faut faire attention. Pendant la propagation des DNS, au même titre que certains visiteurs arriveront encore sur ns1111.ovh.net jusqu’à 48H après le changement des DNS, certains mails eux aussi arriveront peut-être encore sur l’ancien serveur ! Si les boites mails ont une certaine importance à vos yeux et que vos utilisateurs ne peuvent en aucun cas louper de mail, il va falloir veiller au grain ! Donc, pendant les 48H qui suivent le changement des DNS, il va falloir jeter un coup d’oeil régulièrement pour voir si de nouveaux mails ne seraient pas arrivés sur ns1111.ovh.net. Le cas échéant, il est évidemment nécessaire de les copier sur ns2222.ovh.net (reportez vous aux points 5 et 6).

Pinaise, il m’a pris l’après-midi ce billet … mais ouf, ayééé 🙂

Partition racine pleine sur serveur en release 2 OVH

J’aimerais aborder 2 petits “bugs” (ou plutôt 2 oublis) qu’on trouve sur la distribution phare chez OVH, la fameuse release 2. Deux oublis qui font que la partition racine de certains serveurs se remplit inexorablement et on voit alors souvent leurs propriétaires débarquer sur les forum OVH en quête d’assistance. Deux oublis qui font également dire à certains que la partition racine des serveurs en release OVH est beaucoup trop petite (ce en quoi ils ont partiellement tort, vous allez comprendre pourquoi), ce qui occasionne divers débats sur les forums et, indirectement, participe à la réputation quelque peu sulfureuse de cette distribution.

Je n’aborderai pas ici le partitionnement des disques durs en général et j’en arrive tout de suite à ce qui est bien souvent proposé par défaut sur les serveurs (notamment OVH). Il s’agit d’un partitionnement qui comprend, en simplifiant un brin, 2 partitions : une “petite” (la partition racine montée sur /) et une “grosse” (la partition destinée à accueillir les données et qui est bien souvent montée sur /home).

Je le répète, ce que je viens d’écrire ci-dessus est une simplification. Il n’en demeure pas moins qu’elle colle bien souvent à la réalité, en particulier en ce qui concerne les serveurs en release OVH (dont la plupart tournent avec le partitionnement par défaut puisque les utilisateurs de ce genre de serveurs s’amusent rarement à les répartitionner). On se retrouve donc avec une partition racine de quelques Go (ce qui est théoriquement suffisant puisqu’elle n’est censée n’accueillir que le système et pas les données) et tout le reste de l’espace disque est alloué à /home.

Le piège est alors de voir sa partition racine se remplir très vite car on y retrouve des données qui devraient évidemment se retrouver sur l’autre partition. Les cas les plus fréquents (sur les serveurs en général, hors release 2 donc) sont les bases de données (/var/lib/mysql), les logs (/var/log), etc. Tout un tas de choses qui peuvent devenir envahissantes à la longue puisqu’elles ont tendance à “grossir” avec le temps. Seulement sur la release OVH, ils ont prévu le coup ! Toutes les données et tous les logs ont été volontairement déplacés sur la “grosse” partition. On retrouve ainsi les bases dans /home/mysql, les logs dans /home/log, et ainsi de suite. Bien vu.

Bien vu … oui, sauf qu’ils ont malheureusement oublié deux bidules qui, avec le temps, présentent un risque d’encombrer la partition racine. Ces deux bidules, les voici :

Un fichier de log mail

Il s’agit de /var/spool/qscan/qmail-queue.log : un fichier de log tout bête mais sur lequel ne se trouve aucun logrotate. Il a donc tendance à enfler avec le temps, d’autant plus vite que le serveur est fortement sollicité en mail.

La solution : l’inclure dans le logrotate ou le déplacer sur /home (ou les deux à la fois). Pour le déplacer, rien de plus simple :

On coupe le mail
/etc/init.d/spamd stop
/etc/init.d/clamd stop
/etc/init.d/qmail stop
On déplace ce foutu fichier sur /home et on crée le lien symbolique qui va bien
mv /var/spool/qscan/qmail-queue.log /home/log/
ln -s /home/log/qmail-queue.log /var/spool/qscan/qmail-queue.log
On redémarre le mail
/etc/init.d/spamd start
/etc/init.d/clamd start
/etc/init.d/qmail start

Les logs binaires de réplication MySQL

En deux mots, ces logs enregistrent toute l’activité de MySQL et permettent par exemple, en cas de panne, de reconstruire les bases jusqu’à l’instant du crash (voir Google, notre ami à tous, si vous souhaitez creuser la chose). Ils sont précieux pour ceux qui font une utilisation avancée de MySQL … ce qui est rarement le cas des utilisateurs de release 2 dont la plupart ignorent tout de ces logs et ne s’en serviront jamais. Pourtant ils sont bien activés sur les serveurs en release et ils peuvent vite devenir énormes, surtout si votre base de donnée est fortement utilisée.

Purger les logs

Pour purger ces logs (qui, pour information, se trouvent ici : /var/run/mysqld), connectez-vous en root à MySQL en ligne de commande :

mysql -u root -p

(entrez le pass root MySQL, attention sur les serveurs en release 2 il est différent du pass root du système)

Vous obtenez alors un prompt du genre “mysql>” signifiant que vous êtes connecté à MySQL. Tapez la commande :

reset master;

Après quoi un “exit” suffit pour sortir de MySQL.

Désactiver les logs

Purger ces les logs de réplication, c’est bien (et cela va vraisemblablement vous libérer de la place) … mais si rien d’autre n’est fait, ils vont à nouveau se remplir inexorablement. Il reste donc à les désactiver. Pour ce faire, il suffit de :

Editer le fichier de config MySQL /etc/mysql/my.cnf et commenter la ligne suivante

(donc : ajouter une dièse en début de ligne)

#log-bin

Et redémarrer MySQL

/etc/init.d/mysql restart
Et si je veux les garder, ces logs ?

J’ajoute ce petit paragraphe suite aux commentaires de Thomas (voir ci-dessous) car il est vrai que certains pourraient avoir envie de conserveur ces fameux logs. Auquel cas il vous suffit d’appliquer la méthode décrite au début de ce billet concernant les logs mails et déplacer le répertoire /var/run/mysqld dans /home, par exemple dans /home/log. Attention à prendre soin de faire cette opération en ayant coupé le serveur MySQL. Soit à titre d’exemple :

/etc/init.d/mysql stop
mv /var/run/mysqld /home/log/
ln -s /home/log/mysqld /var/run/mysqld
/etc/init.d/mysql start

Sayé, c’est fini

Voilou, après ça l’espace disque de la partition racine de votre serveur ne devrait plus bouger d’un pouce ! 🙂 Mis à part peut-être lors de l’application des patches OVH pour mettre votre serveur à jour mais cela restera marginal.

Bases de données MySQL : backup quotidien

Voici un petit script tout simple qui vous permettra de gérer une sauvegarde quotidienne de vos bases de données MySQL. Il utilise mysqldump, mais sans l’option all-databases. Il génère donc un fichier par base et par jour (plus pratique pour la restauration des backups). La date de chaque backup se trouve dans le nom du fichier et 30 jours d’historique sont conservés. Il est donc possible de récupérer l’état de chaque base de J à J-30 🙂

Mise en garde

Attention, ce script crée un dossier /home/backupsql (paramètre modifiable) dans lequel il crée et il supprime des fichiers. N’utilisez pas ce répertoire pour stocker quoi que ce soit…

Le script

#!/bin/bash

#
# PARAMETRAGE
#

PASSWORD=xxxxxxxx
CHEMINSQL=/var/lib/mysql
CHEMINBACKUPSQL=/home/backupsql

#
# SCRIPT BACKUP MYSQL
#

mkdir -p $CHEMINBACKUPSQL
find $CHEMINBACKUPSQL -mtime +30 -exec rm -f {} \;
for base in `ls $CHEMINSQL/`
do
if [ -d $CHEMINSQL/$base ]
then
mysqldump -u root --password=$PASSWORD $base > $CHEMINBACKUPSQL/`date -I`-$base.sql
fi
done

Appelez le par exemple backup.sh et n’oubliez pas de le mettre en cron (avec l’instruction “sh /chemin/que/vous/voulez/backup.sh“) , une fois par jour (de préférence la nuit lorsque le trafic sur votre serveur est faible voire nul).

Explications

Il n’y a que 3 paramètres à modifier :

PASSWORD=xxxxxxxx
CHEMINSQL=/var/lib/mysql
CHEMINBACKUPSQL=/home/backupsql

PASSWORD est votre mot de passe root MySQL (pas le pass root du serveur). CHEMINSQL est le répertoire dans lequel se trouvent vos bases (probablement /var/lib/mysql). CHEMINBACKUPSQL est évidemment le répertoire dans lequel vous voulez stocker les backups.

Le reste n’est qu’une petite boucle qui va parser le répertoire CHEMINSQL et effectuer un mysqldump sur chaque base trouvée.

Notez la ligne :

find $CHEMINBACKUPSQL -mtime +30 -exec rm -f {} \;

Elle est destinée à effacer tous les fichiers vieux de plus de 30 jours dans le répertoire CHEMINBACKUPSQL, on conserve ainsi 1 mois de sauvegardes. Si vous souhaitez modifier cette période de temps, il suffit de modifier le 30 par le nombre de jours voulu.