初めて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から提供されていないだけです...
わかりましたので、苦労の一日の後に私が見つけた3つのもの
これが誰かのトラブルを救うことを願っています!
エラーメッセージ「プライマリスクリプトが不明です」は、ほとんど常に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がすぐに検出できる問題をチェックする必要があります。
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
を複製しないでください。
新しいnginx(v1.8)でも同じ問題がありました。新しいバージョンでは、snippets/fastcgi-php.conf;
ではなくfastcgi.conf
を使用することをお勧めします。そのため、チュートリアルからinclude fastcgi.conf
をコピーして貼り付けると、ログにPrimary script unknown
エラーが記録される可能性があります。
「プライマリスクリプトが不明です」は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人のユーザーのいずれかと同じである必要はありません。
私もこの問題を抱えており、include fastcgi_params
およびfastcgi_param SCRIPT_FILENAME ...
。
実際、nginxは各FastCGIパラメータの最後の値を設定するため、fastcgi_paramsに含まれるデフォルト値の後に値を配置する必要があります。
CentOS7.3システムでSELINUXを閉じることでこの問題を解決しました
手順:
setenforce 0
vim /etc/selinux/config set SELINUX to disabled
私は上からすべてを行いました、私の頭を叩いて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回目で、この「プライマリスクリプトが不明」が起こっているとは信じられませんでした。
私は非常に長い間、この奇妙なメッセージにとらわれてきました。しばらくの間すべてが機能し、その後突然すべてが機能しなくなったため、原因はわかりません。
MediaWikiで規定されているように、Bitnami/Nginx on Lightsailを使用して、wikiのURLを短縮していました。
多くの投稿を検索して読んだところ、これは考えられるすべてのシナリオを要約しているようで、私はそれらすべてを試しました:
root
を追加しましたが、機能しませんでしたルートフォルダphpが機能していてサブフォルダが機能していないため、root
以外の唯一の大きな違いは、使用されているルートフォルダ$request_filename
および使用されるサブフォルダーの場所$document_root
および$fastcgi_script_name
なので、ルートフォルダーの設定と一致するようにサブフォルダーの場所の設定を変更しました。
その後、うまくいきました...私はまだわかりませんなぜうまくいったかphp-fpmアクセスログを確認すると、同じURIが表示されるため、一方は404、もう一方は200でした。
唯一の違いは構成です。同じ出力を生成するため、結果が異なる結果になった理由はわかりません。
とにかく、ここに2セントを投稿することにしました。これが役に立てば幸いです。
PS:私は本当にPHPより良いエラーメッセージと詳細モードを提供することを望みます。これは問題を特定できず、詳細な出力とデバッグ情報を表示する方法がないので本当にイライラするからです。
Php-fpm sockファイルのアクセス許可を確認してください。アクセスできませんでした:
chmod 755 /usr/local/var/run/php-fpm.sock
次にnginxを再起動してみてください。
リモートサイトのクローンを作成しました。既存のwp-config.phpにリモートサーバーデータベース情報が含まれていました。
ローカルwordpress config、ローカルデータベース情報を設定して、この問題を解決しました。
同じ質問に会いましたが、他の方法では問題を解決できませんでした。
私はそれを解決し、キーがそれであることがわかります: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
同じエラーメッセージを探しているが、Apache + php-fpm(nginxなし)を使用している質問が見つかりました。私にとって、問題は間違った場所のスラッシュでした:多くのセットアップの提案には次の形式の行が含まれています:
SetHandler "proxy:unix:/path/to/file.socket|fcgi://localhost/:9000"
次のように、ポート番号の後に最後のスラッシュを配置します。
SetHandler "proxy:unix:/path/to/file.socket|fcgi://localhost:9000/"
問題は私には消えた。多分あなたは同じようなことをすることができます
私にとってそれは拡張でした。
私のphp-fpm.www.access.log
が報告していたもの:
"GET /index.php5" 404
しかし、サイト(MediaWiki)のインデックスファイルはindex.php
でした。関連するphp5
エントリに混合拡張子(php
とnginx.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';
(終了タグなし)。