はじめに
ひとつのWebサーバーで複数のWebアプリが動かせたら便利ですよね。
今回はひとつのWebサーバーで異なるドメインのWebアプリを動かすVirtual Host機能について解説します。インストール済みのNginxがすでに構築済みであれば、すぐに試せるサンプルコード付きです。試すだけならドメインの取得も必要ありません。
- macOS Catalina
- CentOS 7.7
- Nginx 1.16.1
Nginxの設定
まずはリモートサーバーにSSH接続し、管理者ユーザーに変更しましょう。
$ ssh remote-server
$ su -
パスワード:
#
次にNginxの設定ディレクトリに移動し、まずはdomain1.com
用の設定ファイルを作ります。
設定ファイルの名前は拡張子が.conf
であれば何でもいいです。
# cd /etc/nginx
# mkdir conf.d
# cd conf.d
# touch domain1.conf
作成した設定ファイルを変更します。
# vi domain1.conf
以下のように設定します。
server {
listen 80;
listen 443;
server_name domain1.com;
location / {
root /var/www/domain1/public;
index index.html index.htm;
}
}
設定パラメーターの意味は以下のとおりです。
- listen:要求ポート
- server_name:要求ドメイン名
- location
- root:Webアプリのドキュメントルート
- index:Webアプリのインデックスファイル名(優先度の高い順に列挙)
続いてdomain2.com
用の設定ファイルを作ります。
# touch domain2.conf
# vi domain2.conf
server {
listen 80;
listen 443;
server_name domain2.com;
location / {
root /var/www/domain2/public;
index index.html index.htm;
}
}
今回はわかりやすいように、それぞれのドメインに対応した設定ファイルを個別に作成しましたが、もちろんひとつの設定ファイル(例えばdefault.conf
)にすべて書いてしまっても問題ありません。
ただ、Webアプリが増えてくれば設定ファイルも長大になりがちなので、わかりやすい単位で設定ファイルを分けるのが無難かと思います。
Webアプリの準備
domain1.com
とdomain2.com
、それぞれのWebアプリを準備します。
サンプルなのでドキュメントルートに簡単なindex.html
を作るだけです。
# cd /var/www/domain1/public
# touch index.html
# vi index.html
<h1>Hello domain1!</h1>
同様にdomain2.com
も作成します。
# cd /var/www/domain2/public
# touch index.html
# vi index.html
<h1>Hello domain2!</h1>
Virtual Hostの設定は以上です。
hostsの設定
動作確認を行う前に、ローカル(⚠ リモートサーバーではありません)のhosts
に設定を追加します。
これはあくまで動作確認のための設定ですので、本番環境ではちゃんとドメイン取得を行う必要があります。
ターミナルを開き、以下のコマンドを実行します。
$ sudo vi /private/etc/hosts
hosts
ファイルの末尾に以下を追加します。
xxx.xxx.xxx.xxx
はリモートサーバーのIPアドレスを設定してください。
...
xxx.xxx.xxx.xxx domain1.com
xxx.xxx.xxx.xxx domain2.com
動作確認
いよいよ動作確認です。
ウェブブラウザからhttp://domain1.com/index.htmlにアクセスしてみましょう。
今度はhttp://domain2.com/index.htmlにアクセスしてみます。
それぞれのHTMLファイルが受け取れていますね!
まとめ
WebサーバーのVirtual Host機能は便利な機能ですが、デメリットもあります。
それは、動かすWebアプリが増えれば増えるほど、ひとつのWebアプリにおけるWebサーバーのパフォーマンスが落ちていくということです。
WebサーバーのVirtual Host機能を使うときは、Webアプリの稼働率(≒アクセス数)とサーバーの性能を慎重に見極めるようにしましょう。