ホームページ  >  記事  >  バックエンド開発  >  nginxでphpを設定する方法

nginxでphpを設定する方法

藏色散人
藏色散人オリジナル
2020-12-01 09:52:073809ブラウズ

nginx で php を設定する方法: まず、Nginx で fastcgi_params および fastcgi.conf 構成ファイルを変更し、次に、PHP で cgi.fix_pathinfo がオンになっているときに try_files コマンドを使用して 1 回フィルタリングします。

nginxでphpを設定する方法

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

このチュートリアルの動作環境: linux5.9.8 システム、PHP7 .1 バージョンでは、この方法はすべてのブランドのコンピューターに適用できます。

Nginx PHP の構成

多くの人にとって、Nginx PHP の構成は、チュートリアルを検索してコピーして貼り付けることに他なりません。何の問題もないように思えますが、実はインターネット上の多くの情報は荒廃しており、抜け穴が多く、深い理解を求めずにただコピペしてしまうと、遅かれ早かれその代償を払うことになります。 。

PHP を使用してフロントエンド コントローラーを実装するとします。率直に言えば、これは統合された入り口です。すべての PHP リクエストを同じファイルに送信し、このファイル内の "REQUEST_URI" を解析してルーティングを実装します。ファイル。

現時点では、多くのチュートリアルで次のように Nginx PHP を構成する方法が説明されています:

server {
    listen 80;
    server_name foo.com;

    root /path;

    location / {
        index index.html index.htm index.php;        if (!-e $request_filename) {
            rewrite . /index.php last;
        }
    }

    location ~ \.php$ {        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME /path$fastcgi_script_name;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
    }
}

多くのエラー、または少なくとも悪臭があります。調べてみるといくつか見つかります。 。

#…

最初に、Nginx 構成ファイル内の命令の継承関係を理解する必要があります。Nginx 構成ファイルは、外側から内側まで共通のブロックに分割されています。 「http」、「server」、「location」などの場合、デフォルトの継承関係は外側から内側です。これは、内側のブロックが外側のブロックの値をデフォルト値として自動的に取得することを意味します(例外があります)。詳細についてはリファレンスを参照してください)。

#…

「index」ディレクティブから始めましょう。問題の設定では、それは「location」で定義されています:

location / {
    index index.html index.htm index.php;
}

新しいデータを将来の「場所」を定義する場合、必然的に「インデックス」命令が繰り返し定義されることになります。これは、複数の「場所」が水平関係にあり、継承がないためです。このとき、「インデックス」は「サーバー」で定義する必要があります。継承関係のヘルプ。「index」コマンドはすべての「場所」で有効になります。


「if」コマンドを見てみましょう。これは最も誤解されている Nginx コマンドであると言っても過言ではありません:

if (!-e $request_filename) {
    rewrite . /index.php last;
}

Many 「if」命令は一連のチェックを行いますが、これは実際には「try_files」命令の役割です。

try_files $uri $uri/ /index.php;

さらに、初心者は、「if」命令がカーネルレベルの命令ですが、実際には書き換えモジュールの一部であり、Nginx 構成は実際には手続き型ではなく宣言型であるため、非書き換えモジュールからの命令と混合すると、期待どおりの結果が得られない可能性があります。

#…

「fastcgi_params」設定ファイルを見てみましょう:

include fastcgi_params;
Nginx には、「fastcgi_params」と「fastcgi.conf」という 2 つの fastcgi 設定ファイルがあります。大きな違いはありません。唯一の違いは、後者には前者よりも「SCRIPT_FILENAME」定義が 1 行多いことです:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
注: $document_root と $fastcgi_script_name の間に / はありません。

当初、Nginx には「fastcgi_params」しかありませんでしたが、後に「SCRIPT_FILENAME」を定義するときにハードコーディングを使用する人が多いことがわかり、使用方法を標準化するために「fastcgi.conf」が導入されました。

しかし、ここで疑問が生じます。なぜ古い構成ファイルを変更するのではなく、新しい構成ファイルを導入する必要があるのでしょうか?これは、「fastcgi_param」命令が配列型であるためです。通常の命令と同じで、内側の層が外側の層を置き換えます。通常の命令と異なるのは、同じレベルで複数回使用される場合、代わりに追加されることです。交換されました。つまり、同じレベルで「SCRIPT_FILENAME」を 2 回定義すると、両方ともバックエンドに送信されてしまい、潜在的な問題が発生する可能性があるため、このような状況を回避するために、新しい設定ファイルが導入されました。

#…

さらに、セキュリティの問題も考慮する必要があります。PHP が「cgi.fix_pathinfo」をオンにすると、PHP は間違ったファイル タイプを PHP ファイルとして解析する可能性があります。 Nginx と PHP が同じサーバーにインストールされている場合、最も簡単な解決策は、「try_files」コマンドを使用してフィルタリングすることです。

try_files $uri =404;

前の分析によれば、これは改善されました元のバージョンよりもはるかにきれいなバージョン:

server {
    listen 80;
    server_name foo.com;

    root /path;
    index index.html index.htm index.php;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        try_files $uri =404;        include fastcgi.conf;
        fastcgi_pass 127.0.0.1:9000;
    }
}

実際には、主に「try_files」と「fastcgi_split_path_info」の互換性が十分ではないため、まだいくつかの欠陥があります。それは解決できますが、解決策はかなり醜いです。詳細は割愛します。

補足: 「location」は限定されているため、実際には「fastcgi_index」は必要ありません。

以上がnginxでphpを設定する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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