Nginx + PHP-FPM et WP-Super-Cache ?

Bastien l’a évoqué dans les commentaires d’un précédent billet sur Nginx : plutôt que de mettre Nginx en reverse proxy avec Apache derrière, pourquoi ne pas faire gérer les requètes PHP directement par Nginx ? Après tout, ce serait la solution la plus efficace, la plus rapide, et elle n’est pas difficile à mettre en place. Après avoir regardé cet article « NGINX + PHP-FPM + APC = Awesome« , j’ai dû reconnaitre que l’idée me tentait, mais je n’étais pas certain de la compatibilité totale entre la situation actuelle et la situation envisagée.

En effet, une des choses qui me font peur est la différence de prise en charge des règles de rewrite d’URL par Nginx et Apache. Apache a un mod dédié à cela (mod_rewrite), et il a l’avantage d’être la configuration standard pour beaucoup d’applications web, ce qui permet de les prendre et de les utiliser sans rien connaitre à la technique derrière.

Le problème vient donc quand on souhaite faire fonctionner ces applications web sur Nginx tout seul alors qu’elles sont prévues (via leur .htaccess notamment) pour tourner sur Apache.

Une solution intermédiaire est celle, donc, de pousser au maximum le traitement des fichiers statiques par Nginx.

D’abord, on peut lui confier les fichiers ‘habituellement considérés comme statiques’…

location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|txt|srt|swf)$ {
root  /var/www/yoursite/;
access_log  /var/log/nginx/static-yoursite-access.log;
error_log   /var/log/nginx/static-yoursite-error.log;
expires           30d;
}

(tiré du post de PapyGeek)

… mais il faut faire très attention à cela, notamment si vous construisez/utilisez une application qui peut générer des fichiers (par exemple, des images) à la demande. Ainsi, si votre application prévoit de créer tel ou tel fichier au moment où il est appelé (par exemple, une application de création de captcha), là Nginx n’enverra pas la requète à Apache, alors qu’il faudrait. La solution est donc de laisser à Apache le traitement des requètes quand celles-ci occasion des erreurs 404 chez Nginx, ou plus exactement quand la ressource n’existe pas directement :

# si la ressource demandée existe, Nginx la retourne directement
if (-f $request_filename) {
break;
}

# toutes les autres requètes sont passées à Apache
if (!-e $request_filename) {
proxy_pass http://127.0.0.1:8080/;
include /etc/nginx/conf.d/proxy.conf;
}

Pour le reste, et pour que Nginx ne prenne que les requètes dont il existe un cache déjà créé, j’ai cherché et essayé plusieurs configurations, mais aucune de celles-ci ne fonctionnaient (pour être sûr que ça fonctionne, j’ai pris les URL des pages en cache, éteint Apache2, et restesté. MAlheureusement, ça ne fonctionnait jamais, et je n’avais que des erreurs 502 BAd GEtaway, ce qui signifie que Nginx me redirigeait sur Apache2, mais comme celui-ci était éteint, cela envoyait une 502 ; alors que bien évidemment, Nginx n’aurait pas dû avoir besoin de Apache2 pour traiter la requète.).

Sources :

7 réflexions sur « Nginx + PHP-FPM et WP-Super-Cache ? »

  1. Bonjour,

    D’où l’intéret de monter un bloc complet, php adossé à Nginx.
    Personnellement, j’en suis très content, cela fonctionne à merveille, et à largement soulger mon serveru qui s’enrhumait fortement avec Apache.

    Il y a fort à gagner à utiliser nginx !

    bien cordialement,

    Arnaud,
    webmaster BDFCI.info

    RépondreRépondre
  2. @Arnaud: Oui, comme je l’ai dis, Nginx+PHP-FPM, c’est absolument génial, sauf si on doit utiliser des .htaccess (ou d’autres « dépendances » à Apache). Malheureusement, les .htaccess sont encore très très présents dans tout ce qui est CMS ou autre logiciels en PHP.

    RépondreRépondre
  3. Bonjour Louis,

    Si l’on considère l’interet des htaccess pour le rewrite, alors un peu de gymnastique et l’on y arrive.
    Par contre, je reconnais le caractère un peu aléatoire de la protection d’une page…

    J’en profite pour te dire le plaisir que j’ai à parcourir ton portail.

    Bien cordialement,

    Arnaud

    RépondreRépondre
  4. @Arnaud: Oui, c’est vrai : on peut faire les mêmes choses que dans les .htaccess avec les rewrites d’URL dans les fichiers de virtualhosts de Nginx, mais : les règles sont a changer (et c’est pas toujours facile de réussir à les convertir correctement), et de surcroît, les .htaccess ont l’énorme avantage d’être des règles ‘incrémentales’ (même si c’est au détriment des performances).

    RépondreRépondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.