
Migrer un blog WordPress d’Apache vers Nginx, c’est simple !

Presque simple, mais vous avez l’idée. On a déjà préparé la première étape, qui consiste à utiliser PHP-FPM comme moteur d’exécution (et éventuellement HHVM pour les aventureux), et on va voir que le reste n’est pas si compliqué, même s’il y a un petit piège à éviter surtout avec WordPress.
Avant de commencer, je tiens à signaler qu’Apache et Nginx sous tous les deux disponibles sous Windows, et même si j’ai opéré toutes les manipulations sous Debian Wheezy (déterrage de vieux brouillon power), vous devriez pouvoir adapter assez facilement les chemins et les commandes à votre environnement (c’est le cas pour tous les tutos ou presque, vous me direz). Et pour la petite histoire, j’ai d’abord testé WordPress avec une sauvegarde du blog sur ma vm maison.
Aussi, j’effectue toutes les commandes avec le compte root directement (fouettez-moi), ajoutez sudo devant celles-ci en cas de besoin.
Préparation
On commence par couper le serveur Apache, histoire de ne pas entrer en conflit avec le futur Nginx :
1 |
service apache2 stop |
Ensuite, plusieurs options s’ouvrent à vous pour installer Nginx. Sur la vm de la maison, j’ai utilisé le script de nicolargo, qui récupère les sources et les compile (et procède à l’installation d’outils annexes comme PHP-FPM, redis…). Dans les dépôts de Debian Wheezy, la version est assez ancienne, 1.2.1, ce qui nous coupe d’améliorations possibles (performances, support de SPDY, et bientôt d’HTTP/2…); la version qui est fournie par la « nouvelle » version stable, Jessie, est la 1.6.2, bien plus sexy. Dernière possibilité, suivre la doc du site officielle, car l’éditeur dispose de son propre dépôt.
Comme je souhaite garder une base la plus stable possible, j’ai d’abord tenté l’aventure avec le paquet Debian « d’origine », donc la version embarquée dans Wheezy:
1 |
apt-get install nginx |
Les personnes ayant des besoins spécifiques pourront opter pour le paquet nginx-full afin de disposer de modules complémentaires qui pourraient être utiles. Installer le paquet me permet aussi d’envisager, une fois ajouté le dépôt Nginx, de basculer sur la version la plus récente avec peu de difficultés; en effet, Nginx dispose de modules, mais directement embarqués dans l’application, à la compilation. Il serait donc dommage d’oublier un module lors de la basule.
Configuration globale et par site
Une fois l’installation effectuée, j’ai d’abord créé le fichier /etc/nginx/conf.d/global.conf, dans lequel j’ai mis ceci :
1 2 3 4 5 6 |
worker-processes 2 #1 worker par coeur CPU events { worker_connections 1024; # multi_accept on; } |
Pourquoi procéder ainsi ? Modifier les fichiers par défaut peut entraîner des conflits lors de modifications futures par l’équipe Debian, ce qui m’est déjà arrivé avec php.ini. Si vous voulez ajuster d’autres paramètres, je vous conseille d’utiliser ce dossier (remarquez, on avait déjà procédé ainsi pour la configuration du module fastcgi d’Apache).
Bref, une fois la config de base ajustée (pas de grand chose, pour l’instant, c’est vrai), on attaque la configuration par vhost. Dans Apache on a sept vhost/sites, mais je vais me concentrer ici sur le vhost de mon blog.
Je me rend donc dans le dossier /etc/nginx/sites-available, et j’y crée un fichier blog_seboss666 dans lequel j’inclus ceci :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
server { listen 80; server_name blog.seboss666.info; root /home/seboss666/web/www; location / { index index.html index.htm index.php; try_files $uri $uri/ /blog/index.php?$args; } # PHP scripts -> PHP-FPM en écoute sur 127.0.0.1:9000 location ~ \.php$ { try_files $uri =404; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } # Securité location ~ /\.ht { deny all; } location = /favicon.ico { access_log off; return 204; } #TTL sur le contenu "thème" location ~* ^.+\.(jpg|jpeg|gif|css|png|xml)$ { expires 365d; #access_log off; } location ~* ^.+\.(js|swf|pdf)$ { expires 30d; #access_log off; } } |
C’est dans ce fichier qu’il va falloir faire attention, notamment pour faire fonctionner WordPress. C’est plus particulièrement cette section qu’il faudra éventuellement ajuster pour prendre en charge la réécriture d’URL :
1 2 3 4 |
location / { index index.html index.htm index.php; try_files $uri $uri/ /blog/index.php?$args; } |
Une fois validé, ce fichier pourra en grande partie servir de base pour les autres (parfois à la limite du copier/coller, avec juste le server_name et root de modifiés). C’est ce que j’ai fait pour Piwik, qui est dans son propre vhost avec son propre sous-domaine, et ça marche nickel.
Activation, test, lancement
Ensuite, je crée un lien vers ce fichier dans le dossier sites-enabled :
1 |
cd /etc/nginx/sites-enabled/ && ln -s ../sites-available/blog_seboss666 blog_seboss666 |
On vérifie alors si l’on a pas fait d’erreurs :
1 |
nginx -t |
Et si aucune erreur ou warning n’est remonté, on tente le lancement :
1 |
service nginx start |
Si tout va bien, nginx est lancé, un netstat devrait vous permettre d’identifier nginx :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
root@vox:/etc/nginx# netstat -tanpu |grep LISTEN tcp 0 0 127.0.0.1:6502 0.0.0.0:* LISTEN 2954/murmur.x86 tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 18875/php-fpm: pool tcp 0 0 91.121.61.180:3306 0.0.0.0:* LISTEN 14717/mysqld tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1641/rpcbind tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 27520/nginx tcp 0 0 0.0.0.0:36656 0.0.0.0:* LISTEN 1674/rpc.statd tcp 0 0 91.121.61.180:30033 0.0.0.0:* LISTEN 23057/ts3server_lin tcp 0 0 91.121.61.180:53 0.0.0.0:* LISTEN 21880/named tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 21880/named tcp 0 0 91.121.61.180:4949 0.0.0.0:* LISTEN 2141/munin-node tcp 0 0 0.0.0.0:2169 0.0.0.0:* LISTEN 10714/proftpd: (acc tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN 21880/named tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 19930/master tcp 0 0 91.121.61.180:10011 0.0.0.0:* LISTEN 23057/ts3server_lin tcp 0 0 0.0.0.0:2812 0.0.0.0:* LISTEN 3424/monit tcp 0 0 0.0.0.0:2269 0.0.0.0:* LISTEN 3234/sshd tcp6 0 0 :::111 :::* LISTEN 1641/rpcbind tcp6 0 0 :::53 :::* LISTEN 21880/named tcp6 0 0 :::47255 :::* LISTEN 1674/rpc.statd tcp6 0 0 :::25 :::* LISTEN 19930/master tcp6 0 0 :::2269 :::* LISTEN 3234/sshd tcp6 0 0 :::1025 :::* LISTEN 2954/murmur.x86 |
Et voilà !
Si vous constatez que vous avez bien mené votre barque, vous pouvez supprimer tout ce qui touche à Apache (un dpkg -l |grep apache vous guidera). Vous vous doutez bien que si vous lisez l’article, c’est que j’ai déjà migré sous Nginx. Je n’ai pas encore migré tous les sites par contre, et dans le prochain épisode je vous dirais comment faire cohabiter les deux serveurs Web 🙂
PS : J’avais fait le test à la maison, sur ma propre VM avec une sauvegarde du blog. Pour la version « de prod », on a procédé différemment, parce qu’on avait beaucoup de problèmes avec la VM d’alors. On est reparti de zéro, sur une VM Jessie toute fraîche, avec ISPConfig par dessus. Les modifications de configurations sont grosso modo les mêmes, mais il faut passer impérativement par l’interface d’administration, sinon vos configurations seront écrasées. J’en ai fait l’amère expérience…
J’ai aussi migré d’Apache vers Nginx, c’est plus simple qu’on ne le croit 🙂
Merci pour ce billet ! je migrerai mon RPi sous nginx pour que ce soit plus light. Mais pour WordPress je crois qu’il me faudrait des jours d’adaptation de mes fichiers .htacess 🙁 (de toutes façons je suis hébergé un mutualisé chez Web4all alors le problème ne se pose pas!)
[…] […]
Ho, merci 😀 !
Je me demandais justement comment configurer Nginx pour WordPress en local. Je vais pouvoir me baser sur une référence en français, c’est cool !