前書き
Nginx Webサーバーを使用する場合、server blocks(Apacheの仮想ホストと同様)を使用して、構成の詳細をカプセル化し、単一のサーバーから複数のドメインをホストできます。
このガイドでは、Ubuntu 16.04サーバー上のNginxでサーバーブロックを構成する方法について説明します。
前提条件
このチュートリアルでは、sudo
権限を持つroot以外のユーザーを使用します。 このようなユーザーが構成されていない場合は、Ubuntu 16.04 initial server setupガイドに従って作成できます。
また、サーバーにNginxをインストールする必要があります。 次のガイドでこの手順を説明しています。
-
How To Install Nginx on Ubuntu 16.04:このガイドを使用して、Nginxを独自にセットアップします。
-
How To Install Linux, Nginx, MySQL, PHP (LEMP stack) in Ubuntu 16.04:MySQLおよびPHPと組み合わせてNginxを使用する場合は、このガイドを使用してください。
これらの要件を満たしたら、このガイドを続行できます。
設定例
デモンストレーションのために、Nginxサーバーで2つのドメインをセットアップします。 このガイドで使用するドメイン名は、example.comとtest.comです。
DigitalOceanhereを使用してドメイン名を設定する方法に関するガイドを見つけることができます。 予備のドメイン名が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/example.com/html
sudo mkdir -p /var/www/test.com/html
ディレクトリができたので、通常のユーザーアカウントにWebディレクトリの所有権を再割り当てします。 これにより、sudo
なしでそれらに書き込むことができます。
Note
[.note]#必要に応じて、www-data
ユーザーに特定のアクセスを許可するために、フォルダーのアクセス許可または所有権を再度調整する必要がある場合があります。 たとえば、動的なサイトでは多くの場合これが必要になります。 特定の許可と所有権の要件は、構成によって異なります。 使用している特定のテクノロジーの推奨事項に従ってください。
#
$USER
環境変数を使用して、現在サインインしているアカウントに所有権を割り当てることができます(root
としてログインしていないことを確認してください)。 これにより、このディレクトリのコンテンツを簡単に作成または編集できます。
sudo chown -R $USER:$USER /var/www/example.com/html
sudo chown -R $USER:$USER /var/www/test.com/html
umask
値を変更していない場合、Webルートのアクセス許可はすでに正しいはずですが、次のように入力することで確認できます。
sudo chmod -R 755 /var/www
これでディレクトリ構造が構成され、先に進むことができます。
ステップ2:各サイトのサンプルページを作成する
ディレクトリ構造が設定されたので、表示するものがあるように、各サイトのデフォルトページを作成しましょう。
最初のドメインにindex.html
ファイルを作成します。
nano /var/www/example.com/html/index.html
ファイル内に、現在アクセスしているサイトを示す非常に基本的なファイルを作成します。 これは次のようになります。
/var/www/example.com/html/index.html
Welcome to Example.com!
Success! The example.com server block is working!
完了したら、ファイルを保存して閉じます。
2番目のサイトのファイルは基本的に同じになるため、次のように2番目のドキュメントルートにコピーできます。
cp /var/www/example.com/html/index.html /var/www/test.com/html/
これで、エディターで新しいファイルを開くことができます。
nano /var/www/test.com/html/index.html
2番目のドメインを参照するように変更します。
/var/www/test.com/html/index.html
Welcome to Test.com!
Success! The test.com server block is working!
終了したら、このファイルを保存して閉じます。 これで、2つのドメインの訪問者に表示するページがいくつかできました。
ステップ3:ドメインごとにサーバーブロックファイルを作成する
提供したいコンテンツができたので、Nginxにこれを行う方法を伝えるサーバーブロックを実際に作成する必要があります。
デフォルトでは、Nginxにはdefault
と呼ばれる1つのサーバーブロックが含まれており、これを独自の構成のテンプレートとして使用できます。 最初のドメインのサーバーブロックを設計することから始め、それを2番目のドメインにコピーして必要な変更を加えます。
最初のサーバーブロックファイルを作成する
上記のように、デフォルトファイルをコピーして、最初のサーバーブロック構成ファイルを作成します。
sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/example.com
次に、作成した新しいファイルをsudo
権限でテキストエディタで開きます。
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ディレクティブを調べる必要があります。 Only one of our server blocks on the server can have the default_server
option enabled.これは、要求されたserver_name
が使用可能なサーバーブロックのいずれとも一致しない場合に、どのブロックが要求を処理するかを指定します。 訪問者はドメイン名を介してサイトにアクセスするため、これは現実のシナリオではあまり頻繁には発生しません。
listen
ディレクティブにdefault_server
オプションを含めることにより、サイトの1つを「デフォルト」として指定するか、デフォルトのサーバーブロックを有効のままにして、%のコンテンツを提供するかを選択できます。 (t2)sディレクトリ(要求されたホストが見つからない場合)。
このガイドでは、一致しないリクエストを処理するためにデフォルトのサーバーブロックをそのままにして、このサーバーブロックと次のサーバーブロックからdefault_server
を削除します。 サーバーブロックのいずれかが意味をなすものにオプションを追加することを選択できます。
/etc/nginx/sites-available/example.com
server {
listen 80;
listen [::]:80;
. . .
}
Note
[。注意]##
次のように入力すると、default_server
オプションが単一のアクティブファイルでのみ有効になっていることを確認できます。
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番目のファイルのベースとして使用できます。 それをコピーして新しいファイルを作成します。
sudo cp /etc/nginx/sites-available/example.com /etc/nginx/sites-available/test.com
エディターでsudo
特権で新しいファイルを開きます。
sudo nano /etc/nginx/sites-available/test.com
繰り返しになりますが、すでに他の場所で使用している場合は、このファイルのlisten
ディレクティブにdefault_server
オプションを使用しないでください。 2番目のドメインのドキュメントルートを指すようにroot
ディレクティブを調整し、2番目のサイトのドメイン名と一致するようにserver_name
を調整します(エイリアスを含めるようにしてください)。
終了すると、ファイルは次のようになります。
/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が読み取ります。
次のように入力して、これらのリンクを作成できます。
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/test.com /etc/nginx/sites-enabled/
これらのファイルは現在、有効なディレクトリにあります。 これで、3つのサーバーブロックが有効になり、listen
ディレクティブとserver_name
に基づいて応答するように構成されました(Nginxがこれらのディレクティブhereを処理する方法の詳細を読むことができます)。
-
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
[.note]#これらの手順では、VPSサーバーではなく、ローカルコンピューターで操作していることを確認してください。 これを行うには、rootアクセス権を持っているか、管理グループのメンバーであるか、システムファイルを編集できる必要があります。
#
自宅のMacまたはLinuxコンピューターを使用している場合は、次のように入力して必要なファイルを編集できます。
sudo nano /etc/hosts
Windowsを使用している場合は、ここでfind instructions for altering your hosts fileを実行できます。
サーバーのパブリック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:結果をテストする
すべての設定が完了したので、サーバーブロックが正しく機能していることをテストする必要があります。 ウェブブラウザでドメインにアクセスすることでそれを行うことができます:
http://example.com
次のようなページが表示されます。
2番目のドメイン名にアクセスすると、わずかに異なるサイトが表示されるはずです。
http://test.com
これらのサイトが両方とも機能する場合、2つの独立したサーバーブロックをNginxで正常に構成しました。
この時点で、テストのためにローカルコンピューターのhosts
ファイルを調整した場合は、追加した行を削除することをお勧めします。
公開サイトのサーバーにドメイン名でアクセスする必要がある場合は、サイトごとにドメイン名を購入することをお勧めします。 ここでset them up to point to your serverの方法を学ぶことができます。
結論
これで、同じサーバーからホストするドメインごとにサーバーブロックを作成できるようになります。 ハードウェアがトラフィックを処理できる限り、作成できるサーバーブロックの数に実際の制限はありません。