公開日:2013.09.04

Win上でApache + PHPをVagrant + VirtualBox + Chefで動かすまで

テクログ

概要

PHPのローカル開発環境はWinならXAMPP、MacならMAMPとかがあり、簡単なPHPアプリケーションの作成なら手軽に出来ます。が、CoofeeScript、Less、Sass、WebSocket … etc を使いたければ、Node.jsだったりRubyだったりが必要になり、ローカル環境を直に構築するのが徐々に億劫になります。

最終的にはLinux環境で動かすケースが大多数で、その場合、WinにしろMacにしろ、ローカル環境の構築手順があまり役には立たないこと。PC移行時に、再度構築し直すのが面倒なこと。等が理由としてあげられるでしょうか。試行錯誤する中で、ゴミも残ります。

以前からVirtualBoxやVMwareでローカル上に仮想OSを立てて、その中で開発する方法は有りました。しかし、OSイメージのバックアップは適宜行うべきで、OSイメージの状態を管理する面倒さは付きまといます。スナップショットだと、特定モジュールのバージョンを上げる。とかも面倒ですね。

最近、Vagrant + VirtualBox + Chefでローカル開発環境を構築してみて、その辺りの煩わしさが大分解消されたので、以下、その手順です。尚、この記事の内容は、Win 7 64bitで確認しています。

VirtualBoxのインストール

VirtualBoxはOracleが提供する仮想化ソフトウェアです。インストーラでインストールできます。
https://www.virtualbox.org/wiki/Downloads

Vagrantのインストール

VagrantでVirtualBoxをコマンドラインから操作できます。インストーラでインストールできます。
http://downloads.vagrantup.com/


$ vagrant -v
Vagrant version 1.2.7

Rubyのインストール

Vagrantや、後述のChefはRubyを必要とします。
http://rubyinstaller.org/downloads/
隣の方のPC(win 7 32bit)だと、Rubyをインストールしていないはずなのに動いたので、Vagrantのインストール時にうまく解決してくれるのかもしれません。手前のPCにはもともとインストールされていたので、未確認ですが。(もしかすると、ゲストOS側にさえあれば良い?)

saharaのインストール

スナップショット用のプラグインであるsaharaをインストールします。システム上は任意ですが、作業上、あった方が良いです。用途は後述します。


$ vagrant plugin install sahara

Vagrantの初期化

適当な場所でディレクトリを作って、その中で初期化してみます。


$ mkdir my_first_vagrant
$ cd my_first_vagrant
$ vagrant init

gitの初期化

後の作業の差分をわかりやすくするため、gitで初期化しておきます。


$ git init .
$ git add Vagrantfile
$ git commit -m "initial commit"

.gitignoreも作っておきます。”.vagrant”は、vagrantが自動で作成するディレクトリです。”share”については後述します。


.vagrant/
share/

Vagrantfileの編集

http://www.vagrantbox.es/ から、使用したいOSイメージを選びます。どうも会社のPCだとUbuntu13.04(64bit)が上手く起動できず、当記事ではUbuntu12.04(32bit)を使用しています。

直にダウンロードはせず、Vagrantfileに以下の修正を行って下さい。


$ git diff
diff --git a/Vagrantfile b/Vagrantfile
index 3c98940..a2e41c4 100644
--- a/Vagrantfile
+++ b/Vagrantfile
@@ -7,16 +7,16 @@ Vagrant.configure("2") do |config|
# please see the online documentation at vagrantup.com.

# Every Vagrant virtual environment requires a box to build off of.
- config.vm.box = "base"
+ config.vm.box = "ubuntu1204"

# The url from where the "config.vm.box" box will be fetched if it
# doesn"t already exist on the user"s system.
- # config.vm.box_url = "http://domain.com/path/to/above.box"
+ config.vm.box_url = "http://cloud-images.ubuntu.com/precise/current/precise-server-cloudimg-vagrant-i386-disk1.box"

# Create a forwarded port mapping which allows access to a specific port
# within the machine from a port on the host machine. In the example below,
# accessing "localhost:8080" will access port 80 on the guest machine.
- # config.vm.network :forwarded_port, guest: 80, host: 8080
+ config.vm.network :forwarded_port, guest: 80, host: 8080

# Create a private network, which allows host-only access to the machine
# using a specific IP.
@@ -35,7 +35,7 @@ Vagrant.configure("2") do |config|
# the path on the host to the actual folder. The second argument is
# the path on the guest to mount the folder. And the optional third
# argument is a set of non-required options.
- # config.vm.synced_folder "../data", "/vagrant_data"
+ config.vm.synced_folder "share", "/share", :create => true

# Provider-specific configuration so you can fine-tune various
# backing providers for Vagrant. These expose provider-specific options.

コミットも行っておきます。


$ git add .
$ git commit -m "added .gitignore. updated Vagrantfile"

vagrantの起動

初回はconfig.vm.box_url値のイメージファイルをDLして、config.vm.box値の名前で保存するので、少し時間がかかります。


$ vagrant up

スナップショットの作成

仮想OSの状態を簡単に戻せるようにするため、スナップショットを作成しておきます。sandboxはsaharaをインストールして使えるようになったサブコマンドです。


$ vagrant sandbox on

以後、以下のコマンドでスナップショットの状態に戻したり、あるいは現在の状態でスナップショットを更新出来ます。


$ vagrant sandbox rollback # 状態を戻す
$ vagrant sandbox commit # 状態を更新する

仮想OSにログインします。


$ vagrant ssh

PHPをインストールします。Apacheは併せてインストールされました。


$ sudo apt-get install php5 -y
$ php -v
PHP 5.3.10-1ubuntu3.7 with Suhosin-Patch (cli) (built: Jul 15 2013 18:10:56)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies

ログアウトします。


$ exit

ブラウザから確認

http://localhost:8080/ にアクセスして、”It works!”と表示されればOKです。

尚、Vagrantfileでconfig.vm.synced_folderを設定をすると、ホスト側とゲスト側でファイルの共有が出来るようになります。前述の設定で、ホスト側の”./share”ディレクトリとゲスト側の”/share”ディレクトリが共有されている状態です。IDEの作業ディレクトリを指定すれば、作業と同時にゲスト側にも反映されます。/var/www等の公開ディレクトリに、プロジェクトの公開ディレクトリへのシンボリックリンクを貼るなどして下さい。

次に、PHPのインストールをChefで自動化してみます。

Chefのスクリプト(レシピ)を作成

レシピを置くディレクトリを作成します。


$ mkdir -p cookbooks/php5/recipes

次に cookbooks/php5/recipes/default.rb を、以下の内容で作成します。


package "php5" do
action :install
end

Vagrantfileの編集

Chefのレシピが自動で実行されるように、以下の修正を行います。


$ git diff
diff --git a/Vagrantfile b/Vagrantfile
index a2e41c4..c993ac1 100644
--- a/Vagrantfile
+++ b/Vagrantfile
@@ -79,16 +79,18 @@ Vagrant.configure("2") do |config|
# path, and data_bags path (all relative to this Vagrantfile), and adding
# some recipes and/or roles.
#
- # config.vm.provision :chef_solo do |chef|
+ config.vm.provision :shell, :inline => "apt-get install ruby-dev --no-upgrade -y"
+ config.vm.provision :shell, :inline => "gem install chef --no-rdoc --no-ri --conservative"
+ config.vm.provision :chef_solo do |chef|
# chef.cookbooks_path = "../my-recipes/cookbooks"
# chef.roles_path = "../my-recipes/roles"
# chef.data_bags_path = "../my-recipes/data_bags"
- # chef.add_recipe "mysql"
+ chef.add_recipe "php5"
# chef.add_role "web"
#
# # You may also specify custom JSON attributes:
# chef.json = { :mysql_password => "foo" }
- # end
+ end

# Enable provisioning with chef server, specifying the chef server URL,
# and the path to the validation key (relative to this Vagrantfile).

ゲストOSを再度作成

現在起動しているゲストOSを停止します。正しく終了できない場合は -f オプションを付けてみて下さい。


$ vagrant halt

ゲストOSを破棄します。尚、実際には、破棄する必要はありません。今回は、まっさらな状態から起動して、PHPのインストールが自動で行われるか確認するために、敢えて破棄します。


$ vagrant destroy

VAGRANTの起動

先ほどと同様のコマンドで起動します。OSイメージの元になるファイルは既にダウンロードされているので、先程よりは速いはずです。


$ vagrant up

ブラウザから確認

http://localhost:8080/ にアクセスして、”It works!”と表示されればOKです。

おわりに

XAMPPやMAMPは開発初心者にとっては便利ですが、サーバ周りのスキルがなかなか身につきません。心当たりがある方は、まずは手動で良いので、試してみてはいかがでしょうか。

サーバ周りのスキルがある方は、前述のChefや、同じ類のPuppetで、手元にあるかもしれない手書きの構築手順書をスクリプト化すると良いかと思います。そのスクリプトは、そのままドキュメントになります。

様々なツールを1セットにした自分(あるいは会社)専用の開発環境を作ることも出来ますし、大きなシステムであれば、実環境と同様な環境を作ることも出来ますね。コマンド一発です。

尚、ChefにしろPuppetにしろ、単なる自動化ツールではなく、冪等性(何度実行しても同じ状態に収束する)という概念が重要になります。

以上です。

この記事を書いた人

core-corp

入社年2010年

出身地東京都

業務内容インフラ

特技または趣味ドライブ

core-corpの記事一覧へ

テクログに関する記事一覧