Ngnixはhttpリクエストをどのように処理しますか

1.名前ベースの仮想サーバー

nginxは最初にどのサーバーがリクエストを処理するかを決定します。3つの仮想サーバーすべてがポート*:80でリッスンする単純な構成から始めましょう。

    サーバー{
        待機80;
        server_name example.org www.example.org;
        ...
    }

    サーバー{
        待機80;
        server_name example.net www.example.net;
        ...
    }

    サーバー{
        待機80;
        server_name example.com www.example.com;
        ...
    }

この構成では、nginxはリクエストのヘッダーフィールド「ホスト」のみをテストして、リクエストをルーティングするサーバーを決定します。その値がどのサーバー名とも一致しない場合、またはリクエストにこのヘッダーフィールドがまったく含まれていない場合、nginxはリクエストをそのポートのデフォルトサーバーにルーティングします。上記の構成では、デフォルトサーバーが最初のサーバーです。これがnginxの標準のデフォルト動作です。また、listenディレクティブのdefault_serverパラメータを使用して、デフォルトのサーバーにするサーバーを明示的に設定することもできます。

    server {
        listen 80 default_server;
        server_name example.net www.example.net;
        ...
    }

    バージョン0.8.21以降では、default_serverパラメータがすでに利用可能です。以前のバージョンでは、代わりにデフォルトのパラメーターを使用する必要があります。

デフォルトのサーバーは、リスニングポートの属性であり、サーバー名の属性ではないことに注意してください。後で詳しくご紹介します。

第二に、未定義のサーバー名を使用するhttpリクエストを防ぐ方法

「ホスト」ヘッダーフィールドのないリクエストが許可されない場合は、リクエストのみを破棄するサーバーを定義できます。

    server {
        listen 80
        server_name””;
        444を返します。
    }

ここで、サーバー名は空の文字列に設定されます。これは、「Host」ヘッダーフィールドなしのリクエストに一致し、接続を閉じるための特別なnginx非標準コード444を返します。

    バージョン0.8.48以降、これはサーバー名のデフォルト設定であるため、server_name ""は省略できます。以前のバージョンでは、コンピューターのホスト名がデフォルトのサーバー名として使用されていました。

3.名前とIPアドレスの混合に基づく仮想サーバー

一部の仮想サーバーが異なるアドレスをリッスンする、より複雑な構成を見てみましょう。

    server {
        listen 192.168.1.1:80;
        server_name example.org www.example.org;
        ...
    }

    server {
        listen 192.168.1.1:80;
        server_name example.net www.example.net;
        ...
    }

    server {
        listen 192.168.1.2:80;
        server_name example.com www.example.com;
        ...
    }

この構成では、nginxはまずサーバーブロックのリスニング指示に従って、要求されたIPアドレスとポートをテストします。次に、IPアドレスとポートに一致するサーバーブロックのserver_nameエントリに基づいて、リクエストの「ホスト」ヘッダーフィールドをテストします。サーバー名が見つからない場合、デフォルトのサーバーがリクエストを処理します。たとえば、ポート192.168.1.1:80で受信したwww.example.comに対するリクエストは、ポート192.168.1.1:80のデフォルトサーバー(つまり、最初のサーバー)によって処理されます。これは、このポートにwww.example.comがないためです。定義。

前述のように、デフォルトサーバーはリスニングポートのプロパティであり、ポートごとに異なるデフォルトサーバーを定義できます。

    server {
        listen 192.168.1.1:80;
        server_name example.org www.example.org;
        ...
    }

    server {
        listen 192.168.1.1:80 default_server;
        server_name example.net www.example.net;
        ...
    }

    server {
        listen 192.168.1.2:80 default_server;
        server_name example.com www.example.com;
        ...
    }

4番目に、単純なPHPサイト構成

ここで、nginxが典型的な単純なPHP Webサイトのリクエストを処理する場所を選択する方法を見てみましょう。

    server {
        listen 80
        server_name example.org www.example.org;
        root / data / www;

        場所/ {
            index index.html index.php;
        }

        場所〜* \。(gif | jpg | png)$ {30日で
            期限切れ;
        }

        場所〜\ .php $ {
            fastcgi_pass localhost:9000;
            fastcgi_param SCRIPT_FILENAME
                          $ document_root $ fastcgi_script_name;
            include fastcgi_params;
        }
    }
   
リストされた順序に関係なく、nginxは最初にテキスト文字列で指定された最も具体的なプレフィックスの場所を検索します。上記の構成では、接頭辞の位置は「/」のみであり、すべての要求に一致するため、最後の手段として使用されます。次に、nginxは、構成ファイルにリストされている順序で、正規表現で指定された場所を確認します。最初に一致した式は検索を停止し、nginxはこの場所を使用します。リクエストに一致する正規表現がない場合、nginxは以前に検出された最も具体的なプレフィックスの場所を使用します。

すべてのタイプのロケーションは、パラメーターなしでリクエスト行のURI部分のみをテストすることに注意してください。これは、クエリ文字列のパラメーターをいくつかの方法で指定できるためです。

    /index.php?user=john&page=1
    /index.php?page=1&user=john

さらに、誰でもクエリ文字列で何でもリクエストできます。

    /index.php?page=1&something+else&user=john

次に、上記の構成でリクエストを処理する方法を見てみましょう。

リクエスト「/logo.gif」は、最初にプレフィックス位置「/」に一致し、次に正規表現「\。(Gif | jpg | png)$」に一致するため、後者の位置で処理されます。「root / data / www」という命令を使用して、要求をファイル/data/www/logo.gifにマップし、ファイルをクライアントに送信します。

リクエスト「/index.php」も、最初にプレフィックス位置「/」に一致し、次に正規表現「\。(Php)$」に一致します。したがって、後者の場所で処理され、localhost:9000でリッスンしているFastCGIサーバーに要求を渡します。fastcgi_param命令は、FastCGIパラメータSCRIPT_FILENAMEを "/data/www/index.php"に設定し、FastCGIサーバーがファイルを実行します。変数$ document_rootはroot命令の値に等しく、変数$ fastcgi_script_nameはリクエストURI( "/index.php")に等しくなります。

リクエスト「/about.html」はプレフィックスの場所「/」とのみ一致するため、その場所で処理されます。コマンド「root / data / www」を使用して、リクエストをファイル/data/www/about.htmlにマップし、ファイルをクライアントに送信します。

リクエスト "/"の処理はより複雑です。プレフィックスの位置「/」にのみ一致するため、その位置で処理されます。次に、index命令は、パラメータと「root / data / www」命令に従って、インデックスファイルの存在をテストします。ファイル/data/www/index.htmlが存在せず、ファイル/data/www/index.phpが存在する場合、命令は内部的に「/index.php」にリダイレクトし、リクエストがクライアントからの場合、nginxは場所を再度検索します送信しました。前述のように、リダイレクトされた要求は最終的にFastCGIサーバーによって処理されます。

おすすめ

転載: www.linuxidc.com/Linux/2020-04/162846.htm