Guide : transférer un blog WordPress sur un VPS

Préambule

Pendant très longtemps, on n’avait que deux choix quand on voulait héberger un site : acheter ou louer son propre serveur, ou utiliser une offre d’hébergement mutualisé. La première solution est plus souple, mais aussi beaucoup plus coûteuse et complexe. La deuxième est moins chère, mais souvent plus contraignante et généralement moins performante.

168925884_d8cefb7e4f_o.jpg

Des serveurs dédiés (Photo Tim Dorr — CC BY-SA 2.0)

Depuis quelques années, une troisième voie s’est formée avec les VPS, les « Virtual Private Servers », des serveurs dédiés virtuels en français. C’est un serveur dédié, dans le sens où vous gardez un contrôle total sur l’installation, du système d’exploitation (Linux en général) au moteur qui alimentera le site. Mais il est virtuel, puisque chaque VPS ne correspond pas à une machine physique : c’est ce qui explique que le coût est bien plus faible. Alors qu’un serveur dédié coûte en général plusieurs dizaine d’euros par mois au minimum, un VPS est facturé moins de 5 € pour les premières offres.
Ces offres sont si bon marché, qu’elles concurrencent même les offres mutualisées, traditionnellement les moins chères de toutes. C’est pourquoi héberger son blog sur un VPS peut être si intéressant. Néanmoins, c’est aussi plus exigeant, puisqu’il faut gérer le serveur à l’aide d’un terminal : même si on peut installer une interface d’administration, comme cPanel, il faut en général payer un supplément, et on perd le plus gros intérêt des serveurs virtuels, à savoir leur performance.

Pour autant, héberger un blog WordPress sur un VPS n’est pas si compliqué que cela en a l’air. Surtout en s’aidant d’un outil comme ServerPilot, un assistant qui vient configurer le VPS et surtout à le maintenir en état de marche. Une fois configuré, le serveur est maintenu à jour et sécurisé, avec la bonne configuration pour éviter les hacks. Une fois le transfert du blog terminé, vous aurez normalement la même charge de travail qu’avec un hébergement.

Avertissement

Ce guide de transfert est basé sur les notes que j’ai prises pendant le transfert de mon blog depuis un hébergement mutualisé, vers un VPS. Ce n’est pas une solution générique qui fonctionnera dans tous les cas et ce n’est sans doute pas la meilleure solution non plus. Si vous avez des suggestions pour l’améliorer, n’hésitez pas à utiliser les commentaires à cet effet.

Si vous utilisez un hébergement mutualisé actuellement et que vous voulez passer sur un SSD, vous pouvez le suivre et normalement vous aurez le résultat attendu. Sauvegardez bien toutes vos données avant toutes choses ! 

Sommaire

  1. Mise en place du VPS
  2. Synchronisation fichiers
  3. Transfert base de données
  4. Connecter le site
  5. Outils annexes
  6. HTTPS avec Let’s Encrypt

1. Mise en place du VPS

Fournisseur VPS

  1. Serveur avec Ubuntu 14.04 ou 16.04 64 bits
  2. Récupérer l’adresse IP
    1. Si Digital Ocean : récupérer une IP flottante
    2. Associer cette IP à la nouvelle machine
  3. Se connecter en SSH avec un terminal
ssh root@ip.ip.ip.ip.ip

Facultatif : pour ne pas avoir à saisir le mot de passe, à chaque connexion, transférer le mot de passe avec cette ligne de commande

ssh-copy-id root@ip.ip.ip.ip.ip

ServerPilot

Créer un compte avant toute chose : http://bit.ly/1Mzel2e

  1. Ajouter un serveur :
    1. Nom à choisir
    2. Mot de passe du compte ServerPilot (SFTP) à choisir
    3. Mot de passe root ou connexion manuelle, en utilisant
  2. Ajouter une app :
    1. Choisir un nom
    2. Mettre le nom de domaine du site
    3. Ne pas cocher la case « WordPress » en cas de transfert de blog
    4. Choisir PHP 7 (ou plus récent)
    5. Choisir le serveur que l’on vient de créer
  3. Ajouter une base de données :
    1. Choisir un nom
    2. Noter le nom d’utilisateur et le mot de passe généré par ServerPilot

Pour vérifier que tout fonctionne, se connecter une fois avec le compte ServerPilot au serveur, et transférer le mot de passe pour être tranquille :

ssh serverpilot@ip.ip.ip.ip.ip
ssh-copy-id serverpilot@ip.ip.ip.ip.ip

2. Synchronisation fichiers

Récupération fichiers

Deux méthodes :

  • Soit on a deux serveurs accessibles en SSH, dans ce cas, passer directement à la deuxième étape, avec un rsync d’un serveur à l’autre.
  • Soit récupérer les fichiers en local, en FTP par exemple.

Transfert des fichiers

Depuis l’ordinateur local, ou depuis l’ancien serveur en SSH, commande à utiliser pour transférer toutes les données sur le VPS, directement au bon endroit (remplacer nomapp par le nom correspondant) :

rsync -avz -P CHEMIN/FICHIERS/* serverpilot@ip.ip.ip.ip.ip:/srv/users/serverpilot/apps/nomapp/public

Attention : le fichier .htaccess n’est pas pris en compte par défaut, il faut le transférer en plus :

rsync -avz -P CHEMIN/FICHIERS/.htaccess serverpilot@ip.ip.ip.ip.ipS:/srv/users/serverpilot/apps/nomapp/public

En cas de transfert depuis un autre VPS ServerPilot

Pour passer d’un VPS géré par ServerPilot à un autre serveur ServerPilot, il peut être utile de transférer les configs Nginx spécifiques et les logs :

rsync -avz -P /etc/nginx-sp/* root@ip.ip.ip.ip.ip:/etc/nginx-sp
rsync -avz -P /srv/users/serverpilot/log/nomapp/* root@ip.ip.ip.ip.ip:/srv/users/serverpilot/log/nomapp/

3. Transfert base de données

Passage à MariaDB (optionnel)

ServerPilot installe MySQL 5.5. Pour utiliser à la place la dernière version de MariaDB, voici la procédure après installation de ServerPilot. (Source)

sudo ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable
sudo invoke-rc.d apparmor restart
sudo replace log_slow_queries slow_query_log_file -- /etc/mysql/conf.d/mysqld_slow_log.cnf
sudo bash -c 'echo "slow_query_log = 1" >> /etc/mysql/conf.d/mysqld_slow_log.cnf'
sudo apt-get purge --assume-yes mysql-server mysql-server-5.5 mysql-server-core-5.5 mysql-client mysql-client-5.5 mysql-client-core-5.5
sudo apt-get autoremove --assume-yes
sudo apt-get install software-properties-common
sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xcbcb082a1bb943db
sudo add-apt-repository 'deb [arch=amd64,i386] http://mariadb.mirror.anstey.ca/repo/10.1/ubuntu trusty main'
sudo apt-get update
sudo apt-get install --assume-yes mariadb-server

Récupérer la base de données :

  1. Avec PhpMyAdmin et la commande export
  2. En ligne de commande (mysqldump -u [username] -p [password] [dbname] > filename.sql) ou avec wp db export si WP-CLI est installé.
  3. Chez OVH : onglet base de données, récupérer un dump (plus fiable)
  4. Vérifier que l’on a bien un fichier .sql

Envoyer les données sur le serveur :

On considère que le fichier SQL est nommé blog.sql :

rsync -avz -P chemin/blog.sql root@IP.SERVEUR:/srv/users/serverpilot/

Import base de données

On aura besoin de la base de données créée par ServerPilot, nommée nomdatabase dans la suite (à renommer en fonction).

En connexion SSH root, taper mysql, puis ces commandes :

use nomdatabase;
source /srv/users/serverpilot/blog.sql;
exit;

4. Connecter le site

Dernière étape avant de pouvoir utiliser le site importé : le connecter à la base de données. Pour cela, vous aurez besoin du nom de la base de données et des identifiants choisis ou générés par ServerPilot à la première étape.

Modifier ensuite le fichier wp-config.php :

nano /srv/users/serverpilot/apps/nomapp/public/wp-config.php

Puis changer les lignes suivantes :

define('DB_NAME', 'nomdatabase');
define('DB_USER', 'nomuser');
define('DB_PASSWORD', 'password');
define('DB_HOST', 'localhost');

Si tout est configuré correctement, le site devrait fonctionner normalement !

Vider le cache

Cas classique en cas de problème : le cache transféré avec le reste qui bloque quelque chose.

Dans ce cas, le plus simple est de vider le contenu du dossier cache, s’il existe :

rm -rf /srv/users/serverpilot/apps/nomapp/public/wp-content/cache/*

5. Outils annexes

Surveillance

htop

Outil de surveillance graphique plus clair que top, notamment grâce à la couleur et aux graphiques dynamiques.

apt-get install htop
htop.jpg

htop en action

New Relic

Suivi de serveur complet, léger, simple à installer et gratuit.

  • Créer un compte si ce n’est pas fait
  • Ajouter un serveur
  • Choisir Ubuntu/Debian
  • Copier/coller les instructions données par le site.
new-relic.jpg

New Relic : suivi sur 24 heures pour mon blog.

WordPress

WP-CLI

Plusieurs fonctions pratiques, notamment l’export de la base de données, ou encore modifications dans la base. On peut l’installer en root, mais il est préférable de se connecter avec le compte serverpilot par la suite pour l’utiliser.

Pour l’installer, il suffit de taper ces lignes de commande :

curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
chmod +x wp-cli.phar
sudo mv wp-cli.phar /usr/local/bin/wp

Note : seule la première commande est vraiment indispensable, mais la 2 et la 3 permettent d’utiliser simplement wp par la suite.

WP-Rocket et Nginx

Si vous utilisez WP-Rocket, on peut configurer Nginx pour éviter totalement WordPress et le PHP quand le cache existe. Ce projet simplifie considérablement les choses pour la configuration : https://github.com/maximejobin/rocket-nginx

Installation :
On commence par télécharger la configuration et la placer au bon endroit (à faire en root).

cd /etc/nginx-sp/
git clone https://github.com/maximejobin/rocket-nginx.git

On modifie ensuite la configuration nginx. Pour éviter les problèmes avec Serverpilot, il faut créer une configuration custom. Changer à chaque fois nomapp par la valeur correcte :

cd /etc/nginx-sp/vhosts.d/
cp nomapp.conf nomapp.custom.app
nano nomapp.custom.app

À la fin du fichier, juste avant }, ajouter cette ligne :

include rocket-nginx/rocket-nginx.conf;

Enregistrer les modifications (ctrl + c et y), tester et si tout va bien, relancer nginx pour terminer :

service nginx-sp configtest
service nginx-sp reload

6. HTTPS avec Let’s Encrypt

📢 Pour que cela fonctionne, il faut que le nom de domaine pointe déjà sur le serveur.

Certificat Let’s Encrypt

Pour obtenir un certificat Let’s Encrypt, se placer dans le dossier home (/home) puis taper ces lignes de commande (à faire en root).

Ligne 4 : penser à remplacer ndd.fr par le nom de domaine

sudo git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt/
sudo service nginx-sp stop
sudo ./letsencrypt-auto certonly --standalone -d ndd.fr -d www.ndd.fr
sudo service nginx-sp start

⚠️ Pendant toutes les opérations, le site sera inaccessible.

Configurer le serveur

Une fois le certificat obtenu, il faut modifier la configuration par défaut pour passer le site en HTTPS (à faire en root et remplacer nomapp par la bonne valeur).

Ligne 2 : à ne faire que si le fichier custom n’existe pas déjà…

cd /etc/nginx-sp/vhosts.d/
cp nomapp.conf nomapp.custom.app
nano nomapp.custom.app

Voici ce que vous devez obtenir. Modifier ndd.fr par le nom de domaine, supprimer les anciennes lignes sous serveur jusqu’à la ligne qui commence par root et saisir à la place le bloc qui commence à listen.

###############################################################################
# DO NOT EDIT THIS FILE.
#
# Your changes to this file will be overwritten by ServerPilot.
#
# For information on how to customize nginx settings, see
# https://serverpilot.io/community/articles/customize-nginx-settings.html
###############################################################################
 
server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        server_name  ndd.fr www.ndd.fr;
 
        ssl on;
 
        # letsencrypt certificates
        ssl_certificate      /etc/letsencrypt/live/ndd.fr/fullchain.pem;
        ssl_certificate_key  /etc/letsencrypt/live/ndd.fr/privkey.pem;
 
        #SSL Optimization
        ssl_session_timeout 1d;
        ssl_session_cache shared:SSL:20m;
        ssl_session_tickets off;
 
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
 
        # OCSP stapling
        ssl_stapling on;
        ssl_stapling_verify on;
 
        # verify chain of trust of OCSP response
        ssl_trusted_certificate /etc/letsencrypt/live/ndd.fr/chain.pem;

Enregistrer (ctrl + c et y), vérifier la configuration et relancer nginx :

service nginx-sp configtest
service nginx-sp reload

Configurer WordPress

Avant de valider la configuration, penser à modifier la configuration WordPress pour passer au HTTPS :

Nom de domaine du site :

  • Se connecter à l’admin du blog
  • Dans Réglages>Général, modifier les champs Adresse web de WordPress (URL) et Adresse web du site (URL) en mettant https://

Admin :

Modifer le fichier wp-config.php pour forcer le HTTPS, notamment dans l’admin :

nano /srv/users/serverpilot/apps/nomapp/public/wp-config.php

Puis ajouter ces trois lignes :

define('FORCE_SSL_ADMIN', true);
$_SERVER['HTTPS'] = 'on';
$_SERVER['SERVER_PORT'] = 443;

Enregistrer (ctrl + c et y) et vérifier que tout fonctionne correctement.

Modifier le site :

  • Dans la base de données, il reste encore des http://, notamment pour les images, et pour les liens internes
  • Pour changer, le mieux est de passer par WP-CLI (étape 5). À faire avec le compte serverpilot
wp dp export
wp search-replace 'http://ndd.fr' 'https://ndd.fr' --skip-columns=guid

⚠️ La première commande exporte la base de données : indispensable en cas de problème !

Redirections

Pour finir, modifier nginx pour rediriger automatiquement les connexions non sécurisées vers une connexion sécurisée :

cd /etc/nginx-sp/vhosts.d/
cp nomapp.conf nomapp.custom.app
nano nomapp.custom.app

Ajouter à la fin du fichier ces lignes (remplacer ndd.fr par le nom de domaine) :

server {
listen 80;
    server_name ndd.fr;
    return 301 https://$host$request_uri;
}

Enregistrer (ctrl + c et y), vérifier la configuration et relancer nginx :

service nginx-sp configtest
service nginx-sp reload

⚠️ Important ⚠️

La méthode que j’ai suivie pour mettre en place le HTTPS a un défaut : tous les trois mois, vous devrez renouveller le certificat Let’s Encrypt et couper les sites pendant l’opération. Ce n’est pas très long (cinq minutes maximum) mais si vous voulez que cela se fasse automatiquement et sans interruption, il faudra suivre une autre méthode.

Voici la ligne de commande nécessaire pour renouveler les certificats si vous avez suivi ce guide. À utiliser en étant connecté en root.

sudo cd letsencrypt && service nginx-sp stop && sudo ./letsencrypt-auto renew && sudo service nginx-sp start

Vous pouvez l’automatiser avec un cron qui se lancera tous les deux mois en pleine nuit, par exemple.


Ce guide vous a servi ?

Si ce guide vous a été utile, vous pouvez m’aider :

Publicités

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion /  Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion /  Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion /  Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion /  Changer )

Connexion à %s