web-dev-qa-db-ja.com

Nginx + php5-fpm = "ファイルが見つかりません"

Nginx/fpmを使用してサイトをセットアップしているときに壁にぶつかりました。ページに「ファイルが見つかりません」と表示され、nginx error.logに表示されます。

FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream

私はnginxとfpmの両方に不慣れです。そのエラーメッセージは私には何の意味もありません(Googleマシンでも役に立たなかったのです!)。誰かが何が起こっているのかを理解することはできますか?

14
Mathew

次のように構成されたPHPリクエストを処理するためのlocationセクションが必要です。

    location ~ \.php$ {
            try_files $uri =404;
            fastcgi_pass    127.0.0.1:9000;
            fastcgi_index   index.php;
            fastcgi_param   SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include         fastcgi_params;
    }

(追加try_filesセキュリティの脆弱性 を解決し、任意のファイルをPHPとして実行する可能性があります。)

さらに、rootは構成ファイルのserverセクションで定義する必要があります。notlocationセクション。これは最も一般的な nginxの設定ミス の1つです。

18
Michael Hampton

これは、乗客のインストールに関する注記です。

ソースからパッセンジャー経由でnginxをインストールしたところ、php5-fpmで問題が発生しました。デフォルトのnginx.confは、Michael Hamptonによって記述された問題を利用します。解決策は、ルートとインデックスディレクティブの周りのブロックを削除することです。

location / {
    root html
    index index.html index.htm
}

になる:

root html
index index.html index.htm

さらに、phpブロックが正しく設定されていません。正しい方法については、Michael Hamptonsの回答を参照してください。

Php5-fpmがソケットを使用するように設定されている場合、追加のメモとして、nginx.confのphpブロックのfastcgi_passパラメータが/etc/php5/fpm/pool.d/www.confのソケット設定を指すようにすることができます。

2
Kenneth

Nginxの新しいバージョンでこの問題が発生しました。 (古いバージョンから取得した構成)

私がしなければならなかったことは、include fastcgi_params;カスタムの上SCRIPT_FILENAME このような:

location @web {
        try_files $uri =404;
        include         fastcgi_params;
        fastcgi_pass    127.0.0.1:9000;
        fastcgi_param   SCRIPT_FILENAME  $document_root/index.php;
}

SCRIPT_FILENAMEは上書きされていました。

2
complistic
Sudo vim /etc/php-fpm.conf

149行目について、phpユーザーとユーザーグループを変更

私は今それを成功させてテストします。

1
homeway

ロケーションブロックでエイリアスを使用している場合、未処理の404エラーもこの動作を示す可能性があります。これは、ブラウザーに表示されたページが、よりきれいにフォーマットされた(中央に配置された)nginx 404ページではなく、単純なテキスト「ファイルが見つかりません」である場合に確認できます。基本的には、404ページが見つからないということです。

解決するには、ロケーションブロックにtry_files $uri =404行を追加して、nginx設定を再読み込みします。 Michael Hampton特定のセキュリティの脆弱性を解決する について述べたことに加えて、これによりfastcgiハンドラーがエイリアス定義を上書きし、デフォルトの場所で404スクリプトを見つけることができます。

1
radiumsoup

私は見た :

Stderrで送信されたFastCGI:上流からの応答ヘッダーの読み取り中に「プライマリスクリプトが不明」

ストレステスト時に高負荷下に置かれたサーバーで。まだ確認されていない私の疑いは、OSから利用可能なファイルハンドルが使い果たされたということです。その場合、php-fpmはファイルへの参照を取得できません。

これは投機的であることに気づきましたが、それは確かに私のシナリオに合い、他の誰かを助けるかもしれません。

0
Ian Lewis

@homewayに感謝します。あなたの答えが私を刺激します。どうもありがとうございました!

同じ質問に会いましたが、他の方法では問題を解決できませんでした。

私はそれを解決します、私はキーがそれを見つけることを見つけます:Linuxユーザー権利質問につながる:stderrで送信されたFastCGI:「不明なプライマリスクリプト」

PHP-FPMのデフォルトのuser:groupはApache:apacheですが、コードディレクトリはsomeBody:someBodyです。したがって、ユーザー権利を変更する必要があります!

私はこの質問を解決するためにブログを書きます、あなたはこのブログを見ることができます:

[stderrで送信されたNginx FastCGI: "Primary script unknown"] [1] `[1]: http://geekhades.blogspot.com/2017/06/nginx-fastcgi-sent-in-stderr-primary .html

0
Love