PHP / Nginx : page blanche lors de l'appel d'un script php

J'ai migré récemment certains sites d'un VPS sous Debian Squeeze vers Jessie, et suite à cette migration, les sites étaient KO.

Par d'erreur dans les logs nginx, mais une simple page blanche. Pas de code html généré, rien.

J'ai regardé les permissions sur les répertoires, tout était OK. Un test avec une page HTML simple renvoie bien ce qu'il faut.

Après quelques investigations, il apparaît que ceci est lié à la version de nginx utilisée :

  • version 1.2.1 sur Debian Squeeze
  • version 1.6.2 sur Debian Jessie

Entre les deux versions, la syntaxe a changé, et la faute incombe essentiellement aux fichiers /etc/nginx/fastgi_params et /etc/nginx/fastcgi.conf.

En version 1.2.1, on pouvait utiliser :

  location ~ \.php$ {
        #NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
        fastcgi_intercept_errors on;
        fastcgi_pass unix:/var/run/php5-fpm.sock;

        include fastcgi_params;
   }

Mais avec la version 1.6.2, le fichier fastcgi_params ne suffit plus. Il y manque une ligne, qui est présente dans le fichier fastcgi.conf :

fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;

 

La solution est donc d'utiliser le fastcgi.conf, ou alors d'ajouter la ligne manquante dans le fichier fastcgi_params.

  location ~ \.php$ {
        #NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
        fastcgi_intercept_errors on;
        fastcgi_pass unix:/var/run/php5-fpm.sock;

         include fastcgi.conf ;
  }

On peut aussi utiliser un nouveau fichier de configuration /etc/nginx/snippets/fastcgi-php.conf, qui ajoute certains contrôles :

# regex to split $uri to $fastcgi_script_name and $fastcgi_path
fastcgi_split_path_info ^(.+\.php)(/.+)$;

# Check that the PHP script exists before passing it
try_files $fastcgi_script_name =404;

# Bypass the fact that try_files resets $fastcgi_path_info
# see: http://trac.nginx.org/nginx/ticket/321
set $path_info $fastcgi_path_info;
fastcgi_param PATH_INFO $path_info;

fastcgi_index index.php;
include fastcgi.conf;

 

De ce fait, la configuration devient  :

  location ~ \.php$ {
        #NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
        fastcgi_intercept_errors on;
        fastcgi_pass unix:/var/run/php5-fpm.sock;

        include snippets/fastcgi-php.conf ;
  }

On recharge la configuration nginx, et ça roule :

service nginx reload

 

Catégorie
Tag