LoginSignup
149
153

More than 5 years have passed since last update.

Vagrant+VirtualBoxでPHP開発環境構築

Last updated at Posted at 2014-04-25

Windowsで。

なにがやりたいの?

VirtualBox等の仮想化ソフトウェアで仮想マシンを動かし、その中に開発環境も全て入れてしまおうというコンセプトで、これによって本番環境と開発環境をそろえることが簡単にできるようになることと、グループでの開発の際に開発環境を揃えやすいことが主なメリット。

グループでの開発環境を揃える方法については、Chefなどの設定管理ツールを使うのが一般的だと思う。が、他にもやり方はいろいろあるみたい(PuppetとかVMクローン?とか・・・)。

今回は、VagrantというVirtualBoxのフロントエンドのようなものを使ってコマンドラインで開発環境管理を行えるようにするまでを目的とします。

Vagrantの使い方

インストールについてはhttp://dev.classmethod.jp/tool/vagrant/ の通りにやれば一発で行けました。

  • boxをインストールするコマンド
$ vagrant box add [box-name] [box-url]

boxとは、OSのディスクイメージファイルなどが入ったもの。

  • boxがちゃんとインストールされているか確認
$ vagrant box list
  • VMの起動
$ vagrant up

(例)vagrantでcentosを立ち上げる場合(初期設定含む)

$ mkdir centos
$ cd centos
$ vagrant box add centos https://dl.dropbox.com/u/7225008/Vagrant/CentOS-6.3-x86_64-minimal.box
$ vagrant init centos
$ vagrant up

Vagrant up時に、

There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.

みたいなエラーが出ることがあるようです。僕の場合はVirtualBoxのバージョンを4.1.12にすることでエラーが消えました。

vagrant upできないエラーが出た時はこれが参考になると思います。

  • VMにssh接続する
$ vagrant ssh

逐一状態を抜き出しておきたいので、スナップショット(開発中のプログラムのソースファイルや稼働中のデータベースファイルなどを特定のタイミングで
抜き出したもの)を作成しておくとよいっぽい。

なので、まずはスナップショット用のプラグインであるsaharaをインストールしておく。

$ vagrant plugin install sahara

一応、インストールできていることを確認。

$ vagrant plugin list

サブコマンドsandboxの操作方法一覧。

  • sandboxモード開始
$ vagrant sandbox on
  • 変更を決定する
$ vagrant sandbox commit
  • 変更を破棄し、ロールバックする
$ vagrant sandbox rollback
  • sandboxモード終了(commitしていないものは破棄される)
$ vagrant sandbox off
  • 現在sandboxモードかどうかの確認
$ vagrant sandbox status

onとcommitとoffは割と時間がかかったので、一度下のようにしてVagrantを停止させてから行うとよいかも。

$ vagrant halt
$ vagrant sandbox commit

centosへapacheとPHPをインストール

なお、以下ではsudoしてるんですけど、不要な人はもちろん外してください。わからない人はとりあえずつけておけば良いと思う。

$ sudo yum install httpd
$ sudo yum install php php-cli php-common php-gd php-in tl php-mbstring php-mysql php-pdo

ここで、phpがインストールできていない(見かけ上は出来ているようにみえる)という問題が生じることがあるようです。まだ理由はわかっていないのですが、その場合はインストールされるpackage数が15個になっているはず(正しくインストールされていれば16個。これは、上記コマンドを実行した時にy/Nを求められるのですが、その上にインストールされるものが出ていてpackage数も表示されているはずなのでそこで確認して下さい)。また、インストールされたかどうかは

$ yum list installed 

で確認できます。

以下、設定です。

apacheの設定ファイルに変更を加えます。

$ sudo vi /etc/httpd/conf/httpd.conf

して、

<VirtualHost *:80>

</VirtualHost>

内の設定を適当に書いてください。最低限DocumentRootとServerNameの部分が書いてあれば普通は大丈夫だと思う。

あとは

<Directory />
    Options FollowSymLinks
    # AllowOverride None
    AllowOverride All
    Order deny,allow
    # Deny from all
</Directory>

あたり。とりあえずこれだけ書き換えます。

この時点で文法上のエラーについては、

$ httpdctl configtest

で確認することも出来ます。

ここまでやって、

$ sudo /etc/init.d/httpd start

でapacheを起動。OKと表示されれば成功です。

ちなみに、

$ sudo service httpd start

でも起動できます。再起動は

$ sudo service httpd restart

です。

$ sudo service httpd status

で状態を確認することも出来ます。

なお、この時点でDocumentRootが存在しない、みたいなエラーが出るかもしれません。それでもOKと出ていれば後でDocumentRootにあたるディレクトリを作ればよいので問題ないのですけど、DocumentRoot must be a directoryとエラーが出てapacheを起動できないことが考えられます(このHow toで指定している順番にやれば出ないような気がしますが、先にシンボリックリンク(後述)を貼っていた場合など)。その場合もまずはディレクトリが存在しているかを確認してみてください。一度シンボリックリンクを切ってみて、エラーが消えるようなら先に進めばいいと思います。

一応、apacheがcentos起動時に同時に立ち上がるようにしておきました。

$ chkconfig httpd on 

chkconfigはOS起動時(この場合はCentOS)に参照され、

$ chkconfig --list

で現在の状況を確認できます。httpdのところが1~6まで全部offになってたら起動設定されていません。ちなみにこの数字はランレベルというもので、詳しく知りたい場合はここが参考になると思います。

一応、chkconfigについてもおいておきます。

次にiptablesの設定へ。

$ sudo vi /etc/sysconfig/iptables

で見てみると、デフォルトの設定ではhttpポート(80番)が開放されていない。

-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT

を追加したあと

$ /etc/init.d/iptables restart

で反映させる。viの操作方法はこれ

さらに、iptablesが設定されたことで外部からの通信が遮断されるので、VirtualBoxを起動しているPCから通信が行えるようにファイアウォールの設定をします。

$ sudo service iptables stop

OKと出れば成功。

再起動したときのために、

$ sudo chkconfig iptables off

としておく。

ここまでできればapacheを起動して、HTMLファイルを

$ echo 'It works!' > /var/www/html/index.html

みたいな感じに書いてIPアドレスを入力してやればIt works!って出るはずです。

出ない人は、

・apacheが起動しているか->sudo service httpd restart

・DocumentRootが読み込み不可になっていないか(apacheは擬似ユーザーとして各ディレクトリにあるファイルを読み込んでいる)->chmod -R 755 DocumentRoot

・複数VMが走っていないか(別で設定していなければ、複数VMが走っていればよくわからない挙動になります)->VirtualBoxタスクマネージャで確認

を試してみてください。

一応、ファイルの書き換え時には、iptablesの場合であれば

$ cp /etc/sysconfig/iptables /etc/sysconfig/iptables.org

のようにしてコピーなどとっておくといろいろ安心だし、

$ diff /etc/sysconfig/iptables.org /etc/sysconfig/iptables

でちゃんと書き換わってるか確認できるので良いかと。

次はローカルで自由にエディタを選んでソースを書き、VMと同期させ、ブラウザで確認できるようにすることができれば良いかなという感じ。

vagrantfileで、

$ config.vm.synced_folder "../data", "/vagrant_data"

を有効にすれば内容が同期される(ちなみに第一引数がホスト、第二引数がゲスト)ようなので有効にしてみる。

$ config.vm.network :private_network, ip: "192.168.33.10"

これも有効にしておく必要がある。

ここまでの作業は一応オリジナルのコピーを取って行うことを推奨。

さらに、vagrantでssh接続した先のルート/vagrantとローカルでのvagrantfileがあるディレクトリをリンクさせておけば目標は達成できるはず。

シンボリックリンク作成

追記:デフォルトで\vagrantと作業ディレクトリがリンクしてる・・・?virtualboxから共有フォルダを調べてやってください。既にリンクが貼れてる場合は以下の操作は不要です。もしくは、\vagrantでls -laしてやればリンクが貼ってあるかは確認できます。)

まず、

$ sudo rm -rf /var/www/html

コマンドについて

rm:ファイルまたはディレクトリの削除

オプションについて

-r:ディレクトリの中身を再帰的に削除

-f:対象が存在しなくても実行

によって/var/www/htmlをあけておき、

$ sudo ln -fs /vagrant /var/www/html

コマンドについて

ln:ln (option) [file / directory name] [linkfile / linkdirectory name]でリンクを貼る

オプションについて

-f:警告なしで上書きを行う

-s:シンボリックリンクの作成

すれば/vagrantにシンボリックリンクを貼ることができる。

次に、http://192.168.33.10にアクセスした際にデフォルトで表示するindex.htmlを適当に準備しておく。

ちなみに、これは

$ cd /vagrant 
$ touch [ファイル名]

で簡単に作れる(ローカルと同期しているので)。

あとはhttp://192.168.33.10/test.phpなどとすればvagrantfileと同じディレクトリにあるファイルを適当に呼び出せる。

が、

ここまで出来た状態で、vagrantfileを作業ディレクトリに置いてvagrant upし.vagrantを生成して、作業ディレクトリ内のファイルを192.168.33.10から見れるか試してみたところ失敗・・・

vagrantfileでのsynced_foldの設定が適切に行われているか、apache側の設定ができているかなどいろいろ確認して一つずつ解決。

結局、今回の場合は以下三点が問題だったよう。

  • 1.vagrantを逐一停止させること

  • 2.chmod755してやる

  • 3.virtualhostの設定

この辺りはおそらく個別でググるなどして対処してもらったほうが早いかと。

Macでやるならこことか

vagrant upの際にエラーでbootstrap.sh(Vagrant upのたびに走る)がないといわれることがある(つまり、vagrantfileでbootstrapを有効にしている(デフォルトでは無効です))ので、その時は

#!/usr/bin/env bash
sudo yum update
sudo rm -rf /var/www
sudo ln -fs /vagrant /var/www

を作っておく。

DL is deprecated, please use Fiddleというメッセージがvagrant upする度に出るので、さっさと移行したほうが良さそう・・・

149
153
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
149
153