前書き

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

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

前提条件

このチュートリアルでは、 `+ sudo +`権限を持つ非ルートユーザーを使用します。 このようなユーザーが設定されていない場合は、https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-16-04 [Ubuntu 16.04 initial serverセットアップ]ガイド。

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

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

設定例

デモンストレーションのために、Nginxサーバーで2つのドメインをセットアップします。 このガイドで使用するドメイン名は、* example.com および test.com *です。

DigitalOcean https://www.digitalocean.com/community/articles/how-to-set-up-a-host-name-with-digitalocean [こちら]でドメイン名を設定する方法に関するガイドを見つけることができます。 予備のドメイン名が2つない場合は、ここではダミー名を使用してください。構成をテストするためにローカルコンピューターを構成する方法については後で説明します。

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

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

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

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

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

sudo mkdir -p /var/www//html
sudo mkdir -p /var/www//html

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

Note

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

sudo chown -R $USER:$USER /var/www//html
sudo chown -R $USER:$USER /var/www//html

`+ umask +`の値を変更していない場合、Webルートのパーミッションはすでに正しいはずですが、次のように入力することで確認できます。

sudo chmod -R 755 /var/www

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

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

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

最初のドメインで `+ index.html`ファイルを作成します:

nano /var/www//html/index.html

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

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

<html>
   <head>
       <title>Welcome to !</title>
   </head>
   <body>
       <h1>Success!  The  server block is working!</h1>
   </body>
</html>

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

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

cp /var/www//html/index.html /var/www//html/

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

nano /var/www//html/index.html

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

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

<html>
   <head>
       <title>Welcome to !</title>
   </head>
   <body>
       <h1>Success!  The  server block is working!</h1>
   </body>
</html>

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

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

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

デフォルトでは、Nginxには「+ default +」と呼ばれる1つのサーバーブロックが含まれており、独自の設定のテンプレートとして使用できます。 最初のドメインのサーバーブロックを設計することから始め、それを2番目のドメインにコピーして必要な変更を加えます。

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

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

sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/

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

sudo nano /etc/nginx/sites-available/

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

/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ディレクティブを調べる必要があります。 *サーバー上のサーバーブロックの1つのみが `+ default_server `オプションを有効にできます。*これは、リクエストされた ` server_name +`が利用可能なサーバーブロックのいずれとも一致しない場合にリクエストを処理するブロックを指定します。 訪問者はドメイン名を介してサイトにアクセスするため、これは実際のシナリオではあまり頻繁には発生しません。

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

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

/etc/nginx/sites-available/example.com

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

       . . .
}

Note

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

/etc/nginx/sites-available/example.com

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

       root /var/www//html;

}

次に、 `+ server_name `を変更して、最初のドメインのリクエストに一致させる必要があります。 さらに、一致させたいエイリアスを追加できます。 デモンストレーションするために、 ` www.example.com +`エイリアスを追加します。

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

/etc/nginx/sites-available/example.com

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

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

       server_name  www.;

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

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

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

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

sudo cp /etc/nginx/sites-available/ /etc/nginx/sites-available/

エディターで「+ sudo +」権限で新しいファイルを開きます。

sudo nano /etc/nginx/sites-available/

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

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

/etc/nginx/sites-available/test.com

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

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

       server_name  www.;

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

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

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

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

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

sudo ln -s /etc/nginx/sites-available/ /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/ /etc/nginx/sites-enabled/

これらのファイルは現在、有効なディレクトリにあります。 現在、3つのサーバーブロックが有効になっています。これらは、 `+ listen `ディレクティブと ` server_name +`に基づいて応答するように構成されています(Nginxがこれらのディレクティブを処理する方法の詳細については、https://www.digitalocean.com/community/ tutorials / understanding-nginx-server-and-location-block-selection-algorithms [こちら]):

  • + example.com +: `+ example.com `および ` www.example.com +`のリクエストに応答します

  • + test.com +: `+ test.com `および ` www.test.com +`のリクエストに応答します

  • + default +:他の2つのブロックと一致しないポート80の要求に応答します。

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

sudo nano /etc/nginx/nginx.conf

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

/etc/nginx/nginx.conf

http {
   . . .

   server_names_hash_bucket_size 64;

   . . .
}

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

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

sudo nginx -t

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

sudo systemctl restart nginx

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

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

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

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

Note

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

sudo nano /etc/hosts

Windowsを使用している場合は、http://www.thewindowsclub.com/hosts-file-in-windows [hostsファイルを変更する手順を参照]からここにアクセスできます。

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

/ etc / hosts

127.0.0.1   localhost
. . .

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

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

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

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

http://

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

image:https://assets.digitalocean.com/articles/nginx_server_block_1404/first_block.png [Nginx最初のサーバーブロック]

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

http://

image:https://assets.digitalocean.com/articles/nginx_server_block_1404/second_block.png [Nginx 2番目のサーバーブロック]

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

この時点で、テストするためにローカルコンピューター上の `+ hosts +`ファイルを調整した場合、おそらく追加した行を削除する必要があります。

公開サイトのサーバーにドメイン名でアクセスする必要がある場合は、各サイトのドメイン名を購入することをお勧めします。 https://www.digitalocean.com/community/articles/how-to-set-up-a-host-name-with-digitalocean [サーバーを指すように設定]の方法については、こちらをご覧ください。

結論

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