Ubuntu 16.04でNginxサーバーブロック(仮想ホスト)を設定する方法
序章
Nginx Webサーバーを使用する場合、サーバーブロック(Apacheの仮想ホストと同様)を使用して、構成の詳細をカプセル化し、単一のサーバーで複数のドメインをホストできます。
このガイドでは、Ubuntu16.04サーバー上のNginxでサーバーブロックを構成する方法について説明します。
前提条件
このチュートリアルでは、sudo
権限を持つroot以外のユーザーを使用します。 このようなユーザーが構成されていない場合は、Ubuntu16.04初期サーバーセットアップガイドに従ってユーザーを作成できます。
また、サーバーにNginxをインストールする必要があります。 次のガイドでこの手順を説明します。
- Ubuntu 16.04にNginxをインストールする方法:このガイドを使用して、Nginxを独自にセットアップします。
- Ubuntu 16.04にLinux、Nginx、MySQL、PHP(LEMPスタック)をインストールする方法:NginxをMySQLおよびPHPと組み合わせて使用する場合は、このガイドを使用してください。
これらの要件を満たしたら、このガイドを続けることができます。
構成例
デモンストレーションの目的で、Nginxサーバーで2つのドメインを設定します。 このガイドで使用するドメイン名は、example.comとtest.comです。
注: DigitalOceanを使用したドメインの設定の詳細については、ドメインとDNS製品のドキュメントを参照してください。
使用する予備のドメイン名が2つない場合は、今のところプレースホルダー名を使用してください。後で、ローカルコンピューターを構成して構成をテストする方法を説明します。
ステップ1—新しいドキュメントルートディレクトリを設定する
デフォルトでは、Ubuntu16.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
なしでそれらに書き込むことができます。
注:必要に応じて、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
ファイル内に、現在アクセスしているサイトを示す非常に基本的なファイルを作成します。 次のようになります。
<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番目のドキュメントルートにコピーできます。
- cp /var/www/example.com/html/index.html /var/www/test.com/html/
これで、エディターで新しいファイルを開くことができます。
- nano /var/www/test.com/html/index.html
2番目のドメインを参照するように変更します。
<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番目のドメインにコピーして、必要な変更を加えます。
最初のサーバーブロックファイルの作成
上記のように、デフォルトのファイルをコピーして、最初のサーバーブロック構成ファイルを作成します。
- sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/example.com
次に、sudo
権限を使用して、テキストエディタで作成した新しいファイルを開きます。
- sudo nano /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
を削除します。 どのサーバーブロックにも意味のあるオプションを追加することを選択できます。
server {
listen 80;
listen [::]:80;
. . .
}
注: default_server
オプションが有効になっていることを確認するには、次のように入力します。
- grep -R default_server /etc/nginx/sites-enabled/
一致するものがコメントされていないファイル(左端の列に表示)以外で見つかった場合、Nginxは無効な構成について文句を言います。
次に調整する必要があるのは、root
ディレクティブで指定されたドキュメントルートです。 作成したサイトのドキュメントルートをポイントします。
server {
listen 80;
listen [::]:80;
root /var/www/example.com/html;
}
次に、最初のドメインのリクエストに一致するようにserver_name
を変更する必要があります。 一致させたいエイリアスを追加することもできます。 デモ用にwww.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
オプションを使用しないようにしてください。 root
ディレクティブを調整して2番目のドメインのドキュメントルートをポイントし、server_name
を調整して2番目のサイトのドメイン名と一致させます(エイリアスを含めるようにしてください)。
終了すると、ファイルは次のようになります。
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がこれらのディレクティブを処理する方法について詳しくは、こちらをご覧ください)。 :
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
ディレクティブを見つけます。 #
記号を削除して、行のコメントを解除します。
http {
. . .
server_names_hash_bucket_size 64;
. . .
}
終了したら、ファイルを保存して閉じます。
次に、テストして、Nginxファイルのいずれにも構文エラーがないことを確認します。
- sudo nginx -t
問題が見つからなかった場合は、Nginxを再起動して変更を有効にします。
- sudo systemctl restart nginx
これで、Nginxは両方のドメイン名を提供するはずです。
ステップ5—テスト用にローカルホストファイルを変更する(オプション)
所有しているドメイン名を使用しておらず、代わりにプレースホルダー値を使用している場合は、ローカルコンピューターの構成を変更して、Nginxサーバーブロック構成を一時的にテストできるようにすることができます。
これにより、他の訪問者がサイトを正しく表示することはできなくなりますが、各サイトに個別にアクセスして構成をテストすることができます。 これは、ドメイン名を解決するために通常DNSに送信される要求をインターセプトすることによって機能します。 代わりに、ドメイン名を要求するときにローカルコンピューターがアクセスするIPアドレスを設定できます。
注:これらの手順では、リモートサーバーではなく、ローカルコンピューターで操作していることを確認してください。 これを行うには、rootアクセス権を持っているか、管理グループのメンバーであるか、システムファイルを編集できる必要があります。
自宅でMacまたはLinuxコンピュータを使用している場合は、次のように入力して必要なファイルを編集できます。
- sudo nano /etc/hosts
Windowsを使用している場合は、ここでhostsファイルを変更する手順を見つけることができます。
サーバーのパブリックIPアドレスとサーバーにルーティングするドメインを知っている必要があります。 サーバーのパブリックIPアドレスが203.0.113.5
であるとすると、ファイルに追加する行は次のようになります。
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
次のようなページが表示されます。
2番目のドメイン名にアクセスすると、わずかに異なるサイトが表示されます。
http://test.com
これらのサイトの両方が機能する場合は、Nginxを使用して2つの独立したサーバーブロックを正常に構成しています。
この時点で、テストのためにローカルコンピューターでhosts
ファイルを調整した場合は、追加した行を削除することをお勧めします。
公開サイトのサーバーへのドメイン名アクセスが必要な場合は、各サイトのドメイン名を購入することをお勧めします。
結論
これで、同じサーバーからホストするドメインごとにサーバーブロックを作成できるようになります。 ハードウェアがトラフィックを処理できる限り、作成できるサーバーブロックの数に実際の制限はありません。