Syntax Error.

[Sy] Amazon Linux + Apache2.4系 でのバーチャルホストの設定方法

2016/10/15

Amazon Linux(EC2インスタンス)で Apache(httpd)2.4 を使ったバーチャルホストの設定(Webサイトを一つのサーバで複数動かす)方法についてです。

また、設定した以外のServerNameでのアクセスは拒否(403)する設定も合わせて説明します。

環境

  • サーバ:AWS EC2インスタンス (t2.nano)
  • OS:Amazon Linux (AMI release 2016.09)
  • Webサーバ:Apache/2.4.23

⇒ [Sy] Amazon Linux のバージョンを確認する方法 | Syntax Error. ⇒ [Sy] Linux/macOS で Apache のバージョンを調べる方法 | Syntax Error.

やりたいこと

この記事では、以下のことをやるための設定について説明していきます。

URLやドキュメントルートは、設定したいものに置き換えて読んでください。

  • Amazon Linux + Apache(http)2.4 の環境でバーチャルホストを有効にする。
  • http://test.utano.jpというURLで/var/www/test.utano.jpをドキュメントルートとしたサイトを表示できるようにする。
  • http://[サーバのIPアドレス]など、設定したServerName以外でのアクセスには 403 Forbidden を返す。

0.準備

バーチャルホストの設定を始める前に、まずは前提として

  • Apache 2.4系がインストールされていて、起動済み。
  • http://[サーバのIPアドレス]とアクセスすると、Apacheのデフォルトページが表示される。
  • http://test.utano.jpとアクセスしても、Apacheのデフォルトページが表示される。(DNSのレコード設定が必要)

という状態まで環境を作ってください。

Apache2.4系のインストールと起動についてはこの記事に書いてます。

⇒ [Sy] Amazon Linux に yum を使って Apache(httpd) 2.4 をインストールする方法 | Syntax Error.

1.バーチャルホストとして表示したいサイトを作る

http://test.utano.jpとアクセスした場合に、/var/www/test.utano.jp/ディレクトリ配下のサイトを表示したいので、まずはディレクトリを用意します。

$ mkdir -p /var/www/test.utano.jp/
mkdir の -p オプション

`-p`オプションを付けると、もし`/var/www/`という親のディレクトリが作られてなかったとしても一緒に作ってくれます。

続いて、確認用に適当にHTMLファイルを作っておきます。

$ cd /var/www/test.utano.jp/
$ vim index.html

index.htmlの内容は例えばこんな感じで。表示確認用なので、ただ文字列を入れておけば良いです。

test.utano.jp

これでサイトの準備はOKです。

2.バーチャルホスト用の設定ファイルを作成する

Amazon Linux の Apache2.4 では、デフォルトでバーチャルホストが有効になっているので、以下のようなファイルを作成するだけで良いです。

$ sudo vim /etc/httpd/conf.d/vhost-test.conf
(vhost-test.conf)

<VirtualHost *:80>
  ServerName test.utano.jp             <= http://[ここの文字]
  DocumentRoot /var/www/test.utano.jp  <= さっき作った公開したいサイトのディレクトリ

  <Directory "/var/www/test.utano.jp"> <= DocumentRootと同じ
    Options Indexes FollowSymlinks
    AllowOverride All
    Require all granted
  </Directory>
</VirtualHost>

ファイル名は.confという拡張子が付いていれば実はなんでも良いのですが、バーチャルホスト(VirtualHost)の設定ファイルということをわかりやすくするためにvhost-xxxx.confという感じにしておくのがおすすめです。

ちなみに、/etc/httpd/conf/httpd.confがメインの設定ファイルで、/etc/httpd/conf.d/xxx.confたちは追加設定のファイルという使い分けになります。

なので今作ったのは、test.utano.jp用のバーチャルホストの追加設定ファイル ということになります。

3.Apacheを再起動して設定を反映

Apache は再起動しないと設定ファイルの変更が反映されないので、この時点では特に動きに変化はありません。

ということで再起動します。

$ sudo service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]

4.バーチャルホストのサイト表示確認

設定が反映されたはずなので、ブラウザでhttp://test.utano.jpにアクセスしてみます。

すると、このように先ほど作成した/var/www/test.utano.jp/index.htmlの内容が表示されるはずです。

Apache2.4でのVirtualHost設定

ここまでで、基本的なバーチャルホストの設定は完了です!

あとはサイトを増やしたい場合は、その都度サイトを/var/www/配下などに構築し、そのサイト用に/etc/httpd/conf.d/vhost-xxxx.confのような設定ファイルを作成して反映する、の繰り返しになります。

ただこの状態だと、http://[サーバのIPアドレス]や他のDNSレコードでサーバに紐付けられているものなど、そのサーバへアクセスできるURLのどれでもhttp://test.utano.jpのサイトの内容が表示されてしまいます。

なので次の手順であと少しだけ設定を追加します。

5.バーチャルホストとして扱いたい ServerName 以外でのアクセスを拒否する

ちょっと整理すると、今はこうなっています。

  1. http://test.utano.jpにアクセスすると、/var/www/test.utano.jp/index.htmlの内容が表示される。
  2. http://[サーバのIPアドレス]にアクセスしても、/var/www/test.utano.jp/index.htmlの内容が表示される。

1はやりたかったことなので問題ないです。

でも2はやりたいこととは違うので、この場合は拒否(403 Forbidden)を返すようにしたいです。

そのために、先ほどのvhost-test.confと同じ階層に、vhost-00.confというファイルを作成します。ここではファイル名が重要な意味を持ってくるので、とりあえずvhost-00.confという名前で作ってみてください。

$ sudo vim /etc/httpd/conf.d/vhost-00.conf
(vhost-00.conf)

<VirtualHost *:80>
  ServerName any           <= ServerNameは「どれでもいいよ」
  <Location />
    Require all denied     <= すべてのアクセスを拒否!
  </Location>
</VirtualHost>

Apache を再起動して反映します。

$ sudo service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]

この状態(vhost-test.confvhost-00.confの両方がある状態)で、あらためてhttp://[サーバのIPアドレス]にアクセスすると、こんな表示になるはずです。

Apache2.4でのVirtualHost設定(403 Forbidden)

これは「アクセスが禁止されているよ!権限がないよ!」とエラーになっている表示です。先ほど作ったvhost-00.confで意図的にアクセスを拒否しているということです。

403という数字は、このタイプのエラーを表しているコードになります。(正常時は200)

一方、http://test.utano.jpでアクセスした場合は、正常に/var/www/test.utano.jp/index.htmlの内容が表示されます。

これでやりたいことは全てできました!

(おまけ)「vhost-00.conf」という名前をつけた理由

ちなみに、もしこの拒否するための設定ファイル名をvhost-zzz.confとすると何が起こるでしょう?

試してみるとわかりますが、http://[サーバのIPアドレス]でアクセスしても拒否されずに/var/www/test.utano.jp/index.htmlが表示されてしまいます。

これはvhost-test.confよりもvhost-zzz.confの方が辞書順でいうと後ろになってしまい、先に読み込まれたvhost-test.confの方で「その他のServerName」のアクセスを処理してしまうために起こります。

なので、「その他のServerName」のアクセスを拒否したい場合は、必ず辞書順で最初に来るようにvhost-00.confというような名前を付けておくと良いです!

関連記事