序章

Nginx Webサーバーを使用する場合、サーバーブロック(Apacheの仮想ホストと同様)を使用して、構成の詳細をカプセル化し、単一のサーバーで複数のドメインをホストできます。

このガイドでは、Ubuntu16.04サーバー上のNginxでサーバーブロックを構成する方法について説明します。

前提条件

このチュートリアルでは、sudo権限を持つroot以外のユーザーを使用します。 このようなユーザーが構成されていない場合は、Ubuntu16.04初期サーバーセットアップガイドに従ってユーザーを作成できます。

また、サーバーにNginxをインストールする必要があります。 次のガイドでこの手順を説明します。

これらの要件を満たしたら、このガイドを続けることができます。

構成例

デモンストレーションの目的で、Nginxサーバーで2つのドメインを設定します。 このガイドで使用するドメイン名は、example.comtest.comです。

注: DigitalOceanを使用したドメインの設定の詳細については、ドメインとDNS製品のドキュメントを参照してください。

使用する予備のドメイン名が2つない場合は、今のところプレースホルダー名を使用してください。後で、ローカルコンピューターを構成して構成をテストする方法を説明します。

ステップ1—新しいドキュメントルートディレクトリを設定する

デフォルトでは、Ubuntu16.04のNginxでは1つのサーバーブロックが有効になっています。 /var/www/htmlのディレクトリからドキュメントを提供するように構成されています。

これは単一のサイトではうまく機能しますが、複数のサイトにサービスを提供する場合は、追加のディレクトリが必要です。 /var/www/htmlディレクトリは、クライアントの要求が他のどのサイトとも一致しない場合に提供されるデフォルトのディレクトリと見なすことができます。

各サイトの/var/www内にディレクトリ構造を作成します。 実際のWebコンテンツは、これらのサイト固有のディレクトリ内のhtmlディレクトリに配置されます。 これにより、必要に応じて、htmlディレクトリの兄弟としてサイトに関連付けられた他のディレクトリを作成するための追加の柔軟性が得られます。

サイトごとにこれらのディレクトリを作成する必要があります。 -pフラグは、mkdirに、途中で必要な親ディレクトリを作成するように指示します。

  1. sudo mkdir -p /var/www/example.com/html
  2. sudo mkdir -p /var/www/test.com/html

ディレクトリができたので、Webディレクトリの所有権を通常のユーザーアカウントに再割り当てします。 これにより、sudoなしでそれらに書き込むことができます。

注:必要に応じて、www-dataユーザーに特定のアクセスを許可するために、フォルダーのアクセス許可または所有権を再度調整する必要がある場合があります。 たとえば、動的サイトではこれが必要になることがよくあります。 特定の権限と所有権の要件は、構成によって完全に異なります。 使用している特定のテクノロジーの推奨事項に従ってください。

$USER環境変数を使用して、現在サインインしているアカウントに所有権を割り当てることができます( root としてログインしていないことを確認してください)。 これにより、このディレクトリのコンテンツを簡単に作成または編集できるようになります。

  1. sudo chown -R $USER:$USER /var/www/example.com/html
  2. sudo chown -R $USER:$USER /var/www/test.com/html

umaskの値を変更していない場合は、Webルートの権限はすでに正しいはずですが、次のように入力することで確認できます。

  1. sudo chmod -R 755 /var/www

これでディレクトリ構造が構成され、次に進むことができます。

ステップ2—各サイトのサンプルページを作成する

ディレクトリ構造が設定されたので、各サイトのデフォルトページを作成して、何かを表示できるようにします。

最初のドメインにindex.htmlファイルを作成します。

  1. nano /var/www/example.com/html/index.html

ファイル内に、現在アクセスしているサイトを示す非常に基本的なファイルを作成します。 次のようになります。

/var/www/example.com/html/index.html
<html>
    <head>
        <title>Welcome to Example.com!</title>
    </head>
    <body>
        <h1>Success! The example.com server block is working!</h1>
    </body>
</html>

終了したら、ファイルを保存して閉じます。 nanoでこれを行うには、CTRL+oを押してファイルを書き出し、CTRL+xを押して終了します。

2番目のサイトのファイルは基本的に同じになるため、次のように2番目のドキュメントルートにコピーできます。

  1. cp /var/www/example.com/html/index.html /var/www/test.com/html/

これで、エディターで新しいファイルを開くことができます。

  1. nano /var/www/test.com/html/index.html

2番目のドメインを参照するように変更します。

/var/www/test.com/html/index.html
<html>
    <head>
        <title>Welcome to Test.com!</title>
    </head>
    <body>
        <h1>Success!  The test.com server block is working!</h1>
    </body>
</html>

終了したら、このファイルを保存して閉じます。 これで、2つのドメインの訪問者に表示するページがいくつかあります。

ステップ3—ドメインごとにサーバーブロックファイルを作成する

提供したいコンテンツができたので、Nginxにこれを行う方法を指示するサーバーブロックを作成する必要があります。

デフォルトでは、Nginxにはdefaultという1つのサーバーブロックが含まれており、これを独自の構成のテンプレートとして使用できます。 まず、最初のドメインのサーバーブロックを設計し、次に2番目のドメインにコピーして、必要な変更を加えます。

最初のサーバーブロックファイルの作成

上記のように、デフォルトのファイルをコピーして、最初のサーバーブロック構成ファイルを作成します。

  1. sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/example.com

次に、sudo権限を使用して、テキストエディタで作成した新しいファイルを開きます。

  1. sudo nano /etc/nginx/sites-available/example.com

コメント行を無視すると、ファイルは次のようになります。

/etc/nginx/sites-available/example.com
server {
        listen 80 default_server;
        listen [::]:80 default_server;

        root /var/www/html;
        index index.html index.htm index.nginx-debian.html;

        server_name _;

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

まず、listenディレクティブを確認する必要があります。 default_serverオプションを有効にできるのはサーバー上のサーバーブロックの1つだけです。これは、要求されたserver_nameが使用可能なサーバーブロックのいずれとも一致しない場合に、要求を処理するブロックを指定します。 訪問者はドメイン名を介してサイトにアクセスするため、これは実際のシナリオではあまり頻繁に発生しないはずです。

listenディレクティブにdefault_serverオプションを含めることにより、サイトの1つを「デフォルト」として指定するか、デフォルトのサーバーブロックを有効のままにして、次のコンテンツを提供するかを選択できます。要求されたホストが見つからない場合は、/var/www/htmlディレクトリ。

このガイドでは、一致しないリクエストを処理するためにデフォルトのサーバーブロックをそのままにしておくため、このサーバーブロックと次のサーバーブロックからdefault_serverを削除します。 どのサーバーブロックにも意味のあるオプションを追加することを選択できます。

/etc/nginx/sites-available/example.com
server {
        listen 80;
        listen [::]:80;

        . . .
}

注: default_serverオプションが有効になっていることを確認するには、次のように入力します。

  1. grep -R default_server /etc/nginx/sites-enabled/

一致するものがコメントされていないファイル(左端の列に表示)以外で見つかった場合、Nginxは無効な構成について文句を言います。

次に調整する必要があるのは、rootディレクティブで指定されたドキュメントルートです。 作成したサイトのドキュメントルートをポイントします。

/etc/nginx/sites-available/example.com
server {
        listen 80;
        listen [::]:80;

        root /var/www/example.com/html;

}

次に、最初のドメインのリクエストに一致するようにserver_nameを変更する必要があります。 一致させたいエイリアスを追加することもできます。 デモ用にwww.example.comエイリアスを追加します。

終了すると、ファイルは次のようになります。

/etc/nginx/sites-available/example.com
server {
        listen 80;
        listen [::]:80;

        root /var/www/example.com/html;
        index index.html index.htm index.nginx-debian.html;

        server_name example.com www.example.com;

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

基本構成に必要なのはこれだけです。 ファイルを保存して閉じ、終了します。

2番目のサーバーブロックファイルの作成

これで初期サーバーブロック構成ができたので、それを2番目のファイルの基礎として使用できます。 それをコピーして、新しいファイルを作成します。

  1. sudo cp /etc/nginx/sites-available/example.com /etc/nginx/sites-available/test.com

エディターでsudo特権を使用して新しいファイルを開きます。

  1. sudo nano /etc/nginx/sites-available/test.com

繰り返しになりますが、すでに他の場所で使用している場合は、このファイルのlistenディレクティブにdefault_serverオプションを使用しないようにしてください。 rootディレクティブを調整して2番目のドメインのドキュメントルートをポイントし、server_nameを調整して2番目のサイトのドメイン名と一致させます(エイリアスを含めるようにしてください)。

終了すると、ファイルは次のようになります。

/etc/nginx/sites-available/test.com
server {
        listen 80;
        listen [::]:80;

        root /var/www/test.com/html;
        index index.html index.htm index.nginx-debian.html;

        server_name test.com www.test.com;

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

終了したら、ファイルを保存して閉じます。

ステップ4—サーバーブロックを有効にしてNginxを再起動する

サーバーブロックファイルができたので、それらを有効にする必要があります。 これを行うには、これらのファイルからsites-enabledディレクトリへのシンボリックリンクを作成します。このディレクトリは、Nginxが起動時に読み取ります。

次のように入力して、これらのリンクを作成できます。

  1. sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
  2. sudo ln -s /etc/nginx/sites-available/test.com /etc/nginx/sites-enabled/

これらのファイルは、有効なディレクトリにリンクされています。 これで、3つのサーバーブロックが有効になりました。これらは、listenディレクティブとserver_nameに基づいて応答するように構成されています(Nginxがこれらのディレクティブを処理する方法について詳しくは、こちらをご覧ください)。 :

  • example.comexample.comおよびwww.example.comのリクエストに応答します
  • test.comtest.comおよびwww.test.comのリクエストに応答します
  • default:他の2つのブロックと一致しないポート80の要求に応答します。

サーバー名を追加することで発生する可能性のあるハッシュバケットメモリの問題を回避するために、/etc/nginx/nginx.confファイル内の単一の値も調整します。 今すぐファイルを開きます。

  1. sudo nano /etc/nginx/nginx.conf

ファイル内で、server_names_hash_bucket_sizeディレクティブを見つけます。 #記号を削除して、行のコメントを解除します。

/etc/nginx/nginx.conf
http {
    . . .

    server_names_hash_bucket_size 64;

    . . .
}

終了したら、ファイルを保存して閉じます。

次に、テストして、Nginxファイルのいずれにも構文エラーがないことを確認します。

  1. sudo nginx -t

問題が見つからなかった場合は、Nginxを再起動して変更を有効にします。

  1. sudo systemctl restart nginx

これで、Nginxは両方のドメイン名を提供するはずです。

ステップ5—テスト用にローカルホストファイルを変更する(オプション)

所有しているドメイン名を使用しておらず、代わりにプレースホルダー値を使用している場合は、ローカルコンピューターの構成を変更して、Nginxサーバーブロック構成を一時的にテストできるようにすることができます。

これにより、他の訪問者がサイトを正しく表示することはできなくなりますが、各サイトに個別にアクセスして構成をテストすることができます。 これは、ドメイン名を解決するために通常DNSに送信される要求をインターセプトすることによって機能します。 代わりに、ドメイン名を要求するときにローカルコンピューターがアクセスするIPアドレスを設定できます。

注:これらの手順では、リモートサーバーではなく、ローカルコンピューターで操作していることを確認してください。 これを行うには、rootアクセス権を持っているか、管理グループのメンバーであるか、システムファイルを編集できる必要があります。

自宅でMacまたはLinuxコンピュータを使用している場合は、次のように入力して必要なファイルを編集できます。

  1. sudo nano /etc/hosts

Windowsを使用している場合は、ここでhostsファイルを変更する手順を見つけることができます。

サーバーのパブリックIPアドレスとサーバーにルーティングするドメインを知っている必要があります。 サーバーのパブリックIPアドレスが203.0.113.5であるとすると、ファイルに追加する行は次のようになります。

/ etc / hosts
127.0.0.1   localhost
. . .

203.0.113.5 example.com www.example.com
203.0.113.5 test.com www.test.com

これにより、example.comおよびtest.comのリクエストがインターセプトされ、サーバーに送信されます。これは、使用しているドメインを実際に所有していない場合に必要なものです。

終了したら、ファイルを保存して閉じます。

ステップ6—結果をテストする

これですべての設定が完了したので、サーバーブロックが正しく機能していることをテストする必要があります。 Webブラウザのドメインにアクセスしてこれを行うことができます。

http://example.com

次のようなページが表示されます。

Nginx first server block

2番目のドメイン名にアクセスすると、わずかに異なるサイトが表示されます。

http://test.com

Nginx second server block

これらのサイトの両方が機能する場合は、Nginxを使用して2つの独立したサーバーブロックを正常に構成しています。

この時点で、テストのためにローカルコンピューターでhostsファイルを調整した場合は、追加した行を削除することをお勧めします。

公開サイトのサーバーへのドメイン名アクセスが必要な場合は、各サイトのドメイン名を購入することをお勧めします。

結論

これで、同じサーバーからホストするドメインごとにサーバーブロックを作成できるようになります。 ハードウェアがトラフィックを処理できる限り、作成できるサーバーブロックの数に実際の制限はありません。