Nginx-4.Nginxがリクエストをどのように処理するか

3171 ワード

テキスト
サーバベースnameの仮想サイト
Nginxは、まず、要求を処理するためにどのserverを使用するかを決定する必要がある.簡単な例を挙げると、次のserverがあります.
  • 最初の80ポートをリスニングorgサイト
  • server {
      listen 80;
      server_name example.org www.example.org;
      ...
    }
    
  • 2 2 2番目、80ポートを傍受し、netサイト
  • server {
      listen 80;
      server_name example.net www.example.net;
      ...
    }
    
  • 第3、傍受80ポート、comサイト
  • server {
      listen 80;
      server_name example.com www.example.com;
    }
    

    ポートが同じであるため、このNginxは、要求ヘッダのHostと、どのserver_nameが一致するかを検査する.来たHostと3つが一致しない場合、または要求にHostヘッダがない場合、nginxはデフォルトのserverを使用します.指定されていないのが一番です.default_serverというパラメータで指定することもできます.このパラメータはlisten命令に属し、server命令ブロックではない.
    server {
      listen 80 default_server;
      server_name example.net www.example.net;
      ...
    }
    

    未定義ホストの処理要求を拒否する方法
    1つのリクエストにHostがない場合、このリクエストは以下のように定義できます.
    server {
      listen 80;
      server_name "";
      return 444;
    }
    

    これはserver_nameは、ホストのない要求に一致する空の文字列として定義され、444ステータスコードが返される.0.8.48以前のバージョン、server_nameは、コンピュータのhostname値をデフォルトで使用します.
    server_nameとIPが共存する仮想サイト
    比較的複雑な例を見てみましょう.listen命令はipとポートを使用し、異なるserver_nameを定義しています.
    server {
      listen 192.168.1.1:80;
      server_name example.org www.example.org;#org   
      ...
    }
    server {
      listen 192.168.1.1:80; #default_server
      server_name example.net www.example.net;#net  
      ...
    }
    server {
      listen 192.168.1.2:80;#.2    #default_server
      server_name example.com www.example.com;
      ...
    }
    

    これ、Nginxはまず、要求されたipとポートがどちらに一致するかをチェックします.その後、Hostヘッダで使用するサーバを決定する.Hostはブラウザのアドレスバーに入力されたアドレスです.192.168があると仮定します.1.1:80来た対www.example.comのリクエストは、いずれかに一致していないため、最初のリクエストが使用されます.また、listenの後にdefault_serverを指定することで変更することもできます.
    簡単なphpサイト構成
    Nginxがphpサイトで要求されたファイルアドレスをどのように決定するかを見てみましょう.
    server {
        listen      80;
        server_name example.org www.example.org;
        root        /data/www;
    
        location / {
            index   index.html index.php;
        }
    
        location ~* \.(gif|jpg|png)$ {
            expires 30d;
        }
    
        location ~ \.php$ {
            fastcgi_pass  localhost:9000;
            fastcgi_param SCRIPT_FILENAME
                          $document_root$fastcgi_script_name;
            include       fastcgi_params;
        }
    }
    

    最初のlocationは/で、すべてに一致するので、優先度が最も低く、Nginxは最も正確なものを探します.Nginxはurl部分のみをチェックし、アドレスの後ろのパラメータは考慮しません.パラメータの順序が定まらないからです.
    簡単な例をいくつか挙げます.
  • /logo.gifは、最初のlocationと一致し、その後も2番目に一致するので、2番目を使用します.root命令により、具体的には/data/www/logo.gifファイルが得られる.
  • /index.php、同様に、最後のlocation命令ブロックを用いる.fastcgi_param指令吧SCRIPT_FILENAMEは、後の変数、$document_に設定されます.rootはrootの/data/www,$fastcgi_script_nameはindexです.php、そしてcgi server 9000は/data/www/index.phpというファイルを処理します.
  • /about.htmlで、最初のlocationのみが一致します.
  • /は、1つ目のみ一致するので、indexを要求する.htmlファイルは、存在しない場合はindexに内部リダイレクトされます.php、そして最後のlocationまで処理します.