VirtualHostの追加

要約

クライアント側の/etc/hostsに 192.168.1.10 www.example.com などの行を追加すればドメイン名でアクセスできる。

/etc/apache2/sites-available/に.confファイルを追加してa2ensiteすると仮想的なサーバーを追加できる。

はじめに

ローカルネットでノートPCをウェブサーバーに」で書ききれなかった Virtual Host について説明します。想定条件を繰り返します。

想定するOSはDebianまたはUbuntuで、Debian8 と Ubuntu18.04で検証しています。

Debian系のApache2の設定ファイルはなかなか合理的に分割管理されているのですが、他のディストリビューションでの書き方や、昔の書き方を混ぜて書いてしまっても大抵は動きますので、そのままウェブに解説記事となっていることもあります。ドキュメントはちゃんと読みたいものです。

Wi-FiルーターがDHCPになるローカルネットで、ノートPCをウェブサーバーに仕立てることを想定します。ノートPCを別のネットワークに移動しても働くように、DNSの存在を想定しません。

VirtualHostはサーバー名によって振り分けますから、DNSがない状態では難しくなります。アクセス元のホストのhostsファイルを設定できるようになっている場合は割と単純です。インターネットの黎明期の雰囲気を味わうことができます。DHCPまで自分で用意したり連携して簡易なDNSを用意するところまでは今回はやりません。

他のホストからのドメイン名によるアクセス

実際のURLのようにhogehpge.example.comのようなドメイン名を使いたい場合は、ドメイン名からIPアドレスを得る仕組みが必要になります。DNSサーバーに登録しておいて参照してもらうか、/etc/hostsファイルに書いておきます。

正確にはhogehpge.example.comとあったときにはhogehpgeがホスト名でexample.comがドメイン名なのですが、そうでない場合もありますし、全体をドメイン名というのだと強弁する人もいます。

具体的にadachi-CF-Y7のIPアドレスが192.168.1.10であったとして、これに別のコンピュータ(以降hostBとします)からアクセスしたい場合は、hostBの/etc/hostsに

192.168.1.10    hogehpge.example.com

などとします。もちろん adachi-CF-Y7.somedomain.or.jp でも、adachi-CF-Y7 だけでもいいかもしれません。要するに、/etc/hostsに書くのであれば、hostBから 192.168.1.10 のアドレスが得られるので、大抵の場合うまく行きます。ただし、ブラウザで検索単語と判断されたり、.comが忘れられていると判断されたりと、うまく行かない可能性もありますから、URLらしい形になっている方がいいでしょう。

このホスト名はインターネットに出さないでローカルに使うのであれば、登録をしていなくても、どこかのドメインの真似でもいいのですが、正式にインターネットに接続した時にトラブルにならないよう無難なものにしておきます。

最終的にこうしました。このサイトdabiyone.comのサブドメインという形です。外部DNSには登録していないので、正式なサブドメインとして機能しているわけではありません。ローカルネットワーク専用です。

192.168.1.10    cfy7.nan.dabiyone.com

ローカルなネットワーク内でコンピュータがたくさんあるのであれば、ドメイン名を統一して、ホスト名をホストごとにユニークに決めておき、一覧を/etc/hostsに書いておくのがよいでしょう。インターネットの黎明期にはこのようにしていました。ネット内のホストが少ない時は簡単ですが、ホストの増加に伴い、これが面倒になってDNSの仕組みができました。ローカルなネットワークでもDNSを動かすこともできます。これはこれで便利です。

他のホストがWindowsならば

パス名/ファイル名 /etc/hosts を次のファイルと読み替えてください。

C:\Windows\System32\drivers\etc\hosts

追加する行については、Linuxと代わりはありません。

編集には管理者権限が必要です。

VirtualHostの追加

デフォルトのサーバーの設定はアクセスしてきたもの全て、デフォルトのドキュメントルートである /var/www/html/ ですが、ホスト名でアクセスするようにできるなら、ホスト名によってドキュメントルートを振り分けることができます。そこで/var/www/htmlはそのままに、これとは別に /srv/www/html をドキュメントルートにしてサイトを構築してゆく方法を説明します。

まず、設定のフォルダの確認

adachi@adachi-CF-Y7:~$ ll /etc/apache2/
合計 80
-rw-r--r-- 1 root root  7224  9月 16 21:58 apache2.conf
drwxr-xr-x 2 root root  4096 12月 19 02:51 conf-available/
drwxr-xr-x 2 root root  4096 12月 19 02:51 conf-enabled/
-rw-r--r-- 1 root root  1782  7月 17 03:14 envvars
-rw-r--r-- 1 root root 31063  7月 17 03:14 magic
drwxr-xr-x 2 root root 12288 12月 19 02:51 mods-available/
drwxr-xr-x 2 root root  4096 12月 19 02:51 mods-enabled/
-rw-r--r-- 1 root root   320  7月 17 03:14 ports.conf
drwxr-xr-x 2 root root  4096 12月 19 02:51 sites-available/
drwxr-xr-x 2 root root  4096 12月 19 02:51 sites-enabled/

サイトのドキュメントルートなどは、sites-available に設定されています

adachi@adachi-CF-Y7:~$ ll /etc/apache2/sites-available/
合計 12
-rw-r--r-- 1 root root 1332  7月 17 03:14 000-default.conf
-rw-r--r-- 1 root root 6338  7月 17 03:14 default-ssl.conf

sites-enabled にリンクがあります。

adachi@adachi-CF-Y7:~$ ll /etc/apache2/sites-enabled/
合計 0
lrwxrwxrwx 1 root root 35 12月 19 02:51 000-default.conf -> ../sites-available/000-default.conf

sites-enabledに置かれた*.confというファイルが有効になりますが、sites-availableにファイルを作成しておいてリンクを作ることで設定の有効/無効を簡単に切り替えられるようになっています。これに従わずに書き加えていっても動きますが、知っていると便利です。

000-default.confには次のような内容が書かれています。

	#ServerName www.example.com
	ServerAdmin webmaster@localhost
	DocumentRoot /var/www/html

http://adachi-cf-y7/では /var/www/html/index.htmlが表示される。ということです。

ディレクトリ構成から見る方針に合わせて、これをコピーして書き換える。

adachi@adachi-CF-Y7:/etc/apache2/sites-available$ sudo cp 000-default.conf 001-cfy7.conf

001...にはServerNameの設定をします。DocumentRootも変更します。

	ServerName cfy7.nan.dabiyone.com
	DocumentRoot /srv/www/html

この設定はcfy7.nan.dabiyone.comという名前でアクセスしてきたら、/srv/www/html内のデータを閲覧させるという設定です。名前がcfy7.nan.dabiyone.comでなければ、000...の/var/www/htmlが使用されます。

ローカルネットでノートPCをウェブサーバーに」の繰り返しになりますが、「It works!」のページの中に、デフォルトでは、/var/www、/usr/share(Webアプリケーション用)以外にあるファイルへのWebブラウザ経由のアクセスを許可ないこと、他の場所(/srvなど)をドキュメントルートとする場合は、/etc/apache2/apache2.confのホワイトリストに登録する必要があることを注意しています。

apache2.conf の中には、親切にも

<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
</Directory>

#<Directory /srv/www/>
#        Options Indexes FollowSymLinks
#        AllowOverride None
#        Require all granted
#</Directory>

とありますので、#を削除すれば、/srv/www以下のアクセスを許可することが簡単にできます。

表示すべき内容も用意します。DocumentRootにあわせてフォルダを作り、所有者を変更。index.htmlもコピーして最低でも、/srv以下にアクセスしたことがわかるように内容を変更します。

adachi@adachi-CF-Y7:/etc/apache2/sites-available$ sudo mkdir -p /srv/www/html
adachi@adachi-CF-Y7:/etc/apache2/sites-available$ sudo chown adachi: /srv/www/html/
adachi@adachi-CF-Y7:/etc/apache2/sites-available$ ll /srv/www/
合計 4
drwxr-xr-x 2 adachi adachi 4096 12月 20 17:41 html/
adachi@adachi-CF-Y7:/etc/apache2/sites-available$ cp /var/www/html/index.html /srv/www/html/
adachi@adachi-CF-Y7:/etc/apache2/sites-available$ vi /srv/www/html/index.html

設定ファイルの変更を有効にするため、シンボリックリンクを作る作業をすればOKです。でも、それをするためのコマンドもあります。カレントディレクトリに気を使わなくてもいいので楽です。a2で始まるコマンド(apache2だから)です。忘れたらtabを使ってa2で始まるコマンドを補完で出すことができます。

adachi@adachi-CF-Y7:/etc/apache2/sites-available$ a2
a2disconf  a2dismod   a2dissite  a2enconf   a2enmod    a2ensite   a2query

a2ensiteです。実行すると、

adachi@adachi-CF-Y7:/etc/apache2/sites-available$ sudo a2ensite 001-cfy7.conf
Enabling site 001-cfy7.
To activate the new configuration, you need to run:
  systemctl reload apache2

apache2のリロード方法が示されるので従えばOKです。サーバーを止める必要はありません。

昔ながらの/etc/init.d/で始まる方法も使えます。systemdになってinitではないのですけど、昔の記憶でやってしまってもできるようにしてくれています。確認すると、

adachi@adachi-CF-Y7:/srv/www/html$ ll /etc/init.d/apache2 
-rwxr-xr-x 1 root root 8181  7月 17 03:14 /etc/init.d/apache2*
adachi@adachi-CF-Y7:/srv/www/html$ /etc/init.d/apache2 --help
Usage: apache2 {start|stop|graceful-stop|restart|reload|force-reload}

なので昔の方法でもできますね。

でも素直にsystemctlに従ってみます。

adachi@adachi-CF-Y7:/etc/apache2/sites-available$ systemctl reload apache2

これはsudoを忘れています。でも、ダイアログが出てパスワードを要求されるだけで済みました。

さらにホストを増やす

apach2では002...の設定も可能です。数字で始まるのはたぶん設定の順番ということでしょう。001...ではcfy7.nan.dabiyone.comというホストを定義したのですが、002...というファイルにwww.nan.dabiyone.comを設定すれば、もう一つホストがあるかのように振る舞います。ですから、sites-available内の設定ファイルには、VirtualHostという文言が入っています。

002...には例えば次のように設定します。

	ServerName www.nan.dabiyone.com
	DocumentRoot /srv/www2/html

こんど設定はwww.nan.dabiyone.comという名前でアクセスしてきたら、/srv/www2/html内のデータを閲覧させるという設定です。ホスト名とフォルダ名が合致しないので混乱するかもしれませんが、自由に決められるということです。フォルダの場所も深さも自由です。ただしothorsの読み取り権限はついていないといけません。

DNSを立てていなければ、hostBの/etc/hostsにwww.nan....を加えておく必要があります。

192.168.1.10    cfy7.nan.dabiyone.com
192.168.1.10    www.nan.dabiyone.com

apach2のVirtualHostの設定には、まだまだバリエーションがあって、IPアドレスや、ポート番号によっても切り分けることができます。

ServerNameのマッチングとデフォルト

クライアントはURLのホスト名+ドメイン名からIPアドレスを探します。大抵の場合まず/etc/hosts内を探して見つからなければDNSに問い合わせます。上の例では192.168.1.10でネットワーク内を探してサーバーにたどり着きます。その後でURLによりページを要求することになります。

apache2は、URLにあるホスト名(+ドメイン名)によって、sits-enabled にある設定ファイル内の ServerName から一致するものを探して、見つかれば対応するドキュメントルートを採用します。一致するものがなければ最初の設定ファイルのドキュメントルートを採用します。000-default.confが000で始まるのはこれが最初に読まれるためです。ファイル名のASCIIコード順で読み込まれますから。

したがって000-default.confのServerNameはどうでもいいのですが、2つ目以降になるConfファイル内にはServerNameがしっかりと書かれている必要があります。