nginx affichant des pages PHP vierges

164

J'ai configuré un serveur nginx avec php5-fpm. Lorsque j'essaye de charger le site, j'obtiens une page vierge sans erreur. Les pages HTML sont servies correctement mais pas en PHP. J'ai essayé d'activer display_errors dans php.ini mais pas de chance. php5-fpm.log ne produit aucune erreur et nginx non plus.

nginx.conf

server {
    listen 80;
    root /home/mike/www/606club;
    index index.php index.html;
    server_name mikeglaz.com www.mikeglaz.com;
    error_log /var/log/nginx/error.log;
    location ~ \.php$ {
            #fastcgi_pass 127.0.0.1:9000;
            # With php5-fpm:
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            fastcgi_index index.php;
            include fastcgi_params;
    }
}

ÉDITER

voici mon journal des erreurs nginx:

2013/03/15 03:52:55 [error] 1020#0: *55 open() "/home/mike/www/606club/robots.txt" failed (2: No such file or directory), client: 199.30.20.40, server: mikeglaz.com, request: "GET /robots.txt HTTP/1.1", host: "mikeglaz.com"
Mike Glaz
la source
1
Apparemment, php-fpm n'a pas été appelé par nginx, avez-vous vérifié le journal des erreurs de nginx?
adamsmith
Vérifiez ma mise à jour ci-dessus.
Mike Glaz
L'erreur nginx connect() failed ... fastcgi://127.0.0.1:9000contredit votre conf nginx, recharger nginx conf?
adamsmith
Je pense que c'est juste.
Mike Glaz
2
Je suis vraiment surpris que cela ne semble affecter que quelques milliers de personnes sur la planète, car même la configuration par défaut de nginx + php est à l'origine de cette chose.
Sliq

Réponses:

250

Pour référence, je joins mon locationbloc pour attraper des fichiers avec l' .phpextension:

location ~ \.php$ {
    include /path/to/fastcgi_params;
    fastcgi_pass  127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
}

Vérifiez le /path/to/fastcgi-params, et assurez-vous qu'il est présent et lisible par l'utilisateur nginx.

Julian H. Lam
la source
3
votre solution en faisait partie. L'autre partie est ici wildlyinaccurate.com/solving-502-bad-gateway-with-nginx-php-fpm
Mike Glaz
154
la dernière ligne avec 'SCRIPT_FILENAME' a fait l'affaire pour moi :) merci
Stijn Leenknegt
3
merci, cette dernière ligne a fait l'affaire (ce n'est pas nécessaire lors de l'utilisation de la version 1.0 de nginx fournie avec Centos). J'aimerais voir la documentation sur tout cela s'améliorer.
Jorre
1
Vous êtes les bienvenus, heureux de savoir que cela aide encore les gens après toutes ces années. Cependant, veuillez noter la réponse mise à jour de @ spacepile ci-dessous, qui est probablement meilleure.
Julian
2
J'ai rencontré le même problème et la solution pour moi était d'ajouter le SCRIPT_FILENAME comme décrit ici (sans la barre oblique /). Mais ce qui m'a rendu fou, c'est pourquoi j'ai vraiment besoin de faire ça? Nous avons eu une autre installation de nginx (plus ancienne que 1.9) et là, cette ligne n'était pas nécessaire. J'ai trouvé ce nginx.com/resources/wiki/start/topics/examples/phpfcgi , et si vous le comparez avec votre fastcgi_params, vous verrez que ce n'est probablement pas le même que la version en ligne répertoriée et vous verrez que SCRIPT_FILENAME n'est pas là-dedans. Pourquoi ça? Allez comprendre ...
Daniel Dimitrov
342

remplacer

include fastcgi_params;

avec

include fastcgi.conf;

et supprimez fastcgi_param SCRIPT_FILENAME ... dans nginx.conf

Spacepille
la source
17
Cela a résolu le problème pour moi. Il .confmanque un paramètre de configuration supplémentaire dans _params.
Malvineous
7
Ceci (et, bien sûr, /etc/init.d/nginx restart) l'a également corrigé pour moi sur Debian Testing après une nginxmise à jour le 10 septembre 2014.
severin
6
Cela m'a également corrigé après la mise à jour de nginx vers 1.6.2 (mise à jour de septembre 2014). Je dois aimer les mises à jour qui cassent les choses au hasard.
Mahn le
30
Voici la trame de fond de fastcgi_paramsvs fastcgi.conf: blog.martinfjordvald.com/2013/04/…
Levite
4
Ce code ne fonctionne pas - je ne sais pas pourquoi; Ce code fonctionne, je ne sais pas pourquoi. vous m'avez sauvé plusieurs heures.
Alex
54

J'ai également eu ce problème et j'ai finalement trouvé la solution ici . En bref, vous devez ajouter la ligne suivante à votre fichier de configuration nginx fastcgi (/ etc / nginx / fastcgi_params dans Ubuntu 12.04)

fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;
Meiring constant
la source
2
Merci beaucoup, cela a résolu le problème sur Ubuntu 12.04 LTS.
Valentin Klinghammer
2
Corrigé pour moi également après la mise à niveau de nginx 1.5.4 -> 1.7.4. Merci beaucoup!
trisweb
4
A travaillé sur Ubuntu 14.04.
horaire du
1
Correction lors de la mise à jour de Debian Wheezy (7.8) vers Jessie (8) et de Nginx 1.2.1-2.2 vers 1.6.2-5. Un immense merci.
William Turrell
1
Si je comprends bien, il indique à fastcgi où se trouvent les fichiers qu'il doit servir. PATH_TRANSLATED prend l'URI de la demande, puis le "traduit" dans l'emplacement du fichier réel sur le serveur. Par exemple. PATH_TRANSLATED pour test.com/index.php pourrait être /var/www/index.php
Constant Meiring
44

De nombreux utilisateurs tombent dans ce fil en espérant trouver une solution pour les pages vierges affichées tout en utilisant nginx + php-fpm , moi étant l'un d'entre eux. Voici un récapitulatif de ce que j'ai fini par faire après avoir lu de nombreuses réponses ici ainsi que mes propres enquêtes (mise à jour en php7.2):

1) Ouvrez /etc/php/7.2/fpm/pool.d/www.confet vérifiez la valeur du paramètre listen.

listen = /var/run/php/php7.2-fpm.sock

2) Le paramètre listendoit correspondre au fastcgi_passparamètre du fichier de configuration de votre site (i, e :) /etc/nginx/sites-enabled/default.

fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;

3) Vérifiez que le fichier existe réellement:

$ file /var/run/php/php7.2-fpm.sock 
/var/run/php/php7.2-fpm.sock: socket

4) S'il n'existe pas, cela signifie que php7.2-fpm n'est pas en cours d'exécution, vous devez donc le redémarrer:

$ sudo /etc/init.d/php7.2-fpm restart
[ ok ] Restarting php7.2-fpm (via systemctl): php7.2-fpm.service.


En ce qui concerne la locationsection dans /etc/nginx/sites-enabled/default:

   # pass PHP scripts to FastCGI server
   #
   location ~ \.php$ {
      include snippets/fastcgi-php.conf;

      # With php-fpm (or other unix sockets):
      fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
   }

Vérifiez que le fichier snippets/fastcgi-php.confexiste à l'emplacement /etc/nginx/:

$ file /etc/nginx/snippets/fastcgi-php.conf
/etc/nginx/snippets/fastcgi-php.conf: ASCII text

Ce fichier contient une liste de définitions de variables requises par php7.2-fpm. Les variables sont définies directement ou via une inclusion d'un fichier séparé.

 include fastcgi.conf;

Ce fichier se trouve à /etc/nginx/fastcgi.confet il ressemble à:

fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
...
fastcgi_param  REDIRECT_STATUS    200;

nginx inclut deux fichiers de paramètres possibles: fastcgi_params et fastcgi.conf . La différence entre les deux est la définition de la variable SCRIPT_FILENAME:

$ diff fastcgi_params fastcgi.conf 
1a2
> fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;

Pour faire une histoire courte, fastcgi.conf devrait toujours fonctionner. Si, pour une raison quelconque , vous utilisez fastcgi_params , vous devez définir SCRIPT_FILENAME:

location ~ \.php$ {
  include snippets/fastcgi-php.conf;

  # With php-fpm (or other unix sockets):
  fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;

  fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
}

Maintenant, rechargez la configuration nginx:

$ sudo nginx -s reload

Et vérifiez qu'un fichier php s'affiche correctement. Par exemple:

/var/www/html/test.php

<pre><?php var_export($_SERVER)?></pre>

/var/www/htmlest le chemin vers la racine du document.

Si malgré tout cela, vous voyez toujours un fichier vierge, assurez-vous que votre php.inia short_open_tagactivé (si vous testez une page PHP avec de courtes balises).

Diego Pino
la source
1
Merci Diego! fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;A fait le tour enfin.
danger89
L'inclusion fastcgi.conf a aidé à tout réparer
Rytis Lukoševičius
1
ventilation géniale! Il me manquait la configuration SCRIPT_FILENAME, cela l'a fait fonctionner
herval
1
quand j'ai ajouté SCRIPT_FILENAME à cette configuration, encore une fois, tout a échoué avec "fichier non trouvé"
holms
Qu'en est-il de la longue histoire, pourquoi y a-t-il deux inclus et un ne fonctionne pas hors de la boîte?
The Godfather
24

Assurez-vous que vous l'avez dans / etc / nginx / fastcgi_params

fastcgi_param SCRIPT_FILENAME $ request_filename;

Qui sait pourquoi ce n'est pas déjà là? Le temps que cela doit perdre collectivement!

Tim
la source
1
+1 Un avantage apparent de "fastcgi_param SCRIPT_FILENAME $ request_filename;" est différent de "$ racine_document / $ fastcgi_script_name", "$ request_filename" adapte le chemin à la directive "alias" de Nginx. Voir: nginx.org/en/docs/http/ngx_http_core_module.html#variables , nginx.org/en/docs/http/ngx_http_core_module.html#alias et le blog de Martin Fjordvald cité par Levit ci-dessus ( blog.martinfjordvald.com/2013) / 04 /… ). Dans mon bloc d'emplacement, il a résolu le problème de page vierge avec php71-fpm et Nginx installés avec Homebrew sur El Capitan.
Slack Undertow
15

J'ai écrit un court programme C qui renvoie les variables d'environnement passées de nginx à l'application fastCGI.

#include <stdlib.h>
#include <fcgi_stdio.h>
extern char **environ;

int main(int argc, char **argv) {
    char *envvar;
    int i;

    int count = 0;
    while(FCGI_Accept() >= 0) {
        printf("Content-type: text/html\n\n"
               "<html><head><title>FastCGI Call Debug Tool</title></head>\n"
               "<body><h1>FastCGI Call Debugging Tool</h1>\n"
               "<p>Request number %d running on host <i>%s</i></p>\n"
               "<h2>Environment Variables</h2><p>\n",
              ++count, getenv("SERVER_NAME"));
        i = 0;
        envvar = environ[i];
        while (envvar != NULL) {
                printf("%s<br/>",envvar);
                envvar = environ[++i];
        }
        printf("</p></body></html>\n");
    }
    return 0;
}

Enregistrez-le dans un fichier, par exemple fcgi_debug.c

Pour compiler, installez d' abord gccet libfcgi-dev, puis exécutez:

gcc -o fcgi_debug fcgi_debug.c -lfcgi

Pour l'exécuter, installez spawn-fcgi, puis exécutez:

spawn-fcgi -p 3000 -f /path/to/fcgi_debug

Ensuite, modifiez votre configuration nginx fcgi pour qu'elle pointe vers le programme de débogage:

fastcgi_pass  127.0.0.1:3000;

Redémarrez nginx, actualisez la page et vous devriez voir tous les paramètres apparaître dans votre navigateur pour que vous puissiez déboguer! :-)

tu-Réintégrer Monica-dor duh
la source
1
Notez que vous avez besoin d'en-têtes et de spawn-fcgi. Sur Debian / Ubuntu, vous pouvez l'obtenir apt-get install spawn-fcgi libfcgi-dev.
pevik
8

Ces conseils m'ont aidé avec mon installation Ubuntu 14.04 LTS,

De plus, j'avais besoin d'activer l' short_open_tagentrée/etc/php5/fpm/php.ini

$ sudo kate /etc/php5/fpm/php.ini

short_open_tag = On

$ sudo service php5-fpm restart
$ sudo service nginx reload
CNSKnight
la source
Ceci corrigé par l'installation de DO droplet Ubuntu. Merci
Andrew
Cela a été corrigé pour moi après l'installation de nginx
1.9.4
6

Ajoutez ceci dans /etc/nginx/conf.d/default.conf:

fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;
nomulex
la source
2
Pourriez-vous s'il vous plaît fournir un peu plus de détails sur ce qu'est exactement le problème d'OP et comment votre réponse résout le problème d'OP?
wookie919
1
Cela a résolu le même problème pour moi sur Ubuntu 15.04 avec nginx 1.8.0 et php-fpm 5.6.4-4ubuntu6. J'aimerais savoir ce que cela fait réellement et pourquoi il n'est pas inclus dans le fichier de configuration par défaut de nginx, mais je suis au moins heureux de l'avoir maintenant codifié dans un Dockerfile.
James Williams
Mettre la valeur dans le /etc/nginx/fastcgi_paramsfichier serait plus approprié, je pense.
Arda le
4

Au cas où quelqu'un aurait ce problème mais qu'aucune des réponses ci-dessus ne résoudrait ses problèmes, j'avais ce même problème et j'ai eu le plus de mal à le suivre car mes fichiers de configuration étaient corrects, mes travaux ngnix et php-fpm fonctionnaient bien, et aucune erreur ne s'est produite dans les journaux d'erreur.

Erreur stupide mais je n'ai jamais vérifié la variable Short Open Tag dans mon fichier php.ini qui était définie sur short_open_tag = Off. Puisque mes fichiers php utilisaient <?au lieu de <?php, les pages étaient vides. Short Open Tag aurait dû être défini Ondans mon cas.

J'espère que cela aide quelqu'un.

McLovin
la source
2

La raison pour laquelle ce problème se produit est que les configurations fastcgi dans nginx ne fonctionnent pas comme requis et, en place ou en cours de traitement, elles répondent sous forme de données html. Il existe deux façons possibles de configurer votre nginx pour éviter ce problème.

  1. Méthode 1:

        location ~ \.php$ {
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                # With php5-fpm:
                fastcgi_pass unix:/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi.conf;
        }
  2. Méthode 2:

    location ~ \.php$ {
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            include snippets/fastcgi-php.conf;
            # With php5-fpm:
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            include fastcgi_params;
    }

Les deux méthodes fonctionneraient correctement, vous pouvez continuer et prendre n'importe laquelle d'entre elles. Ils effectuent presque les mêmes opérations avec très peu de différence.

Manish M Demblani
la source
1
location ~ [^/]\.php(/|$) {
         fastcgi_pass unix:/PATH_TO_YOUR_PHPFPM_SOCKET_FILE/php7.0-fpm.sock;
         include fastcgi_params;
         fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
         fastcgi_param SCRIPT_NAME $fastcgi_script_name;
}

Bonne chance

gounane
la source
0

Aucune des réponses ci-dessus n'a fonctionné pour moi - PHP rendait tout correctement sauf les pages qui reposaient sur mysqli, pour lesquelles il envoyait une page vierge avec un code de réponse 200 et ne lançait aucune erreur. Comme je suis sous OS X, le correctif était simplement

sudo port install php56-mysql

suivi d'un redémarrage de PHP-FPM et nginx.

J'étais en train de migrer d'une ancienne configuration Apache / PHP vers nginx et je n'ai pas remarqué la non-concordance de version dans le pilote pour php-mysqlet php-fpm.

jczaplew
la source
0

J'ai eu un problème similaire, nginx traitait une page à mi-chemin puis s'arrêtait. Aucune des solutions suggérées ici ne fonctionnait pour moi. Je l'ai corrigé en changeant la mise en mémoire tampon nginx fastcgi:

fastcgi_max_temp_file_size 0;

fastcgi_buffer_size 4K;
fastcgi_buffers 64 4k;

Après les changements, mon locationbloc ressemblait à:

location ~ \.php$ {
    try_files $uri /index.php =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_max_temp_file_size 0;
    fastcgi_buffer_size 4K;
    fastcgi_buffers 64 4k;
    include fastcgi_params;
}

Pour plus de détails, voir https://www.namhuy.net/3120/fix-nginx-upstream-response-buffered-temporary-file-error.html

Mugoma J. Okomba
la source
0

Si vous obtenez un écran vide, cela peut être dû à 2 raisons:

  1. Navigateur bloquant l'affichage des cadres. Dans certains navigateurs, les cadres sont considérés comme dangereux. Pour surmonter cela, vous pouvez lancer la version sans cadre de phpPgAdmin en

    http://-your-domain-name-/intro.php

  2. Vous avez activé une fonction de sécurité dans Nginx pour X-Frame-Options, essayez de la désactiver.

Nahid Ali
la source
0

Cela a résolu mon problème:

location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    include snippets/fastcgi-php.conf;
    # With php5-fpm:
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    include fastcgi_params;
}
Ruberandinda Patience
la source
0

Ceci est mon hôte virtuel pour UBUNTU 18.04 + apache + php7.2

server {
    listen 80;
    server_name test.test;
    root /var/www/html/{DIR_NAME}/public;
    location / {
        try_files $uri /index.php?$args;
    }
location ~ \.php$ {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/run/php/php7.2-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    }
}

La dernière ligne le rend différent des autres réponses.

Witek Bezgin
la source
2
il y a une réponse acceptée avec plus de 200 votes - la question a 5 ans ..
Personnellement,
0

J'ai eu une erreur similaire, mais en combinaison avec Nextcloud. Donc, au cas où cela ne fonctionnerait pas, essayez: Jetez un œil au manuel Nginx .

DeDenker
la source