web-dev-qa-db-ja.com

Nginx 1 FastCGIがstderrで送信されました:「プライマリスクリプトが不明です」

初めてNginxを使用しましたが、ApacheとLinuxに精通しています。既存のプロジェクトを使用していますが、index.phpを表示しようとすると、404ファイルが見つかりません。

これがaccess.logエントリです。

2013/06/19 16:23:23 [error] 2216#0: *1 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 127.0.0.1, server: localhost, request: "GET /index.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", Host: "www.ordercloud.lh"

そして、これはサイトで利用可能なファイルです:

server {
    set $Host_path "/home/willem/git/console/www";
    access_log  /www/logs/console-access.log  main;

    server_name  console.ordercloud;
    root   $Host_path/htdocs;
    set $yii_bootstrap "index.php";

    charset utf-8;

    location / {
        index  index.html $yii_bootstrap;
        try_files $uri $uri/ /$yii_bootstrap?$args;
    }

    location ~ ^/(protected|framework|themes/\w+/views) {
        deny  all;
    }

    #avoid processing of calls to unexisting static files by yii
    location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|Zip|rar)$ {
        try_files $uri =404;
    }

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ \.php {
        fastcgi_split_path_info  ^(.+\.php)(.*)$;

        #let yii catch the calls to unexising PHP files
        set $fsn /$yii_bootstrap;
        if (-f $document_root$fastcgi_script_name){
            set $fsn $fastcgi_script_name;
        }

        fastcgi_pass   127.0.0.1:9000;
        include fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fsn;

        #PATH_INFO and PATH_TRANSLATED can be omitted, but RFC 3875 specifies them for CGI
        fastcgi_param  PATH_INFO        $fastcgi_path_info;
        fastcgi_param  PATH_TRANSLATED  $document_root$fsn;
    }

    location ~ /\.ht {
        deny  all;
    }
}

私の/ home/willem/git/consoleはwww-data:www-data(phpなどを実行している私のウェブユーザー)が所有しており、欲求不満から777のアクセス許可を与えています...

私の推測では、設定に問題があると思いますが、理解できません...

[〜#〜] update [〜#〜]それで、それを/var/www/に移動し、より基本的な設定を使用しました:

server {
    #listen   80; ## listen for ipv4; this line is default and implied
    #listen   [::]:80 default ipv6only=on; ## listen for ipv6

    root /var/www/;
    index index.html index.htm;

    # Make site accessible from http://localhost/
    server_name console.ordercloud;

    location / {
        root           /var/www/console/frontend/www/;
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  /var/www;
            include        fastcgi_params;
    }

    location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|Zip|rar)$ {
            try_files $uri =404;
        }

    location /doc/ {
        alias /usr/share/doc/;
        autoindex on;
        allow 127.0.0.1;
        deny all;
    }

}

また、localhost/console/frontend/www/index.phpを呼び出すと、500 PHPと表示されます。つまり、そこで提供されています。console.ordercloudから提供されていないだけです...

85
We0

わかりましたので、苦労の一日の後に私が見つけた3つのもの

  1. 何らかの理由で、すでにポート9000で何かが実行されているため、9001に変更しました
  2. デフォルトのサイトが新しいサイトをインターセプトしていましたが、それができないので、なぜなのか理解できませんが、リンクを解除しました
  3. Nginxは、サイト利用可能サイトからサイト対応サイトへのシンボリックリンクを自動的には行いません。

これが誰かのトラブルを救うことを願っています!

8
We0

エラーメッセージ「プライマリスクリプトが不明です」は、ほとんど常にnginx SCRIPT_FILENAMEディレクティブの誤って設定されたfastcgi_paramに関連しています(または不正な権限、他の回答を参照してください)。

最初に投稿した構成でifを使用しています。 邪悪な場合 であり、問​​題が発生することはよく知られています。

ロケーションブロック内でrootディレクティブを設定することはお勧めできませんが、もちろん機能します。

次のようなものを試すことができます:

server {
    location / {
        location ~* \.php$ {
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_pass 127.0.0.1:9000;
            try_files $uri @yii =404;
        }
    }
    location @yii {
        fastcgi_param SCRIPT_FILENAME $document_root$yii_bootstrap;
    }
}

上記の構成はテストされていないことに注意してください。適用する前にnginx -tを実行して、nginxがすぐに検出できる問題をチェックする必要があります。

96
Fleshgrinder

SCRIPT_FILENAMEが間違っているのはalwaysではありません。
それはPHPが間違ったユーザー/グループとして実行されているかもしれません。

この例はMac OS Xに固有のものです。これは私の経験ではセットアップが最も面倒です(Debianは比較すると簡単です)-PHPからアップグレードしました homebrew と優れたjosegonzalezパッケージを使用した5.6から7.0。

問題は、設定ファイルの新しいコピーが作成されたことでした。

メインの設定ファイルは/usr/local/etc/php/7.0/php-fpm.confですが、サブディレクトリ全体を含む最後のPool Definitionsセクションに注意してください。

include=/usr/local/etc/php/7.0/php-fpm.d/*.conf

php-fpm.dにはwww.confファイルがあります。デフォルトでは次のようになります。

user = _www
group = _www

OS Xでは、これを次のように変更する必要がある場合があります。

user = [your username]
group = staff

(これはdocument_rootのls -lhと一致するはずです)

残念ながら、この変更を行わなくても、Nginxエラーログにこれが表示されます正しい場所でファイルを探している場合でも

"Primary script unknown" while reading response header from upstream

現在実行しているものを確認します:

ps aux | grep 'php-fpm'

よりきれいに:

ps aux | grep -v root | grep php-fpm | cut -d\  -f1 | sort | uniq

スクリプトファイル名が正しいかどうかを確認する方法:

(他の回答でigorsantos07から盗まれた)

メインのhttpブロックに追加/usr/local/etc/nginx/nginx.conf

log_format scripts '$document_root$fastcgi_script_name > $request';

(最初のビットは現在使用しているものである必要があるため、それが正しいかどうかを確認できます。)

そして、先ほど定義したログをサイトのserverブロックで使用するには:

access_log /var/log/nginx/scripts.log scripts;

正しい場合は、example.com/phpinfo.phpをリクエストすると、次のようになります。

/path/to/docroot/phpinfo.php > GET /phpinfo.php

既存の構成を簡略化できますか?

インターネットのどこかからコピー/貼り付けしたlocation ~ \.php {ブロックを使用していますか?ほとんどのパッケージでは、より迅速かつクリーンに行うことができます。例えばOS Xでは、これが必要になります。

location ~ \.php {
    fastcgi_pass 127.0.0.1:9000;
    include snippets/fastcgi-php.conf;

    # any site specific settings, e.g. environment variables
}

Fastcgi_split_path_info、try_files、fastcgi_index(デフォルトはindex.php)などが/usr/local/etc/nginx/snippets/fastcgi-php.confにあります。

次に、重要なSCRIPT_FILENAMEを含む/usr/local/etc/nginx/fastcgi.conf設定のリストであるfastcgi_paramが含まれます。

PHPロケーションブロックでrootを複製しないでください。

45
William Turrell

新しいnginx(v1.8)でも同じ問題がありました。新しいバージョンでは、snippets/fastcgi-php.conf;ではなくfastcgi.confを使用することをお勧めします。そのため、チュートリアルからinclude fastcgi.confをコピーして貼り付けると、ログにPrimary script unknownエラーが記録される可能性があります。

6
Dan Dascalescu

「プライマリスクリプトが不明です」SELinuxセキュリティコンテキストによって発生します。

クライアントは応答を受け取ります

ファイルが見つかりません。

nginx error.logに次のエラーメッセージがあります

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

したがって、Webルートフォルダのセキュリティコンテキストタイプをhttpd_sys_content_tに変更するだけです

chcon -R -t httpd_sys_content_t /var/www/show




nginx/php-fpm configには3人のユーザーがいます

/ etc/nginx/nginx.conf

user nobody nobody;  ### `user-1`, this is the user run nginx woker process
...
include servers/*.conf;

/ etc/nginx/conf.d/www.conf

location ~ \.php$ {
#   fastcgi_pass 127.0.0.1:9000;  # tcp socket
    fastcgi_pass unix:/var/run/php-fpm/fpm-www.sock;  # unix socket
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

/ etc/php-fpm.d/www.conf

[www]
user = Apache  ### `user-2`, this is the user run php-fpm pool process
group = Apache

;listen = 127.0.0.1:9000  # tcp socket
listen = /var/run/php-fpm/fpm-www.sock  # unix socket

listen.onwer = nobody  ### `user-3`, this is the user for unix socket, like /var/run/php-fpm/fpm-www.sock
listen.group = nobody  # for tcp socket, these lines can be commented
listen.mode = 0660

user-1とuser-2は同じである必要はありません。

Unixソケットの場合、user-1はuser-3と同じにする必要があります。nginx fastcgi_passには、UNIXソケットに対する読み取り/書き込み権限が必要です。

そうでない場合、nginxは502不正なゲートウェイを取得し、nginx error.logに次のエラーメッセージが記録されます

* 36 unix:/var/run/php-fpm/fpm-www.sockへのconnect()は、アップストリームへの接続中に失敗しました(13:権限が拒否されました)

およびWebルートフォルダのユーザー/グループ(/ var/www/show)は、これらの3人のユーザーのいずれかと同じである必要はありません。

4
PLA

私もこの問題を抱えており、include fastcgi_paramsおよびfastcgi_param SCRIPT_FILENAME ...

実際、nginxは各FastCGIパラメータの最後の値を設定するため、fastcgi_paramsに含まれるデフォルト値の後に値を配置する必要があります。

2
Seb35

CentOS7.3システムでSELINUXを閉じることでこの問題を解決しました

手順:

  • exec setenforce 0
  • Uは設定ファイルも変更する必要があります

vim /etc/selinux/config set SELINUX to disabled

1
kent

私は上からすべてを行いました、私の頭を叩いて2時間を失いました、そして問題はまだ持続しました。最後に私はやった:

Sudo service php7.0-fpm restart

そして、ビオラはうまくいきました!

ところで、リンクからnginx confを使用して新しいsymfony 3.4プロジェクトを設定していました: https://symfony.com/doc/3.4/setup/web_server_configuration.html

これは、symfonyの新しいプロジェクトを始めて5回目で、この「プライマリスクリプトが不明」が起こっているとは信じられませんでした。

0
ermacmkx

私は非常に長い間、この奇妙なメッセージにとらわれてきました。しばらくの間すべてが機能し、その後突然すべてが機能しなくなったため、原因はわかりません。

MediaWikiで規定されているように、Bitnami/Nginx on Lightsailを使用して、wikiのURLを短縮していました。

多くの投稿を検索して読んだところ、これは考えられるすべてのシナリオを要約しているようで、私はそれらすべてを試しました:

  • nginxは問題ありません、ルートフォルダーphpは機能していますが、サブフォルダーは機能しません
  • 404としてスローされるエラー+ nginxではなく、裸の文字列 "File not found"
  • サーバーにrootを追加しましたが、機能しませんでした
  • フォルダとphp-fpm/nginxの権限を確認してください。ルートとサブフォルダは同じです。
  • php-fpmのマニュアルでエラーコードの解釈を確認してください。見つかりませんでした
  • php-fpmアクセスログをオンにします。リクエストURIは正しいが、404が返されます
  • php-fpmの詳細/デバッグモードをオンにしようとしましたが、機能しませんでした。想定されるエラーログファイルは常に空です

ルートフォルダphpが機能していてサブフォルダが機能していないため、root以外の唯一の大きな違いは、使用されているルートフォルダ$request_filenameおよび使用されるサブフォルダーの場所$document_rootおよび$fastcgi_script_nameなので、ルートフォルダーの設定と一致するようにサブフォルダーの場所の設定を変更しました。

その後、うまくいきました...私はまだわかりませんなぜうまくいったかphp-fpmアクセスログを確認すると、同じURIが表示されるため、一方は404、もう一方は200でした。

enter image description here

唯一の違いは構成です。同じ出力を生成するため、結果が異なる結果になった理由はわかりません。

とにかく、ここに2セントを投稿することにしました。これが役に立てば幸いです。

PS:私は本当にPHPより良いエラーメッセージと詳細モードを提供することを望みます。これは問題を特定できず、詳細な出力とデバッグ情報を表示する方法がないので本当にイライラするからです。

0
Dai

Php-fpm sockファイルのアクセス許可を確認してください。アクセスできませんでした:

chmod 755 /usr/local/var/run/php-fpm.sock

次にnginxを再起動してみてください。

0
spetsnaz

リモートサイトのクローンを作成しました。既存のwp-config.phpにリモートサーバーデータベース情報が含まれていました。

ローカルwordpress config、ローカルデータベース情報を設定して、この問題を解決しました。

0
Shean Hoxie

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

私はそれを解決し、キーがそれであることがわかります: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

同じエラーメッセージを探しているが、Apache + php-fpm(nginxなし)を使用している質問が見つかりました。私にとって、問題は間違った場所のスラッシュでした:多くのセットアップの提案には次の形式の行が含まれています:

SetHandler "proxy:unix:/path/to/file.socket|fcgi://localhost/:9000"

次のように、ポート番号の後に最後のスラッシュを配置します。

SetHandler "proxy:unix:/path/to/file.socket|fcgi://localhost:9000/"

問題は私には消えた。多分あなたは同じようなことをすることができます

0
Christian

私にとってそれは拡張でした。

私のphp-fpm.www.access.logが報告していたもの:

"GET /index.php5" 404

しかし、サイト(MediaWiki)のインデックスファイルはindex.phpでした。関連するphp5エントリに混合拡張子(phpnginx.conf)があったことがわかりました。これが動作する設定です:

location / {
    index index.php;
    try_files $uri $uri/ = @mediawiki;
}
location = /favicon.ico {
    return 204;
}
location ~ \.php$ {
    fastcgi_pass unix:/var/run/php-fpm.sock;
    include fastcgi_params;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME /path/to/viki$fastcgi_script_name;
    fastcgi_param DOCUMENT_ROOT /path/to/viki;
    fastcgi_intercept_errors on;
}

location @mediawiki {
    rewrite ^/([^?]*)(?:\?(.*))? /index.php?title=$1&$args last;
}

これらすべてのエントリにindex.php5を使用させることができます。index.php5ファイルをルートに追加し、次のコンテンツを追加します。

<?php require './index.php';

(終了タグなし)。

0
vesperto