#057
posted on 2021.10.30

MAMPでバーチャルホスト機能を有効にして任意のドメインを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) ]

リクエストのHTTPヘッダーに中にホスト名(ドメイン)が含まれているという規格のルールを利用して、ホスト名から判断して適切なレスポンスを決定する方式。

複数のホストで同一のIPアドレスを共有する。

  • サーバーの設定変更だけでホストの追加ができるので、サーバー増設もIPアドレスの追加も必要無く低コスト。
  • すべてのリクエストが同じIPアドレスへ接続してくるため、IP層の情報だけではホストの判別ができない。
  • アプリケーションプロトコルの側に接続先ホスト名(ドメイン)を判別する情報が含まれている必要がある。

 

[ 編集する設定ファイル ]

MAMPでバーチャルホストの機能を使用するには、Webサーバーに使用しているApacheの設定ファイルの「httpd.conf」と「httpd-vhosts.conf」、macOS本体の「hosts」ファイルの3つを編集する。

  1. httpd.conf : Apacheの主要な設定が記述してあるテキストファイル。
  2. httpd-vhosts.conf : Apacheのバーチャルホスト機能に関する設定を記述するテキストファイル。
  3. hosts : OSの設定ファイルの一つで、名前解決(IPアドレスとホスト名の紐付け)が記述してあるテキストファイル。

 

[ 設定するドメインの注意点 ]

「aaa」というドメインを設定した場合、アドレスバーに「aaa」と打ち込んでもブラウザはドメインと解釈しないのでサーバーに飛ばずに「aaa」のGoogle検索などブラウザ規定の挙動が実行される。

回避方法

  • URLとして明示するために「http://aaa」と打てばアクセスできる。
  • バーチャルホストを設定するときに、ドメインの構造形式に沿ったドメイン(「aaa.com」など)で設定する。

※ Chromeでは履歴にキャッシュされるからか、一度「http://aaa」でアクセスすれば、以降は「aaa」でアクセスできる。

 

macOS High Sierra バージョン 10.13.6

MAMP Version 6.6 で確認。

 

 

MAMPでのバーチャルホストの設定方法

「名前ベース」のバーチャルホスト機能を有効化して、ローカル環境を好きなドメインでブラウザに表示させる。

※ 「名前ベースのバーチャルホスト」の設定方法のApacheの公式ドキュメント

 

  1. Apacheの「httpd.conf」を編集して、バーチャルホスト機能を有効化。
  2. Apacheの「httpd-vhosts.conf」を編集して、ドメイン(ホスト名)の追加とそのルートディレクトリを設定。
  3. macOSの「hosts」を編集して、追加したドメインにループバックアドレスのIPアドレスを紐付ける。
  4. MAMPを再起動してから設定したドメインにブラウザでアクセスして動作確認。

※ Apacheの「httpd-vhosts.conf」ファイルでの設定により、受信したHTTPリクエストのヘッダーの中にある「ホスト名」を探して、その「ホスト名」に設定されているディレクトのファイルをレスポンスとして返す。

※ OSの「hosts」ファイルでの設定により、「追加したドメイン」へのリクエストはすべてループバックアドレス(OS自身を表すアドレス)の「127.0.0.1」に接続される。(ローカルサーバーのMAMPのApacheに接続される。)

 

 

1. Apacheのバーチャルホスト機能を有効化

Apacheの設定ファイル「httpd.conf」を編集して、「バーチャルホストの機能」を有効にする作業。

 

「httpd.conf」ファイルに、バーチャルホスト機能の設定ファイル(「httpd-vhosts.conf」)を読み込むように記述する。

  • Apacheの設定ファイルの構文は、1行に1つのディレクティブ(命令コマンド)を「ディレクティブ名 設定値」の形式で記述する。
  • コメントアウトは「#」。(ディレクティブのある行の末尾にコメントアウトは記述できない。)

 

初期状態の「httpd.conf」ファイルには、「httpd-vhosts.conf」ファイルを読み込むディレクティブがコメントアウトした状態で既に記述されているので、コメントアウトを外して有効にする。

  1. 「Macintosh HD > アプリケーション > MAMP > conf > apache」ディレクトリにある「httpd.conf」ファイルを開く。
  2. 「# Virtual hosts」(今回の環境では613行目)の1行下、「httpd-vhosts.conf」ファイルを読み込ませるディレクティブの記述の行頭にある「#」を削除してコメントアウトを外す。
  3. 編集を保存してファイルを閉じる。

※ このディレクティブにより、Apache起動時に「httpd-vhosts.conf」ファイルが読み込まれるようになる。

# Virtual hosts
Include /Applications/MAMP/conf/apache/extra/httpd-vhosts.conf

Include ファイルパス : Includeディレクティブ。指定した設定ファイルを読み込む。パスの指定には、絶対パス、相対パス(ServerRootディレクティブからの相対パス)、ワイルドカード(「*」)が使用できる。

 

 

2. 使用したいドメイン(ホスト名)を追加

「httpd-vhosts.conf」ファイル(バーチャルホスト機能の設定ファイル)に、バーチャルホストとして使用する「ドメイン」(ホスト名)を追加する作業。

 

「httpd-vhosts.conf」ファイルに、使用する「ドメイン」とそのルートディレクトリに設定する「パス」を指定するディレクティブを記述する。

※ 設定例としてダミーのバーチャルホストの設定がデフォルトで記述されているので、不要ならその部分の記述は削除するかコメントアウトする。

※ Apache 2.4で「NameVirtualHost」ディレクティブは無効になったので、初期状態で記述されている「NameVirtualHost *:80」(今回の環境では20行目)は、そのまま放置するか不要なら削除。(公式ドキュメント。)

 

[ 追加ドメイン(バーチャルホスト)を設定する記述方法 ]

すべてのHTTPリクエストに対して、リクエストヘッダーから「指定のドメイン(ホスト名)」を探し、マッチした場合に「指定のディレクトリ」をルートディレクトリにするディレクティブを記述する。

  1. 「Macintosh HD > アプリケーション > MAMP > conf > apache > extra」ディレクトリにある「httpd-vhosts.conf」ファイルを開く。
  2. 「<VirtualHost>」ディレクティブで、このバーチャルホストの設定を有効にするIPアドレスを指定。(下記ではワイルドカードを指定することで、IPアドレスやポート番号に関わらず有効になる。)
  3. 「DocumentRoot」ディレクティブで、このバーチャルホストのドキュメントルートとなるディレクトリの「パス」を指定。
  4. 「ServerName」ディレクティブで、このバーチャルホストに設定する「ドメイン」を指定。
  5. エラーログを記録したい場合は、「ErrorLog」ディレクティブで、ログを保存するファイルの「パス」を指定。
  6. アクセスログを記録したい場合は、「CustomLog」ディレクティブで、ログを保存するファイルの「パス」と、記録する内容の「フォーマット」を指定。

※ 既存のWebサーバーにバーチャルホストを設定する場合、既存のWebサーバーに対しても「<VirtualHost>」ディレクティブの設定が必要。(MAMPの場合、デフォルトで存在する「localhost」も設定の記述をする必要がある。)

※ 記述順にドメインがマッチするバーチャルホストを探し、マッチするバーチャルホストが見つからなければ、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接続用のバーチャルホスト設定は、SSLを有効化するときに「httpd-ssl.conf」ファイル(SSL設定ファイル)に記述するので、ここには記述しない。(MAMPにSSL設定する方法は別の記事を参照。)

※ MAAMPのデフォルトのポート設定は「8888」。(下記は「80」で設定している場合。)

※ 非SSL接続は「80」、SSL接続は「443」が国際標準のポート設定。

<VirtualHost *:80>
  DocumentRoot "/Applications/MAMP/htdocs"
  ServerName localhost
</VirtualHost>

 

 

3. 設定したホスト名とループバックアドレスのIPアドレスを紐付ける設定

「hosts」ファイル(OSの設定ファイルの1つ)を使って、バーチャルホストとして追加した「ドメイン」を「ループバックアドレス」(IPアドレスで「127.0.0.1」)に紐付ける作業。

 

OSが保持するホスト名のデータベースである「hosts」ファイルを編集して、「ドメイン」と「IPアドレス」の組み合わせを記述する。

※ OSの「hosts」ファイルの記述は、DNSサーバーによる名前解決よりも優先される。

 

[ hostsファイルの記述方法 ]

  • 「IPアドレス」のあとに「スペース」を入れて「ドメイン」を1行で記述する。(指定した「ドメイン」は指定した「IPアドレス」で名前解決されるようになる。)
  • 「hosts」の内容編集にはルート権限が必要。(ターミナル上でルート権限でCUIエディターを使うのが楽。)

(GUIのテキストエディターで編集する場合)

GUIエディターで「/private/etc」ディレクトリ上のファイルの編集はできないので、一度「hosts」ファイルをデスクトップなど別の場所にコピーして、コピーしたファイルを開いて編集保存してから、「/private/etc」ディレクトリに戻して上書きすれば対処できる。

 

[ ターミナルでhostsファイルを編集 ]

ターミナル上で、ルート権限でCUIエディターのVimを起動して「hosts」ファイルを編集する。

  1. macOSの「hosts」ファイルがあるディレクトリに移動。(「Macintosh HD > private > etc」ディレクトリ。)
  2. ルート権限でVimを起動して「hosts」ファイルを開く。(ルート権限ではOSのログインパスワードを聞かれるので入力。)
  3. Vimの「ノーマルモード」(カーソル移動などをするモード)でファイルが開かれるので、「7G」と入力。(「127.0.0.1 localhost」が記述されている7行目に移動する。)
  4. 「o」キーを入力。(下に空行を挿入して「インサートモード」(テキスト入力ができるモード)に移行する。)
  5. 名前解決の設定を1行に1つずつ記述。(「127.0.0.1 aaa」など。)
  6. 記述が終わったら「esc」キーを入力。(「ノーマルモード」に戻る。)
  7. 「: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」ディレクトリのファイルが表示がされているかを確認する。

 

 

この記事をシェア
この記事のURL

https://memo.ag2works.tokyo/post-2696/

コピー
この記事のタイトル

MAMPでバーチャルホスト機能を有効にして任意のドメインをURLに使用。 | memo メモ [AG2WORKS]

コピー
この記事のリンクタグ

<a href="https://memo.ag2works.tokyo/post-2696/" target="_blank" rel="noopener">MAMPでバーチャルホスト機能を有効にして任意のドメインをURLに使用。 | memo メモ [AG2WORKS]</a>

コピー
※ フィールドをクリックでコピーするテキストの編集ができます。

この記事へのコメント

コメントの書き込みはまだありません。

  • コメント内のタグはエスケープ処理され、文字列として出力されます。
  • セキュリティーのため、投稿者のIPアドレスは取得されます。
  • 管理者が内容を不適切と判断したコメントは削除されます。
  • このフォームにはスパム対策として、Googleの提供するreCAPTCHAシステムが導入されています。
    (Google Privacy Policy and Terms of Service.)