windows+vagrantを使ってバーチャルドメイン構築のチェックポイント
vagrantでローカル環境構築でハマった点がいくつかありました。
ローカル環境構築の方法は、また別途記載するとして
今回は、構築中にハマった点を記載します。
同様につまづいた方は、チェックポイントとしてご利用ください。
環境について
今回の環境はこんな感じです。
windows10
vagrant 1.8.5
VirtualBox 5.1.4
centos7
まず前提として、上記がインストールされていることとします。
問題とゴール
問題は、ホストOS(windows)からゲストOS(centos)のドメインに
何故かアクセスできないこと。
ゴールは、アクセスし、ゲストOS側の access_log でアクセスが確認できること。
とします。
(写真は403ですが、アクセスできることをゴールとします。)
最初に概要の説明
ゲストOSのドメインにアクセスが流れるためには
ざっくりいうと
・ブラウザが外(インターネット)にいかず、内部に接続が向かうこと
・その接続がゲストOSに向かうこと
・ゲストOSが正しくドメインをさばくこと
です。
今回は「ちゃんとそれぞれが正しい設定になっていますか」という
点で1つずつみていこうと思います。
そして今回は
IP:192.168.33.10 (vagrantのデフォルトIP)
バーチャルホスト名:local.yukibata.com
という条件で進めていこうと思います。
ポイント1: windows の hosts ファイル
ホストOS(windows)側の設定です。
hostsファイルは、ブラウザが処理をする際にチェックするファイルです。
ここに、記載をすることで「この IP or バーチャルホスト は外に行かない」
ということが実現されされます。
つまり、このように記載しましょう。
”C:\Windows\System32\drivers\etc” にある hosts というファイルに
192.168.33.10 local.yukibata.com
という1行をファイルの最終行に加えます。
(このような大事なファイルは、編集する前にバックアップを取りましょう)
これで、ブラウザが http(s)://local.yukibata.com とうアクセスを受け取った際、
外にアクセスしなくなります。
ポイント2:Vagrantfile の記載は正しいか?
vagrant が起動する際に、参照される設定ファイルが Vagrantfile です。
ここにある設定を読み込んで環境が起動します。
ここで大事な設定は3つです
・vm.boxの名前が正しいか?
・port forward は正しいか?
・ネットワークのIPは正しいか?
です。初期設定ではコメントアウトされているので、注意してください。
私の場合 box の名前が centos7 としてあります。
(boxの名前は、"vagrant box list" コマンドで確認できます。)
名前を確認した上で以下の設定を記載してください。
Vagrant.configure("2") do |config|
## boxの名前
config.vm.box = "centos7"
## 追加変更
config.vm.define :centos7 do |centos7|
centos7.vm.box = "centos7"
centos7.vm.network "forwarded_port", guest: 80, host:8080
end
## IP の設定
config.vm.network "private_network", ip: "192.168.33.10"
end
極端な話、ファイルの中身を全部消して、これだけ書いてあればOKです。
ポイント3:vagrant のバグを踏んでいないか?
私は、ここで結構ハマりました。
これは、私と同じ vagrant 1.8.5 を利用している方向けです。
それ以外のバージョンの方は飛ばしてください。
vagrant の 1.8.5には、バグが1件あるそうです。
"vagrant up" のコマンドを打つと、vagrant は起動するのですが、
private key の発行が上手くいかず、中途半端な設定で起動が
完了してしまします。
ssh接続はできるので、「行けてるかも?」と思いがちですが
行けてません。
このようなメッセージが出ていませんか?
”Warning: Remote connection disconnect. Retrying...”
この場合、vagrant のソースファイルの修正が必要です。
windows側から修正したい場合は vagrant をインストールした
HashiCorpのディレクトリの中にあります。
私の場合は、
”C:\Program Files (x86)\HashiCorp\Vagrant\embedded\gems\gems\vagrant-1.8.5\plugins\guests\linux\cap”
にある "public_key.rb" ファイルの 57行目付近を以下のように修正します。
if test -f ~/.ssh/authorized_keys; then
grep -v -x -f '#{remote_path}' ~/.ssh/authorized_keys > ~/.ssh/authorized_keys.tmp
mv ~/.ssh/authorized_keys.tmp ~/.ssh/authorized_keys
chmod 0600 ~/.ssh/authorized_keys // ←ここを追加
fi
contos側から修正したい場合は
/home/vagrant/.ssh/authorized_keys の権限を 600 に設定します。
これで vagrant が無事に起動すると思います。
逆に言うと、この問題に引っかかり無事に起動しない場合、
centos側で ip の振り分けが正しく行われていないような気がします。
(参考)
ポイント4:VirtualBoxの設定が正しいか?
vagrant はあくまで、VirtualBoxをKickしている立場なので、
VirtualBoxの設定が正しくないとダメです。
もう一度、VirutalBoxの設定を見てみましょう。
ただし、設定を見る前に、centosが正しくOFFになっているかを
確認してください。起動中だと設定は変更できません。
”vagrant halt” と "vagrant status" のコマンドでOFFになっていることを
確認しましょう。
確認ができたら、VirtualBoxを起動します。
メニューから「設定」を選択
左メニューの「ネットワーク 」を選択し、
「アダプター2」の「ネットワークアダプターを有効化」に
チェックが入っていること 。
そして、「割り当て」が「ホストオンリーアダプター」になっていることを
確認してください。
それ以外は、デフォルトのままでOKです。
これで "vagrant up" を行ってください。
以下のように Adapter 2 : hostonly と正しく認識されると思います。
この「ホストオンリーアダプター」の設定がないと、
ホストOSからゲストOSへの接続ができなくなります。
ホストオンリーアダプターとは、簡単に言うと
ホストOSとゲストOSを結ぶ「仮想的なネットワーク」の作成を
行ってくれるものです。
ここまでくれば、
ブラウザからアクセスし、windowsの内部から centosに向かうまでが完成です。
ここからは、
「centosが受け付けてくれること」
「apacheが受け付けてくれること」
のチェックポイントを見ていきましょう。
ポイント5:centos側がIPを認識しているか?
ゲストOSが対象(192.168.33.10)のIPを認識していなければいけません
ifconfig コマンドで確認しましょう。
ただ、centos7 では、ifconfigコマンドが非推奨となっているので、
インストールしなければいけません。
まず ”yum -y install net-tools” コマンドでインストールしましょう。
そして、正しく認識されているか確認してください。
もしここに 192.168.33.10 がなければ、
"vagrant halt" や "vagrant destroy" をして再トライしてみてください。
ポイント6:centosの hosts ファイルが正しいか?
windows の hosts ファイルのようなイメージで
centos にも hosts ファイルがあります。
"vi /etc/hosts " で編集してみましょう。
このように
192.168.33.10 [バーチャルホスト名] localhost.localdoain localhost
となってればOKです。
ここまでで、
ブラウザからアクセスし、centosへのアクセスが可能となっています。
ポイント7:apacheの設定
最後にapacheの設定を見てみましょう。
人によって、apacheのインストール方法は異なると思いますが、
私は /etc/httpd のような構成が気持ち悪いので、
個別にapacheをインストールしました。
"/usr/local/apache2/" という構成です。
(ただ、このような構成でなくてもまったく問題ありません)
”vi /usr/local/apache2/conf/httpd.conf” コマンドで
httpd.conf ファイルを編集してみましょう。
以下のように編集します。
<VirtualHost *:80>
DocumentRoot /usr/local/apache2/vhosts/local.yukibata.com/htdocs
ServerName local.yukibata.com
ErrorLog vhosts/local.yukibata.com/logs/error_log
TransferLog vhosts/local.yukibata/logs/access_log
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
<Directory "/usr/local/apache2/vhosts/local.yukbiata.com/htdocs">
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
これでバーチャルドメインごとにディレクトリを作成できるので、
複数ドメインや今後のデバッグが便利になります。
ポイントとしては、
・<VirtualHost *:80>
・DocumentRoot
・ServerName
・ErrorLog
・TransferLog
の5つです。
local.yukibata.com のアクセスが来るとそれぞれが機能してくれます。
忘れがちなのは、
"/usr/local/apache2/vhosts/local.yukiabta.com/logs/"
"/usr/local/apache2/vhosts/local.yukibata.com/htdocs/"
のディレクトリを mkdir コマンドで作成し
apacheが書き込めるように権限設定をしておいてください。
上記のように apache の設定が終わったら、
apacheの再起動をします。
コマンドは
"/usr/local/apache2/bin/apachectl stop"
"/usr/local/apache2/bin/apachectl start"
です。(restartでもOK)
ポイント8:firewall は無効になっているか
firewallとは、外部の不正なネットワークを遮断する仕組みです。
この設定が有効だと、ホストOSからのアクセスは遮断されます。
設定を確認して、有効になっていたらOFFにしましょう。
設定確認のコマンドは
systemctl status firewalld
です。
このように(画像の緑色の部分) Active:active(running) となっていたら
ONになっている証拠です。
これを
systemctl stop firewalld
でOFFにして、再度 systemctl status firewalld で確認しましょう。
以下のように、 Active:inactive(dead) となればOKです。
ポイント9:ホストOSからゲストOSに ping が通るか?
コマンドプロンプトなのどで ping を打ってみましょう
"ping 192.168.33.10"
もしくは
"ping local.yukibata.com"
でOKです。
すると以下のように、接続ができていることがわかります。
これで、ブラウザからアクセスした際に
/usr/local/apache2/vhosts/local.yukibata.com/logs/access_log
にアクセスが来ることが確認できます。
firewall (ファイヤーウォール)の詳しい仕組みは
このサイトがわかりやすかったです。
まとめ
以上8項目が、チェックポイントとして記載しました。
もしかしたら、これらのチェックポイントでもうまくいかない方も
いらっしゃるかもしれませんが、
少なくとも、1つずつチェックしていくことで、
どこまでOKかのイメージがつくと思います。
最後に参考になったサイトを記載します。
もし詰まったり、これって何?と思ったら参照してみてください。
おわり
[ImageFrom]
https://www.vagrantup.com/
http://www.thisprogrammingthing.com/2016/fixing-vagrant-connection-error/