MAMPでバーチャルホスト機能を有効にしてlocalhost以外のドメインをURLに使用。
MAMPのローカル環境ではURLがすべて「localhost」からのサブディレクトリ構造で、アドレスバーでの視認性が悪いと感じてきたので、バーチャルホスト(Virtual Host)の機能を使って、好きなドメインで各ディレクトリを表示できようにする方法のメモ。
MAMPの「htdocs」ディレクトリ上に「test001」と「test002」というディレクトリを作成して、ブラウザで「aaa」というドメインにアクセスしたら「test001」の内容を表示、「bbb」というドメインにアクセスしたら「test002」の内容を表示するように設定する。
※ バーチャルホスト機能についてのApacheの公式ドキュメント。
[ バーチャルホスト(Virtual Host) ]
バーチャルホストとは、1つのサーバで複数のホスト(ドメイン)を運用する技術のこと。
必要なサーバーの数を減らしての運用コストを下げることが目的で、Webサーバー、メールサーバーなどで利用される。
ホストごとで異なるIPアドレスを使う「IPベース」方式、複数のホストでひとつのIPアドレスを使う「名前ベース」方式の2種類の方式がある。IPアドレスの取得は高コストでなので、 IPアドレスの節約の観点から、基本的に「名前ベース」のバーチャルホストが使用される。
[ IPベースバーチャルホスト(IP-based Virtual Hosts) ]
それぞれのホストが固有のIPアドレスを使用する。
リクエスト先として指定されたIPアドレスから判断し、適切なレスポンスのホストを決定する方式。(クライアントがドメインごとに異なるIPアドレスへ接続要求してくるため、 サーバーはIP層のみでドメインの判定が可能。)
IPベースバーチャルホストの場合は、アプリケーションプロトコルの種類に依らずに実装することができる。
[ 名前ベースバーチャルホスト(Name-based Virtual Hosts) ]
複数のホストで同一のIPアドレスを共有する。
リクエストのHTTPヘッダーに中にホスト名(ドメイン)が含まれているという規格のルールを利用して、ホスト名から判断して適切なレスポンスを決定する方式。
- サーバーの設定変更だけでホストの追加ができるので、サーバー増設もIPアドレスの追加も必要無く低コスト。
- すべてのリクエストが同じIPアドレスへ接続してくるため、IP層の情報だけではホストの判別ができない。
- アプリケーションプロトコルの側に接続先ホスト名(ドメイン)を判別する情報が含まれている必要がある。
[ MAMPでバーチャルホスト機能に必要な設定ファイル ]
MAMPでバーチャルホストの機能を使用するには、下記の3つのファイルを編集する。
- httpd.conf : Apacheの主要な設定が記述してあるテキストファイル。
- httpd-vhosts.conf : Apacheのバーチャルホスト機能に関する設定を記述するテキストファイル。
- hosts : OSの設定ファイルの一つで、名前解決(IPアドレスとホスト名の紐付け)が記述してあるテキストファイル。
※ Webサーバーに使用しているApacheの設定ファイルの「httpd.conf」と「httpd-vhosts.conf」、macOS本体の「hosts」の3つのファイルを編集してバーチャルホストの機能を有効化する。
[ 設定するドメインの注意点 ]
バーチャルホストとして「aaa」というドメインを設定した場合、アドレスバーに「aaa」と打ち込んでもブラウザはドメインと解釈しないのでWebサーバーにアクセスしようとせず、「aaa」のGoogle検索結果などのブラウザ規定の挙動が実行される。
回避方法
- URLとして明示するために「http://aaa」と打てばアクセスできる。
- ブラウザのブックマークに登録しておいて、アドレスバーからではなくブックマークからアクセスする。
- バーチャルホストを設定するときに、ドメインの構造形式に沿ったドメイン(「aaa.com」など)で設定する。(ドメインの構造形式ではない「aaa」などは使用しない。)
※ Chromeでは履歴にキャッシュされるからか、一度「http://aaa」でアクセスすれば、以降は「aaa」でアクセスできる。
macOS High Sierra バージョン 10.13.6
MAMP Version 6.6 で確認。
MAMPでのバーチャルホストの設定方法
「名前ベース」のバーチャルホスト機能を有効化して、ローカル環境を好きなドメインでブラウザに表示させる。
※ 「名前ベースのバーチャルホスト」の設定方法のApacheの公式ドキュメント。
- Apacheの「httpd.conf」を編集して、バーチャルホスト機能を有効化。
- Apacheの「httpd-vhosts.conf」を編集して、ドメイン(ホスト名)の追加とそのルートディレクトリを設定。
- macOSの「hosts」を編集して、追加したドメインにループバックアドレスのIPアドレスを紐付ける。
- MAMPを再起動してから設定したドメインにブラウザでアクセスして動作確認。
[ Apacheの「httpd-vhosts.conf」ファイル ]
「httpd-vhosts.conf」への記述により、ブラウザからのHTTPリクエストヘッダーの中にある「ドメイン」(ホスト名)を探して、その「ホスト名」に対して設定されているディレクトのファイルをレスポンスとして返すようになる。
[ OSの「hosts」ファイル ]
「hosts」への記述により、「hostsに記述してあるドメイン」へのリクエストはすべてループバックアドレス(OS自身を表すアドレス)である「127.0.0.1」に接続される。(= ローカルサーバーのMAMPのApacheに接続される。)
作業1. Apacheのバーチャルホスト機能を有効化
Apacheの設定ファイル「httpd.conf」を編集して、「バーチャルホストの機能」を有効にする作業。
「httpd.conf」ファイルに、バーチャルホスト機能の設定ファイル(「httpd-vhosts.conf」)を読み込む記述をする。
- Apacheの設定ファイルの構文は、1行に1つのディレクティブ(命令コマンド)を「ディレクティブ名 設定値」の形式で記述する。
- コメントアウトは「#」。(ディレクティブのある行の末尾にコメントアウトは記述できない。)
[ 「httpd.conf」ファイルの記述を編集 ]
- 「Macintosh HD > アプリケーション > MAMP > conf > apache」ディレクトリにある「httpd.conf」ファイルを任意のエディターで開く。
- 「# Virtual hosts」(今回の環境では613行目)の1行下、「httpd-vhosts.conf」ファイルを読み込ませるディレクティブの行頭にある「#」を削除してコメントアウトを外す。
- 編集を保存してファイルを閉じる。
- MAMPのサーバーを停止して再度スタートすると、「httpd-vhosts.conf」ファイルが読み込まれるようになる。
※ 初期状態の「httpd.conf」ファイルには、このディレクティブがコメントアウトした状態で既に記述されているので、コメントアウトを外して有効にする。
# Virtual hosts
Include /Applications/MAMP/conf/apache/extra/httpd-vhosts.conf
Include ファイルパス : Includeディレクティブ。指定した設定ファイルを読み込む。パスの指定には、絶対パス、相対パス(ServerRootディレクティブからの相対パス)、ワイルドカード(「*」)が使用できる。
作業2. 使用したいドメイン(ホスト名)を追加
「httpd-vhosts.conf」(バーチャルホスト機能の設定ファイル)に、バーチャルホストとして使用する「ドメイン」(ホスト名)を追加する作業。
[ 記述内容 ]
「<VirtualHost>」ディレクティブの記述で下記を設定する。(追加したいホスト名の数だけ複数記述する。)
- バーチャルホストとして使用する「ホスト名」。
- その「ホスト名」がルートディレクトリとして使用する「パス」。
この「<VirtualHost>」ディレクティブにより、下記の挙動になる。
- ブラウザがHTTPリクエストした「ドメイン」(ホスト名)を、記述してある「バーチャルホスト」の中から探す。
- 記述してある「バーチャルホスト」とマッチした場合に、その「バーチャルホスト」に設定してある「パス」のディレクトリをHTTPレスポンスとしてブラウザに返す。
※ 既存のWebサーバーにバーチャルホストを設定する場合、既存のWebサーバーに対しても「<VirtualHost>」ディレクティブの設定が必要。(MAMPの場合は、デフォルトで存在する「localhost」にも設定が必要。)
[ 記述方法 ]
設定例としてダミーのバーチャルホスト設定がデフォルトで記述されているので、不要ならその部分は削除するかコメントアウトする。
- 「Macintosh HD > アプリケーション > MAMP > conf > apache > extra」ディレクトリにある「httpd-vhosts.conf」ファイルを任意のエディターで開く。
- 一番下など任意の場所に自分の設定を記述していく。
- 「<VirtualHost>」ディレクティブで、バーチャルホストの設定を有効にするIPアドレスを指定。(下記ではワイルドカードを指定しているので、IPアドレスやポート番号に関わらず有効になる。)
- 「DocumentRoot」ディレクティブで、このバーチャルホストのドキュメントルートとなるディレクトリの「パス」を指定。
- 「ServerName」ディレクティブで、このバーチャルホストの「ホスト名」を設定。
- エラーログを記録したい場合は、「ErrorLog」ディレクティブで、ログを保存するファイルの「パス」を指定。
- アクセスログを記録したい場合は、「CustomLog」ディレクティブで、ログを保存するファイルの「パス」と、記録する内容の「フォーマット」を指定。
※ Apache 2.4で「NameVirtualHost」ディレクティブは無効になったので、初期状態で記述されている「NameVirtualHost *:80」(今回の環境では20行目)は、そのまま放置するか不要なら削除。(公式ドキュメント。)
※ 記述順で上から順番に、リクエストされたドメインとマッチするバーチャルホスト名を探して適用する。マッチするバーチャルホスト名が見つからなければ、IPアドレスの設定がマッチした最初のバーチャルホストの設定が適用される。(下記ではIPアドレスをワイルドカードで指定しているので、先頭の記述がデフォルト設定ということになる。)
※ 下記の「CustomLog」ディレクティブで指定しているフォーマットの内容の場合、「(リモートホスト) (時刻) (ステータス) (リクエストの最初の行) (HTTP ヘッダは除くレスポンスのバイト数)」がアクセスログに記述される。
<VirtualHost *>
DocumentRoot "/Applications/MAMP/htdocs"
ServerName localhost
</VirtualHost>
<VirtualHost *>
DocumentRoot "/Applications/MAMP/htdocs/test001"
ServerName aaa
ErrorLog “/Applications/MAMP/logs/aaa_error.log"
CustomLog “/Applications/MAMP/logs/aaa_access.log" "%h %t \"%>s %r\" %bbytes"
</VirtualHost>
<VirtualHost *>
DocumentRoot "/Applications/MAMP/htdocs/test002"
ServerName bbb
ErrorLog “/Applications/MAMP/logs/bbb_error.log"
CustomLog “/Applications/MAMP/logs/bbb_access.log" "%h %t \"%>s %r\" %bbytes"
</VirtualHost>
<VirtualHost IPアドレス></VirtualHost> : <VirtualHost>ディレクティブ。ひとつのバーチャルホストに対して適用されるディレクティブ群を囲むために使用する。引数に指定したIPアドレスにマッチした場合だけServerNameで要求されたホスト名をリクエストヘッダーから探し、ホスト名がマッチした場合だけ<VirtualHost>ブロックの中にあるディレクティブがそのバーチャルホストにだけ適用される。
DocumentRoot パス : DocumentRootディレクティブ。ウェブから見えるメインのドキュメントツリーになるディレクトリのパスを指定する。指定するパスの最後のスラッシュは無しにする必要がある。絶対パスでない場合は、ServerRootディレクティブからの相対パスと見做される。
ServerName ホスト名 : ServerNameディレクティブ。指定したホスト名を、サーバーが自分自身を示すときに使うホスト名に設定する。スキーム名、ポート番号も同時に指定できる。バーチャルホストの<VirtualHost>セクション内の場合は、そのバーチャルホストにマッチするために必要なリクエストヘッダーに含まれるホスト名の指定となる。
ErrorLog ファイルパス : ErrorLogディレクティブ。指定したファイルパスを、サーバーに生じたエラーを記録するファイルに設定する。絶対パスでない場合は、ServerRootディレクティブからの相対パスと見做される。Unixシステムではエラーをsyslogやパイプ「|」で他のプログラムに渡すこともできる。
CustomLog ファイルパス フォーマット : CustomLogディレクティブ。指定したファイルパスを、サーバーへのリクエストを記録するファイルに設定し、指定したフォーマットでログが記述保存される。指定ファイルパスが絶対パスでない場合は、ServerRootディレクティブからの相対パスと見做される。パイプ「|」で他のプログラムのファイルに標準出力で渡すこともできる。(ログの書式フォーマットの詳細はApacheの公式ドキュメントを参照。)
[ MAMAPにSSLの設定をしている場合の記述方法 ]
同じドメインでもSSLと非SSLではリクエストしているポート番号が異なるので、MAMP環境でSSL化している場合は、SSL接続用と非SSL接続用それぞれのバーチャルホスト設定を記述する必要がある。
- 非SSL接続用設定の対象となる、リクエストのポート番号を明示する。(MAMPのPreferenceで設定してあるポート番号。)
- SSL接続用のバーチャルホスト設定は、「httpd-ssl.conf」ファイル(SSL設定ファイル)に記述するので、ここには記述しない。(MAMPにSSL設定する方法は別記事を参照。)
※ MAAMPのデフォルトのポート設定は「8888」。(下記は「80」に設定を変更している場合。)
※ 非SSL接続は「80」、SSL接続は「443」が国際標準のポート設定。(MAMPにポート設定に関しては前の記事を参照。)
<VirtualHost *:80>
DocumentRoot "/Applications/MAMP/htdocs"
ServerName localhost
</VirtualHost>
作業3. 設定したホスト名とループバックアドレスのIPアドレスを紐付ける設定
「hosts」ファイル(OSの設定ファイルの1つ)を使って、バーチャルホストとして追加した「ドメイン」を「ループバックアドレス」(IPv4アドレスで「127.0.0.1」)に紐付ける作業。
OSが保持するホスト名のデータベースである「hosts」ファイルを編集して、「ドメイン」と「IPアドレス」の組み合わせを記述する。
※ OSの「hosts」ファイルの記述は、DNSサーバーによる名前解決よりも優先される。
※ 必要があれば、IPv6アドレスでのループバックアドレス「::1」も紐付ける。
「localhost」を表すループバックアドレスは、32ビットのIPv4アドレスでは「127.0.0.1」、128ビットのIPv6アドレスでは「::1」。
本来IPv6アドレスでは、4桁ずつの16進数で表記されるので「0000:0000:0000:0000:0000:0000:0000:0001」となるが、連続した0のブロックは「::」で省略でき、さらに4桁の中の左側の桁が0の場合は省略できるので、「::1」と表記できる。
IPv6アドレスを使ってアドレスバーからアクセスする場合、「:」をエスケープしなければならないので「[]」で囲み、「http://[::1]」と入力すればアクセスする。
[ hostsファイルの記述方法 ]
- 「IPアドレス」のあとに「スペース」を入れて「ドメイン」という1セットを1行で記述する。(ここで指定した「ドメイン」は指定の「IPアドレス」で名前解決されるようになる。)
- 「hosts」の内容編集にはルート権限が必要。(ターミナル上でルート権限でCUIエディターを使うのが楽。)
(GUIのテキストエディターで編集する場合)
GUIエディターで「/private/etc」ディレクトリ上のファイルの編集はできないので、一度「hosts」ファイルをデスクトップなど別の場所にコピーして、コピーしたファイルを開いて編集保存してから、「/private/etc」ディレクトリに戻して上書きすれば対処できる。
[ ターミナルでhostsファイルを編集 ]
ターミナル上で、ルート権限でCUIエディターのVimを起動して「hosts」ファイルを編集する。
- macOSの「hosts」ファイルがあるディレクトリに移動。(「Macintosh HD > private > etc」ディレクトリ。)
- ルート権限でVimを起動して「hosts」ファイルを開く。(ルート権限ではOSのログインパスワードを聞かれるので入力。)
- Vimの「ノーマルモード」(カーソル移動などをするモード)でファイルが開かれるので、「7G」と入力。(「127.0.0.1 localhost」が記述されている7行目にカーソル移動する。)
- 「o」キーを入力。(下に空行を挿入して「インサートモード」(テキスト入力ができるモード)に移行する。)
- 名前解決の設定を1行に1つずつ記述。(「127.0.0.1 aaa」など。)
- 記述が終わったら「esc」キーを入力。(「ノーマルモード」に戻る。)
- 「:wq」を入力して「enter」キーを入力。(「編集を保存して終了」のVimの終了コマンド。)
※ 「hosts」ファイルに元から存在する記述は削除しないように注意する。
cd /private/etc #ディレクトリを移動
sudo vim hosts #ルート権限でvimでファイルを開く
cd : カレントディレクトリを変更するコマンド。指定したディレクトリがカレントディレクトリになる。ディレクトリの指定が無ければ、ホームディレクトリがカレントディレクトリになる。
sudo -u ユーザー コマンド : 指定した別のユーザー権限で指定したコマンドを実行。ユーザーの指定(「-u ユーザー」)を省略するとroot権限で実行。
vim : CUIエディターのVimを起動するコマンド。ファイルを指定した場合、Vimを起動してファイルを開く。
「hosts」ファイルの記述内容。
##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting. Do not change this entry.
##
127.0.0.1 localhost
127.0.0.1 aaa
127.0.0.1 bbb
255.255.255.255 broadcasthost
::1 localhost
作業4. バーチャルホストの動作確認
MAMPを再起動してから、ブラウザで「aaa」と「bbb」にアクセスして、それぞれ「test001」ディレクトリと「test002」ディレクトリのファイルが表示がされているかを確認する。
https://memo.ag2works.tokyo/post-2696/
MAMPでバーチャルホスト機能を有効にしてlocalhost以外のドメインをURLに使用。 | memo メモ [AG2WORKS]
<a href="https://memo.ag2works.tokyo/post-2696/" target="_blank" rel="noopener">MAMPでバーチャルホスト機能を有効にしてlocalhost以外のドメインをURLに使用。 | memo メモ [AG2WORKS]</a>
この記事へのコメント
コメントの書き込みはまだありません。