リクエストを待ち受けるIPアドレスとポートの設定(listenディレクティブ)

広告

Nginx の listen ディレクティブには、仮想サーバ(server コンテキスト)がリクエストを待ち受ける IP アドレス と ポート番号 を指定します。クライアントからリクエストが届くとまずこの設定を確認し、どの仮想サーバで対象となるのかを確認します。ここでは Nginx の listen ディレクティブの使い方について解説します。

listenディレクティブの書式

Nginx の listen ディレクティブには、仮想サーバがリクエストを受け付ける IP アドレスとポート番号を設定します。 listen ディレクティブの書式は次の通りです。

Syntax:   listen address[:port]
          listen port
          listen unix:path
Default:  listen *:80 | *:8000;
Context:  server

※ 非常にオプションが多いため、ここではよく利用するもののみをあとで解説します。

※ デフォルトについて、 Nginx を root ユーザーで実行している場合はポート番号 80 番がデフォルトとなり、一般ユーザーで実行している場合はポート番号 8000 番がデフォルトとなります。

listen ディレクティブは server コンテキストに記述します。値として仮想サーバがリクエストを受け付ける IP アドレスとポート番号を指定します。

※ ここで指定するのはクライアントの IP アドレスではなく、サーバ側のインターフェースの IP アドレスです。インターフェースとは、サーバがネットワークと接続するための入口のことで、1 つだけの場合もあれば複数ある場合もあります。

設定する値は、 IP アドレスだけ、ポート番号だけ、 IP アドレスとポート番号の組み合わせ、などを指定できます。

あとで詳しく解説しますが、クライアントからリクエストが届いたときに、まず最初に仮想サーバに設定されている listen ディレクティブの値をチェックして、対象となる仮想サーバの候補を選びます。そのあとで候補の中から server_name ディレクティブの値をチェックして使用する仮想サーバを決定します。

listenディレクティブの設定例

listen ディレクティブの設定例をいくつか見ていきます。

server {
  listen 80;
}

(IPv4 の IP アドレスを持つ)すべてのインターフェースでポート番号が 80 番のリクエストを受け付けます。

server {
  listen *:80;
}

server {
  listen 0.0.0.0:80;
}

(IPv4 の IP アドレスを持つ)すべてのインターフェースでポート番号が 80 番のリクエストを受け付けます。 listen 80; と同じです。

server {
  listen [::]:80;
}

IPv6 の IP アドレスを持つすべてのインターフェースからのポート番号が 80 番のリクエストを受け付けます。

server {
  listen 80;
  listen [::]:80;
}

IPv4 と IPv6 の両方を待ち受ける場合は、両方指定してください。

server {
  listen 192.168.0.1:80;
}

IP アドレスが 192.168.0.1 のインターフェースからで、ポート番号が 80 番のリクエストを受け付けます。

server {
  listen 127.0.0.1:80;
}

サーバが動作している同じマシンからでポート番号が 80 番のリクエストを受け付けます。外部ネットワークからのアクセスはできません。ちなみに 127.0.0.1 はローカルループバックアドレスと呼ばれるもので、自分自身を指す特別な IPv4 のアドレスです。

server {
  listen 443 ssl;
}

ポート番号が 443 番のリクエストを受け付けます。 HTTPS 通信を行う場合に指定します。この場合はオプションで ssl を指定します。

server {
  listen 443 ssl http2;
}

HTTP/2 プロトコルを有効にする場合はオプションで http2 を指定します。 HTTP/2 は一般的に HTTPS で利用されるため、ポート番号には 443 を指定し、オプションで ssl も併せて指定します。

default_serverの設定

Nginx がリクエストを受け取ると、まず IP アドレスとポート番号が一致する listen が設定されている仮想サーバ(serverコンテキスト)を探します。複数見つかる場合もあります。その中から server_name で設定されているサーバー名に一致するものを選択します。このとき、サーバー名に一致するものがない場合はデフォルトの仮想サーバが使用されます。

デフォルトの仮想サーバは IP アドレスとポート番号が一致する仮想サーバの中で、一番上に記述されているものです。

次の例を見てください。

http {
  server {
    listen 192.168.0.1:80;
    server_name  example.jp;
  }

  server {
    listen 80;
    server_name  example.com;
  }

  server {
    listen 80;
    server_name  example.org;
  }
}

3 つの仮想サーバが記述されています。(インターフェースの) IP アドレスが 192.168.0.1 でポート番号が 80 番のリクエストがあった場合、 3 つの仮想サーバが候補となります。このとき、リクエストのホスト名が server_name と一致するものがなければ、一番上の仮想サーバが使用されます。

次に IP アドレスが 192.168.0.2 でポート番号が 80 番のリクエストがあった場合、 2 番目と 3 番目の仮想サーバが候補となります。このとき、リクエストのホスト名が server_name と一致するものがなければ、より上に記述されている 2 番目の仮想サーバが使用されます。

このようにまずリクエストが listen と一致する仮想サーバを候補として集めます。そしてホスト名が一致する仮想サーバがなかった場合に一番上の仮想サーバがデフォルトとなりますが、一番上の仮想サーバではなく特定の仮想サーバをデフォルトに設定したい場合は仮想サーバの listen ディレクティブに default_server オプションを記述してください。

listen address[:port] default_server
listen port default_server

先ほどの例で 3 番目の仮想サーバをデフォルトにしたい場合は、次のように記述します。

http {
  server {
    listen 192.168.0.1:80;
    server_name  example.jp;
  }

  server {
    listen 80;
    server_name  example.com;
  }

  server {
    listen 80 default_server;
    server_name  example.org;
  }
}

なお default_server が指定されていても、リクエストが listen で設定されている IP アドレスやポート番号と一致しなければ選ばれることはありません。

-- --

Nginx の listen ディレクティブの使い方について解説しました。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。