この記事では主に Nginx + PHP の設定手順を詳しく紹介し、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; }
将来新しい「location」を追加する必要がある場合、それは必然的に、繰り返し定義された「index」コマンドが出現します。これは、複数の「場所」が水平関係にあり、継承がないためです。この場合、「index」は継承関係で定義する必要があります。 、「index」コマンドはすべての場所で使用でき、「location」で有効になります。
「if」コマンドを見てみましょう
最も誤解されているNginxコマンドと言っても過言ではありません:
if (!-e $request_filename) { rewrite . /index.php last; }
多くの人は、「if」コマンドを使用して次のことを行います。一連のチェックを実行しますが、実際にはこれは「try_files」命令の役割です。
try_files $uri $uri/ /index.php; さらに、初心者は「if」命令がカーネルであると考えることがよくあります。レベルの命令ですが、実際にはこれは書き換えモジュールの一部であり、Nginx の設定は実際には手続き型ではなく宣言型であるため、非書き換えモジュールからの命令と混合すると、期待した結果が得られない可能性があります。
以上がNginx + PHPを正しく設定する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。
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」コマンドを使用してフィルター処理することです。オリジナルのバージョンよりもはるかにクリーンです:
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;
}
}
関連する推奨事項:
nginxはphpスクリプトを解析できません