Nginx + PHPを正しく設定する方法

不言
リリース: 2023-03-24 07:02:01
オリジナル
6218 人が閲覧しました

この記事では主に 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 の設定は実際には手続き型ではなく宣言型であるため、非書き換えモジュールからの命令と混合すると、期待した結果が得られない可能性があります。

「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」コマンドを使用してフィルター処理することです。オリジナルのバージョンよりもはるかにクリーンです:


 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スクリプトを解析できません



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

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!