Nginx Serverブロック(バーチャルホスト)

Nginxのserverブロックを設定して、単一サーバーで複数のWebサイトをホストする方法を解説。名前ベースのバーチャルホスティング、デフォルトサーバー、SNI設定に対応。

Routing

詳細な説明

Serverブロック(ApacheのバーチャルホストのNginx版)を使用すると、単一のNginxインスタンスで複数の独立したWebサイトをホストでき、各サイトに固有のドメイン名、設定、ドキュメントルートを持たせることができます。

基本的なServerブロック

各serverブロックは独自の server_nameroot ディレクトリを持つ個別のサイトを定義します:

server {
    listen 80;
    server_name example.com www.example.com;
    root /var/www/example.com/html;

    location / {
        try_files $uri $uri/ =404;
    }
}

server {
    listen 80;
    server_name blog.example.com;
    root /var/www/blog/html;

    location / {
        try_files $uri $uri/ =404;
    }
}

デフォルトサーバー

設定済みの server_name に一致しないHostヘッダーを持つリクエストが到着した場合、Nginxはデフォルトサーバーを使用します。default_server パラメータで明示的に定義できます:

server {
    listen 80 default_server;
    server_name _;
    return 444;
}

server_name _ は実際のホスト名に一致しないキャッチオールの慣例です。ステータスコード 444 はNginx固有のレスポンスで、データを送信せずに接続を即座に閉じます。ランダムなHostヘッダーでサーバーを探査する自動スキャナーのブロックに有用です。

ファイル構成

ベストプラクティスとして、各サイトの設定ファイルを分離し、2つのディレクトリに整理します:

/etc/nginx/
    nginx.conf
    sites-available/
        example.com.conf
        blog.example.com.conf
    sites-enabled/
        example.com.conf -> ../sites-available/example.com.conf

sites-enabled から sites-available へのシンボリックリンクを使用して、設定を削除せずにサイトの有効化・無効化を行います。

複数ドメインでのSSL

SNI(Server Name Indication)(TLS拡張)により、Nginxは同一IPアドレスでホストされている異なるドメインに対して異なるSSL証明書を提供できます。各serverブロックに固有の証明書と秘密鍵を指定します:

server {
    listen 443 ssl;
    server_name example.com;
    ssl_certificate /etc/ssl/example.com/fullchain.pem;
    ssl_certificate_key /etc/ssl/example.com/privkey.pem;
}

サーバー名マッチングの優先順位

Nginxは server_name を特定の順序でマッチングします:完全一致が最優先、次にアスタリスクで始まる最長ワイルドカード、次にアスタリスクで終わる最長ワイルドカード、最後に最初にマッチする正規表現です。この優先順位を理解することで、多数のドメインをホストする際の予期しないルーティング動作を防げます。

ユースケース

単一サーバーで複数のWebサイトやアプリケーションをホストし、各ドメインで独立したSSL証明書と設定を使用して異なるコンテンツを配信する必要があります。

Try It — Nginx Config Generator

フルツールを開く