想定している状況
想定しているのは以下のような環境です。
- PHPなどを使い、Webアプリケーションの開発を行っている。
- 開発環境はMacである。
- Deploy先となる開発用サーバは、vagrantで構築したLinuxの仮想マシンとなっている。
- 仮想マシンのネットワークにはprivate networkを選択している
この環境を保ったまま、仮想マシンに対して外部からアクセスが必要になった場合のことを考えます。
例えば「Androidスマートフォンのxxという機種でアクセスしたときだけエラーが起こるので、調査してほしい」という依頼がクライアントから届き、スマートフォンの実機から普段利用している開発環境に接続する必要が出てきた場合などです。
普通に考えると
仮想マシンのネットワーク設定をPublic Networkに変更すれば良いのでは、ということになると思います。
しかしながら、開発環境を構築するときにhostsでホスト名を設定していなかったりすると・・・
そのWebアプリケーション自体に設定としてホスト名を持っている場合はもちろんのこと、自分のマシンからデプロイを行ったり、デバッガを接続したりするための設定まで変更をしなければならなくなります。
上記のような対応が一時的なものであるとすると、できるだけ、いつも使っている環境に手を入れたくはありません。
ではどうするか?
仮想マシンをホストしているマシン上でapacheを起動し、そこから仮想マシンに対してmod_proxyでリクエストを転送するという方法でいかがでしょう。
ホストマシンがMacであるものとして、以下、手順を書いていきます。
仮想マシンのホストにインストールしたApacheから、ゲスト上で動いているWebアプリケーションにリクエストを転送する
Apacheのインストール
予めbrewがインストールされているものとします。
その状態で、以下のようなコマンドを実行します。
brew tap homebrew/dupes
brew tap homebrew/apache
brew install httpd24
これを実行した後
which apachectl
で、「/usr/local/bin/apachectl」と表示されればOKです。
httpd.confの書き換え
mod_proxyと、(vagrant上で動作しているサイトがhttpsを利用している場合には)mod_sslを有効にする必要があります。
また、「conf.d」フォルダに新規作成した設定ファイルが自動で読み込まれるようにする設定も追加しておきましょう。
httpd.conf は /usr/local/etc/apache2/2.4 に配置されていますので、これを編集します。
まずデフォルトで無効化されているモジュールを有効化するため、コメントアウトを外します。
*viでは、コマンドモード時に「:set number」で行番号を表示することができます。
#126行目のコメントアウトを外す。
LoadModule proxy_module libexec/mod_proxy.so
#129行目のコメントアウトを外す。
LoadModule proxy_http_module libexec/mod_proxy_http.so
#142行目のコメントアウトを外す。
LoadModule ssl_module libexec/mod_ssl.so
それが完了したら、ファイルの一番最後に下記の1行を追加します。
Include /usr/local/etc/apache2/2.4/conf.d/*.conf
なお、brewでインストールされるapacheは、listenするポートのデフォルトが「8080」となっています。
必要があればこちらも変更を行ってください。
おそらく53行目あたりに「port」という設定が書かれているはずです。
conf.d/vagrant.conf(名前はなんでも良い)
httpd.confと同じ階層に「conf.d」というフォルダを作成し、その中に「vagrant.conf」のような名前のファイルを作成します。
ファイル名は何でも良いです。
また、面倒であればファイルを分けずとも、httpd.confに以下の内容を直接書いてしまっても良いです。
*ファイルを分けるメリットは「見やすい」ということだけで、そうしなければ動かないというわけではない、ということです。
ファイルの内容は下記のとおりになります。
ProxyPass / http://[仮想マシンのIPアドレス]/
ProxyPassReverse / http://[仮想マシンのIPアドレス]/
また、飛ばす先のURLがhttpsである場合には、以下のように記述します。
SSLProxyEngine on
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off
ProxyPass / https://[仮想マシンのIPアドレス]/
ProxyPassReverse / https://[仮想マシンのIPアドレス]/
apache起動
apacheの起動は
apachectl start
停止は
apachectl stop
となります。
ログファイルは「/usr/local/var/apache2/log」に出力されます。
外部からアクセスしてみる
まずは、Mac上から
http://localhost:[httpd.confで指定したポート番号]/
にアクセスし、目的のWebアプリケーションが表示されるかどうか確認します。
これがOKであれば、外部マシンから
http://[仮想マシンのホストのIPアドレス]:[httpd.confで指定したポート番号]/
を実行してみてください。
おそらく、仮想マシン上で動作させているアプリケーションの画面が表示されるものと思われます。