NGINXサブドメインまたは複数のドメインを提供する方法

単一の公開IPアドレスを持つサーバーで複数のドメインまたはサブドメインをホストする必要がありますか?どうしますか?このシナリオは初心者にとっては混乱するかもしれません。しかし心配しないでください、このチュートリアルでそれをカバーしますので、単一のIPアドレスでNGINXサブドメインと複数のドメインを提供できます。

このチュートリアルでは、単一のIPアドレスを持つサーバーで効果的にNGINXサブドメインまたは複数のドメインを提供する方法を学びます!

準備ができたら、始めましょう!

前提条件

このチュートリアルには実践的なデモが付属していますが、多くの前提条件は必要ありません。Ubuntu Server LTSがSSH有効化され、NGINXがインストールされているものと想定します。このチュートリアルのデモはUbuntu Server LTS 20.04.1で行われます。

DNSレコードの設定

NGINXのサブドメインまたは複数のドメインを提供するには、DNSコントロールパネルにAレコードを追加する必要があります。Aレコードは、すべてのドメインとサブドメインを単一のIPアドレスにバインドし、Webブラウザがウェブサイトを見つけることができるようにします。

1. お気に入りのウェブブラウザを起動し、DNSコントロールパネルにログインします。

2. レコードの追加をクリックして、Aレコードの追加を開始します。ウェブブラウザは、ドメインとサブドメインのDNS設定を構成するページにリダイレクトされます。

Adding an A Record

以下のようにDNS設定を構成します:

タイプフィールドで A レコードを選択します。

ホストフィールドに @ を入力し、フィールドにサーバーのIPアドレスを入力します。

TTL フィールドで適切な値を選択し、確認 ボタンをクリックして設定を保存します。

他のサブドメインに対しても同じ手順を繰り返します。

Configuring DNS settings for Domain and Subdomains The final DNS Settings page looks like the one below.

最終的な DNS設定 ページは以下のようになります。

Viewing DNS Settings Page

DNSレコードの制御パネルの機能やデザインは異なる場合がありますが、原則はすべてに適用されます。

NGINXドメインとサブドメインのウェブディレクトリの設定

ドメインとサブドメインのAレコードを追加したので、それぞれのウェブディレクトリを設定する時がきました。NGINXにはデフォルトの仮想ホストファイルがあり、/usr/share/nginx/htmlにあるウェブディレクトリを提供するように設定されています。

NGINXのデフォルトドキュメントルート(/var/www/html)内に、各ドメイン用に別々のウェブディレクトリを作成します。

1. まず、ターミナルを開き、以下のコマンドを実行して、全てのドメインとサブドメインのためのウェブディレクトリを作成してください。これにより、各ウェブサイトのファイルが分離・整理・隔離されます。

sudo mkdir /var/www/html/awstutorial.net
sudo mkdir /var/www/html/web1.awstutorial.net
sudo mkdir /var/www/html/web2.awstutorial.net

2. 次に、以下のコマンドを実行して、ステップ1で作成した各ディレクトリの所有権を再帰的に(-Rwww-dataユーザーとグループに変更してください。NGINXはwww-dataユーザーとして実行されるため、各ディレクトリの所有権をwww-dataユーザーとグループに変更します。

sudo chown -R www-data:www-data /var/www/html/awstutorial.net
sudo chown -R www-data:www-data /var/www/html/web1.awstutorial.net
sudo chown -R www-data:www-data /var/www/html/web2.awstutorial.net

3. 好みのコードエディタでindex.htmlという名前のファイルを作成し、以下のコードをindex.htmlファイルにコピーして貼り付けてください。ファイルを/var/www/html/awstutorial.netという各ドメインの主要なウェブディレクトリ内に保存してください。

以下のHTMLコードは、index.htmlファイルがウェブブラウザで開かれたときに「おめでとうございます!awstutorial.netのウェブサイトが動作しています!」というメッセージを表示します。

<html>
	<head>
	  <title>Welcome to awstutorial.net!</title>
  </head>
	  <body>
	    <h1>Congratulations! The awstutorial.net website is working!</h1>
    </body>
</html>

4. 最後に、同じようにindex.html/var/www/html/web1.awstutorial.netおよび/var/www/html/web2.awstutorial.netディレクトリに作成してください。ただし、各index.htmlのコード内のawstutorial.netweb1.awstutorial.netおよびweb2.awstutorial.netに置き換えてください。

NGINXのドメインとサブドメインのための仮想ホストの設定

既に、ドメインとサブドメインのためのindex.htmlページがNGINXウェブサーバーを通じて提供されるようになっています。次のステップでは、各ドメインのためにNGINXの仮想ホスト設定ファイルを作成し、HTMLページを提供します。

1. 好みのコードエディタでawstutorial.netという名前のNGINX仮想ホスト設定ファイルを作成し、以下のコードをそのファイルにコピー/貼り付けします。ファイルを/etc/nginx/sites-available/ディレクトリに保存してください。

以下のコードは、サーバーの動作を制御します。ユーザーがドメインにアクセスしようとした場合のサーバー名やインデックス(ホーム)ページなどです。

server {
        # TCPポート80にバインドします。
        listen 80; 

				# ファイルを検索するためのルートディレクトリ
        root /var/www/html/awstutorial.net;
				# インデックスページとして使用するファイルを定義
        index index.html index.htm;
				# ドメインまたはサブドメイン名を定義します。
        # サーバーブロックでserver_nameが定義されていない場合、
				# Nginxは「空の」名前を使用します
        server_name awstutorial.net;

        location / {
            # サーバーが追跡不可能なファイルやディレクトリへのリクエストを受信した場合は、
						# 404エラーを返します。
            try_files $uri $uri/ =404;
        }
    }

2. 次に、以下のnginxコマンドを実行して、NGINXの設定ファイルに構文エラーがないかを確認します(-t)。

sudo nginx -t

NGINXの設定ファイルに構文エラーがない場合、以下の出力が表示されます。

Verifying NGINX configuration file

3. 次に、以下のコマンドを実行して、/etc/nginx/sites-availableから/etc/nginx/sites-enabled/ディレクトリへのシンボリックリンク(ln -s)を作成します。このコマンドにより、awstutorial.netの仮想ホスト構成ファイルが有効になります。

sudo ln -s /etc/nginx/sites-available/awstutorial.net /etc/nginx/sites-enabled/

sites-availableとsites-enabledの形式は、NGINX Ubuntuインストール内で標準的ですが、他のディストリビューションでは異なる標準が使用される場合があります。

4. 1から3までの手順を繰り返して、NGINXの仮想ホスト構成ファイルweb1.awstutorial.netweb2.awstutorial.netを作成します。

各NGINXの仮想ホスト構成ファイルの次の行を変更してください:

  • root /var/www/html/awstutorial.netをそれぞれのサブドメインのウェブルートディレクトリに置き換えます(root /var/www/html/web1.awstutorial.netおよびroot /var/www/html/web2.awstutorial.net)。
  • server_name awstutorial.netを各サブドメインの名前に置き換えます(server_name web1.awstutorial.netおよびserver_name web2.awstutorial.net)。

5. さて、ステップ3と同様に、以下のsudo lnコマンドを実行して仮想ホスト構成ファイルを有効にします。

# web1.awstutorial.net NGINXの仮想ホスト構成ファイルを有効にします
sudo ln -s /etc/nginx/sites-available/web1.awstutorial.net /etc/nginx/sites-enabled/
# web2.awstutorial.net NGINXの仮想ホスト構成ファイルを有効にします
sudo ln -s /etc/nginx/sites-available/web2.awstutorial.net /etc/nginx/sites-enabled/

6. 以下のsystemctlコマンドを実行してNGINX (restart nginx) サービスを再起動し、すべての設定変更を適用します。

sudo systemctl restart nginx

7. 最後に、ブラウザでドメインとサブドメインのURLに移動して、ウェブサイトが正常に動作するかテストします。

ドメインとサブドメインが読み込まれると、以下のようなメッセージが表示されます。

Verifying websites are loading through the web browser.

NGINXドメインとサブドメインのHTTPS設定

HTTPプロトコルでNGINXドメインとサブドメインを正常に設定してテストしましたが、ドメインとサブドメインの接続をHTTPSで保護する必要があります。どうやって? Let’s Encrypt SSLのような証明機関から取得する証明書を使用します。

1. 最初に、以下のコマンドを実行してCertbotソフトウェアパッケージをインストールします(apt-get install certbot)。Certbotを使用してドメインとサブドメインのためのSSL証明書をダウンロードできます。

sudo apt-get install certbot python3-certbot-nginx -y

2. 次に、以下のcertbot コマンドを実行して、ドメイン(-d awstutorial.net)のSSL証明書(certonly)をダウンロードします。利用規約に同意すること(—agree-tos)と、メールアドレスを入力すること(—email)に注意してください。

sudo certbot certonly --agree-tos --email [email protected] -d awstutorial.net

メールアドレスを自分のものに置き換えてください。

3. 以下に示すように、NGINX Webサーバープラグイン (nginx)を選択するために‘1’を入力し、ACME CAで認証します。

Selecting Plugin to Authenticate with ACME CA

NGINX Webサーバープラグインを選択すると、ドメイン(awstutorial.net)のSSL証明書のダウンロード進捗状況が表示されます。

デフォルトでは、Let’s EncryptのSSL証明書は/etc/letsencrypt/live/ディレクトリに保存されます。

Showing Download Progress of the SSL Certificate

4. ステップ2で行ったのと同様に、以下のコマンドを実行して残りのサブドメイン(web1.awstutorial.netweb2.awstutorial.net)のSSL証明書をダウンロードします。

sudo certbot certonly --agree-tos --email [email protected] -d web1.awstutorial.net
sudo certbot certonly --agree-tos --email [email protected] -d web2.awstutorial.net

5. 最後に、以下のlsコマンドを実行して、/etc/letsencrypt/live/ディレクトリ内の名前にawstutorial.netを含む(*)すべてのSSL証明書を一覧表示します。これにより、SSL証明書が存在することを確認できます。

ls /etc/letsencrypt/live/*awstutorial.net/

以下に、ドメインとサブドメインのSSL証明書が表示されます。

Showing SSL certificate for all domains.

NGINX仮想ホストの設定にSSL証明書を使用する

この時点では、すでにSSL証明書を手に入れています。しかし、ドメインとサブドメインを安全にするためにそれらをどのように使用するのでしょうか?それぞれのNGINX仮想ホスト構成ファイルのserverブロック内で証明書のパスを定義します。

1. 好きなコードエディタで、/etc/nginx/sites-available/ディレクトリにあるawstutorial.netのNGINX仮想ホスト構成ファイルを開きます。

2. 以下のコードでファイルの内容を置き換えます。SSL証明書のパスとSSLプロトコル(Path of the SSL certificateの下)を定義します。

server {
	     # TCPポート80にバインドします。
       listen 80;
	     # ドメインまたはサブドメインの名前を定義します。
       # serverブロック内でserver_nameが定義されていない場合、
	     # Nginxは「empty」の名前を使用します。
       server_name awstutorial.net;
	     # トラフィックを対応する
	     # HTTPSサーバーブロックに301のステータスコードでリダイレクトします。
       return 301 https://$host$request_uri;
       }

server {
        # TCPポート443にバインドし、SSLを有効にします。
        listen 443 SSL;
	      # ファイルを検索するためのルートディレクトリ 
	      root /var/www/html/awstutorial.net; 
	      # ドメインまたはサブドメインの名前を定義します。
        # serverブロック内でserver_nameが定義されていない場合、
	      # Nginxは「empty」の名前を使用します。
        server_name awstutorial.net;

	      # SSL証明書のパス
        ssl_certificate /etc/letsencrypt/live/awstutorial.net/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/awstutorial.net/privkey.pem;
	      # certbotコマンドで生成されたファイルを使用します。
        include /etc/letsencrypt/options-ssl-nginx.conf;
	      # dhparam.pemファイルのパスを定義します。
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

        location / {
	      # サーバーが追跡できないファイルやディレクトリのリクエストを受信した場合、404エラーを返します。
	      # 
        try_files $uri $uri/ =404;
        }

    }

3. 残りの仮想ホスト構成ファイル(web1.awstutorial.netおよびweb2.awstutorial.net)に対して同じ手順(ステップ1から2)を繰り返します。ただし、SSL証明書のパスはPath of the SSL certificateの下にあるサブドメインの証明書のパスに置き換えてください。

4. 構成の変更を適用するために、以下のsystemctlコマンドを再実行してNGINXサービスを再起動します。

sudo systemctl restart nginx

5. 最後に、ウェブブラウザでドメインとサブドメインのURLに移動します。ただし、今回はHTTPプロトコルではなく、HTTPSを使用して動作するか確認します。

以下のアドレスバーには、SSL証明書で保護されたウェブサイトを示す南京錠のアイコンが表示されます。

Verifying Domain is Secure

結論

このチュートリアルでは、仮想ホスト構成ファイルを設定してNGINXのサブドメインまたは複数のドメインを提供する方法について学びました。また、仮想ホスト構成ファイルで定義したSSL証明書を使用してドメインを保護する方法にも触れました。

さあ、なぜこのセットアップをプロダクション環境で使用しないのですか?たとえば、単一のサーバー上で複数のアプリをホストし、手頃な価格のウェブホスティングを提供するために。

Source:
https://adamtheautomator.com/nginx-subdomain/