空白のPHPページを表示するnginx


164

php5-fpmでnginxサーバーをセットアップしました。サイトを読み込もうとすると、エラーのない空白のページが表示されます。HTMLページは問題なく提供されますが、phpは提供されません。php.iniでdisplay_errorsをオンにしてみましたが、うまくいきませんでした。php5-fpm.logはエラーを生成せず、nginxも生成しません。

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;
    }
}

編集

これが私の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"

1
どうやらphp-fpmはnginxから呼び出されなかったようです、nginxのエラーログを確認しましたか?
adamsmith 2013年

上記の私の更新を確認してください。
Mike Glaz 2013年

nginxエラーconnect() failed ... fastcgi://127.0.0.1:9000はあなたのnginx confと矛盾します、nginx confをリロードしますか?
adamsmith 2013年

これは正しいと思います。
Mike Glaz 2013年

2
デフォルトのnginx + php設定でもこの問題が発生するため、これが地球上の数千人にしか影響を与えないように思えて、私は本当に驚いています。
Sliq 14

回答:


250

参考までにlocation.php拡張子が付いたファイルをキャッチするためのブロックを添付しています。

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;
}

ダブルチェック/path/to/fastcgi-paramsし、それがnginxのユーザが存在し、読み取り可能であることを確認してください。


3
あなたの解決策はその一部でした。他の部分はここwildlyinaccurate.com/solving-502-bad-gateway-with-nginx-php-fpm
Mike Glaz

154
'SCRIPT_FILENAME'の最後の行は私にとってはトリックでした:)ありがとう
Stijn Leenknegt

3
ありがとう、その最後の行でトリックが行われました(Centosに付属しているバージョン1.0のnginxを使用する場合は不要です)。このすべての改善に関するドキュメントをぜひご覧ください。
ジョール2014年

1
どういたしまして、それがこれらすべての年月の後に人々を助けることを知ってうれしいです。ただし、@ spacepileの以下の更新された回答に注意してください。
Julian

2
私は同じ問題に遭遇し、私のための解決策は、ここで説明されているように(スラッシュ/なしで)SCRIPT_FILENAMEを追加することでした。しかし、何が私を狂わせたのか、なぜ私はこれを実際に行う必要があるのでしょうか?別のnginxインストール(1.9より前)があり、この行は必要ありませんでした。私はこのnginx.com/resources/wiki/start/topics/examples/phpfcgiを見つけました。これをfastcgi_paramsと比較すると、おそらくリストされているオンラインバージョンと同じではなく、SCRIPT_FILENAMEが表示されます。そこにはありません。なんで?図に行く...
ダニエルDimitrov

342

取り替える

include fastcgi_params;

include fastcgi.conf;

nginx.confのfastcgi_param SCRIPT_FILENAME ...を削除します


17
これで解決しました。に.confは追加の設定パラメータが1つありません_params
Malvineous 2013

7
これにより(そしてもちろん、/etc/init.d/nginx restart)、nginx2014
。– severin

6
これは、nginxを1.6.2にアップデートした後(2014年9月のアップデート)、私にも同じように修正されました。物事をランダムに壊すアップデートがお奨めです。
Mahn

30
ここでの裏話ですfastcgi_paramsVsはfastcgi.confblog.martinfjordvald.com/2013/04/...
レビ

4
このコードは機能しません-理由はわかりません。このコードは機能しますが、理由はわかりません。あなたは私を数時間救った。
Alex

54

この問題もあり、最終的にここに解決策が見つかりました。つまり、nginx fastcgi構成ファイル(Ubuntu 12.04では/ etc / nginx / fastcgi_params)に次の行を追加する必要があります。

fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;

2
どうもありがとう、これはUbuntu 12.04 LTSで修正されました。
Valentin Klinghammer 2014

2
nginx 1.5.4-> 1.7.4をアップグレードした後、私も修正しました。どうもありがとうございます!
trisweb 2014

4
Ubuntu 14.04で動作しました。
timetofly 2014年

1
Debian Wheezy(7.8)からJessie(8)に、およびNginx 1.2.1-2.2から1.6.2-5にアップグレードするときに修正されました。本当にありがとう。
ウィリアムタレル

1
私が理解しているように、それはそれが提供する必要があるファイルがどこにあるかをfastcgiに伝えます。PATH_TRANSLATEDは要求URIを受け取り、それを実際のファイルがサーバー上にある場所に「変換」します。例えば。test.com/index.phpのPATH_TRANSLATEDは/var/www/index.phpかもしれません
定数Meiring

44

多くのユーザーがこのスレッドに陥り、nginx + php-fpmを使用しているときに空白ページが表示されるという解決策が見つかると予想しており、私もその1人です。これは、ここで答えの多くを読んだ後に私がやったことの要約と自分の調査(php7.2に更新)です。

1)/etc/php/7.2/fpm/pool.d/www.confパラメータの値を開いて確認しますlisten

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

2)パラメータlistenfastcgi_pass、サイト構成ファイルのパラメータと一致する必要があります(つまり、:) /etc/nginx/sites-enabled/default

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

3)ファイルが実際に存在することを確認します。

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

4)存在しない場合は、php7.2-fpmが実行されていないため、再起動する必要があります。

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


locationセクションに関して/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;
   }

次のsnippets/fastcgi-php.conf場所にファイルが存在することを確認してください/etc/nginx/

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

このファイルには、php7.2-fpmで必要な変数定義のリストが含まれています。変数は、直接または個別のファイルのインクルードを介して定義されます。

 include fastcgi.conf;

このファイルは次の場所に/etc/nginx/fastcgi.confあり、次のようになります。

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

nginxには、fastcgi_paramsfastcgi.confの 2つの可能なパラメーターファイルが含まれています。両方の違いは、変数の定義ですSCRIPT_FILENAME

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

長い話を短くするには、fastcgi.confが常に機能するはずです。何らかの理由でfastcgi_paramsを使用して設定している場合は、次のように定義する必要があります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;
}

ここでnginx設定をリロードします:

$ sudo nginx -s reload

そして、phpファイルが正しく表示されることを確認してください。例えば:

/var/www/html/test.php

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

/var/www/htmlドキュメントルートへのパスはどこにありますか。

それでも空のファイルが表示される場合php.iniは、short_open_tag有効になっていることを確認してください(短いタグでPHPページをテストしている場合)。


1
ディエゴありがとう!fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;やっとトリックができた。
danger89 2015年

include fastcgi.confはそれをすべて修正するのに役立ちました
RytisLukoševičius

1
素晴らしい内訳!SCRIPT_FILENAME構成が欠落していたため、これが機能しました
herval

1
SCRIPT_FILENAMEをその構成に追加すると、「file not found」ですべてが再び失敗しました
holms

長い話はどうですか、なぜ2つのインクルードがあり、1つはそのままでは機能しないのですか?
ゴッドファーザー

24

これが/ etc / nginx / fastcgi_paramsにあることを確認してください

fastcgi_param SCRIPT_FILENAME $ request_filename;

これがすでに存在しない理由を誰が知っていますか?これをまとめて無駄にしなければならない時間の長さ!


1
+1「fastcgi_param SCRIPT_FILENAME $ request_filename;」の利点のように見える 「$ document_root / $ fastcgi_script_name」とは異なり、「$ request_filename」はNginxの「エイリアス」ディレクティブへのパスを適合させます。参照:nginx.org/en/docs/http/ngx_http_core_module.html#variables、nginx.org / en / docs / http / ngx_http_core_module.html#alias、および上記のLevitによって引用されたMartin Fjordvaldのブログ(blog.martinfjordvald.com/2013) / 04 /…)。私のロケーションブロックでは、php71-fpmとElginにHomebrewをインストールしたNginxで空白ページの問題を解決しました。
Slack Undertow 2017

15

nginxからfastCGIアプリケーションに渡された環境変数を返す短いCプログラムを作成しました。

#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;
}

これをファイルに保存してください。 fcgi_debug.c

コンパイルするには、まずとをインストールしてgccからlibfcgi-dev、次を実行します。

gcc -o fcgi_debug fcgi_debug.c -lfcgi

実行するには、をインストールしてからspawn-fcgi、次のコマンドを実行します。

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

次に、デバッグプログラムを指すようにnginx fcgi構成を変更します。

fastcgi_pass  127.0.0.1:3000;

nginxを再起動し、ページを更新すると、ブラウザにすべてのパラメータが表示され、デバッグできます。:-)


1
注:ヘッダーとspawn-fcgiが必要です。Debian / Ubuntuでは、で入手できますapt-get install spawn-fcgi libfcgi-dev
pevik 2015年

8

これらのヒントは、Ubuntu 14.04 LTSのインストールに役立ちました。

さらに、私はでオンにする必要がありshort_open_tagました/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

これは、DOドロップレットのUbuntuインストールによって修正されました。ありがとう
Andrew

nginx 1.9.4をインストールした後、これは私のために修正されました
Ajeeb.KP

6

これを追加/etc/nginx/conf.d/default.conf

fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;

2
OPの問題とは何か、そしてあなたの答えがOPの問題をどのように解決するかについてもう少し詳しく教えていただけませんか?
wookie919

1
これにより、nginx 1.8.0とphp-fpm 5.6.4-4ubuntu6を搭載したUbuntu 15.04で同じ問題が解決しました。これが実際に何をしているのか、なぜデフォルトのnginx構成ファイルに含まれていないのかを知りたいのですが、少なくともDockerfileでコード化したことをうれしく思います。
ジェームズウィリアムズ

/etc/nginx/fastcgi_paramsファイルに値を入れる方が適切だと思います。
Arda

4

誰かがこの問題を抱えているが、上記の回答のどれもが問題を解決しない場合、私はこれと同じ問題を抱えていて、私の設定ファイルが正しく、ngnixおよびphp-fpmジョブが正常に実行されていたため、追跡するのに最も苦労しました。エラーログからのエラーはありませんでした。

ばかげた間違いですが、に設定されたphp.iniファイルのShort Open Tag変数を確認したことはありませんshort_open_tag = Off。私のphpファイルがの<?代わりに使用していたため、<?phpページが空白で表示されていました。On私の場合、短いオープンタグがに設定されているはずです。

これが誰かを助けることを願っています。


2

この問題が発生する理由は、nginxのfastcgi構成が必要に応じて機能せず、配置または処理されているため、htmlデータとして応答するためです。この問題を回避するためにnginxを設定する方法は2つあります。

  1. 方法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. 方法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;
    }

どちらの方法も適切に機能するため、先に進んでいずれか1つを取ることができます。ほぼ同じ操作を実行しますが、違いはほとんどありません。


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;
}

幸運を


0

上記の回答のどれも私にとってうまくいきませんでした-PHPは、mysqliに依存するページを除いてすべてを適切にレンダリングしていました。私がOS Xを使っているので、修正は単に

sudo port install php56-mysql

その後、PHP-FPMとnginxが再起動します。

私はnginxのに古いのApache / PHPのセットアップからの移行、および用のドライバでバージョンの不一致を気づくことができなかったphp-mysqlphp-fpm


0

同様の問題があり、nginxがページを途中で処理してから停止しました。ここで提案されている解決策はどれも私にとってうまくいきませんでした。nginx fastcgiバッファリングを変更して修正しました。

fastcgi_max_temp_file_size 0;

fastcgi_buffer_size 4K;
fastcgi_buffers 64 4k;

変更後、私のlocationブロックは次のようになりました。

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;
}

詳細については、https://www.namhuy.net/3120/fix-nginx-upstream-response-buffered-temporary-file-error.htmlを参照してください


0

空白の画面が表示される場合、2つの理由が考えられます。

  1. ブラウザがフレームの表示をブロックしています。一部のブラウザでは、フレームが安全でないと見なされています。これを克服するには、フレームレスバージョンのphpPgAdminを起動します。

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

  2. X-Frame-Optionsの Nginxでセキュリティ機能を有効にしましたが、無効にしてみてください。


0

これは私の問題を解決しました:

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;
}

0

これは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;
    }
}

最後の行は、他の答えとは異なります。


2
200票以上の承認された回答があります。質問は5歳です。個人的には、この回答が質問に多く追加されているとは思いません..
treyBake

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.