ホームページ  >  記事  >  バックエンド開発  >  nginx が php プロセスを見つけられない場合はどうすればよいですか?

nginx が php プロセスを見つけられない場合はどうすればよいですか?

藏色散人
藏色散人オリジナル
2021-07-19 10:56:212421ブラウズ

nginx が php プロセスを見つけられない問題の解決策: 1. nginx.conf の構成を変更します; 2. try_files を使用して存在しない URL をキャプチャし、エラーを返します。

nginx が php プロセスを見つけられない場合はどうすればよいですか?

この記事の動作環境: Windows7 システム、PHP7.1 バージョン、DELL G3 コンピューター

こんな場合はどうすればよいですかnginx が php プロセスを見つけることができません? ?

nginx が php ファイルを見つけることができません

php-fpm を使用して PHP を解析します。「入力ファイルが指定されていません」と「ファイルが見つかりません」は、新しい nginx ユーザーにとって頭痛の種となる一般的なエラーです。理由 php-fpm プロセスは、実行する SCRIPT_FILENAME で設定された .php ファイルを見つけることができず、php-fpm はデフォルトの 404 エラー プロンプトを nginx に返します。

たとえば、私の Web サイトには document_root の下に test.php がありませんが、このファイルにアクセスすると、パケットをキャプチャすることで返されたコンテンツを確認できます。

HTTP/1.1 404 Not Found
Date: Fri, 21 Dec 2012 08:15:28 GMT
Content-Type: text/html
Proxy-Connection: close
Server: nginx/1.2.5
X-Powered-By: PHP/5.4.7
Via: 1.1 c3300 (NetCache NetApp/6.0.7)
Content-Length: 16
File not found.

多くの人は、このデフォルトの 404 エラー メッセージをユーザーに直接表示したくないため、404 エラーをカスタマイズしたいと考えています。

Before解決策の提供 まず、このタイプの 404 エラーを回避する方法を分析してから、カスタム 404 エラー ページを作成できるように、これが発生した場合 (たとえば、ユーザーが誤って存在しないパスを入力した場合) に何をすべきかについて説明します。表示されます。

1. 間違ったパスが php-fpm プロセスに送信される

この種のエラーが発生した場合、十中八九、間違ったパスを受け取るのはバックエンドの fastcgi プロセスです ( SCRIPT_FILENAME)、およびバックエンド fastcgi エラー パスを受信する理由のほとんどは構成エラーです。

一般的な nginx.conf の設定は次のとおりです:

server {
    listen   [::]:80;
    server_name  example.com www.example.com;
    access_log  /var/www/logs/example.com.access.log;  
    location / {
        root   /var/www/example.com;
        index  index.html index.htm index.pl;
    }
    location /images {
        autoindex on;
    }
    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/example.com$fastcgi_script_name;
        include fastcgi_params;
    }
}

この設定には多くの不合理な点があり、明らかな問題の 1 つはルート ディレクティブが配置されていることです。場所/作品で。ルート ディレクティブが location ブロックで定義されている場合、ルート ディレクティブは、それが配置されている場所でのみ有効になります。他の場所にはルート ディレクティブがありません。たとえば、location /images ブロックはどのリクエストにも一致しません。この問題を解決するには、リクエストごとにルート ディレクティブを繰り返し構成する必要があります。したがって、各場所が親サーバー ブロックによって定義された documentroot を継承するように、root ディレクティブをサーバー ブロックに配置する必要があります。場所で別の document_root を定義する必要がある場合は、その場所に別の root ディレクティブを定義できます。

もう 1 つの問題は、fastCGI パラメータ SCRIPT_FILENAME がハードコーディングされていることです。ルート ディレクティブの値を変更するか、ファイルを別のディレクトリに移動すると、php-fpm は「入力ファイルが指定されていません」エラーを返します。これは、SCRIPT_FILENAME が設定内でハードコーディングされており、$document_root を変更しても変更されないためです。 SCRIPT_FILENAME は次のように構成されています:

fastcgi_param  SCRIPT_FILENAME  documentrootfastcgi_script_name;

したがって、server ブロックで root ディレクティブを構成することを忘れてはなりません。そうしないと、 documentroot の値が空になり、fastcgi_script_name のみになります。 php-fpm に渡されるため、「入力ファイルが指定されていません」エラーが発生します。

2. 要求されたファイルは実際には存在しません

nginx が存在しない .php ファイルの要求を受信した場合、nginx は $uri かどうかのみをチェックするため、ファイルが .php で終わる場合、ファイルの存在の判定は行わず、.php で終わるリクエストは nginx によって直接 php-fpm に送信されて処理されます。 php-fpm の処理中にファイルが見つからない場合は、「404 Not Found」ヘッダーとともに「入力ファイルが指定されていません」が返されます。

解決策

nginx に存在しないファイルをインターセプトし、カスタム 404 エラーをリクエストして返します。

try_files を使用して存在しない URL をキャプチャし、エラーを返します。

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

上記の設定では .php ファイルが存在するかどうかがチェックされ、存在しない場合は 404 ページが返されます。

推奨学習: 「PHP ビデオ チュートリアル

以上がnginx が php プロセスを見つけられない場合はどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。