ウェブアプリ開発で必要な環境構築。
なんだかんだで一番面倒だったりします。
何度も使う環境は Vagranfile を作っておくと “vagrant up” だけで同一環境が作れるので、スゴイ便利です。
ぜひ Vagranfile の書き方を学んで環境構築にサク時間を短くしましょ!
今回利用した環境
- Windows 7 SP1 x64
- PowerShell: 3.0
- Vagrant: 2.1.0
- VirtualBox: 5.2
まだ Vagrant が使える環境でないかたは、「Vagrant を使うと仮想マシン構築がすごいラク!まずはインストールしよう!」を参照ください。
それでは LAMP スタックを構築していきましょ!
Vagrantfile とは
環境構築する際に “vagrant up” を使いますが、その時に参照されるファイルになります。
自分で編集することで、環境構築のカスタマイズができます。
メリット
「ローカル環境に依存せず、同一の開発環境をすぐに構築できる」になります。
新規に独立した仮想マシンを構築するため、OS が Mac OS だろうが Windows だろうが関係なく、またその環境に何がインストールされているか関係ありません。
“vagrant up” というコマンドだけで、
- 必要なモジュールをダウンロードし、
- 必要な環境設定を全て行います。
また、Vagrantfile というテキストファイルのやりとりだけで良いので、非常に ファイルハンドリングが楽 です。メールでチームメンバーに環境を共有し、受け取った側で “vagrant up” すれば自動的に同一環境が構築できます。
似たようなもので、XAMPP というものがありますが、オールインワンのモジュールなのでやはり重く、他環境で同一の開発環境の構築は結構シンドイです。
デメリット
Vagrantfile をの書き方を理解し、実際に書かなければいけないということでしょうか。
後述する Vagrantfile で使用する 5 つの項目の使い方を読むと分かりますが、内容はシンプルです。(正確には「慣れれば。」でしょうか?笑)
またたまにですが、vagrant up で環境構築を行っている途中で、ある環境 (例: Windows 10) では動いていたのにある環境 (Windows 7) ではエラーになることもあります。その際にデバッグできる知識が必要になります。
LAMP スタックとは
既にご存知かと思いますが、念のために確認です。
- Linux: OS です。ここでは Ubuntu を利用しますが、お好きなディストリビューションをお使い下さい。
- HTTP Apache Server: ウェブサーバーです。
- MySQL: データベースです。
- PHP: サーバーサイドのスクリプト言語です。
LAMP スタックは WordPress でよく使われているスタックですね。
WordPress の開発がしたい人やバックアップを取っておきたい方、プラグインを入れる前に仮想マシンで確認したいという方は環境がすぐに作れるようにしておいた方が、環境構築の手間が省けますね。
実際に Vagrantfile を作成しましょ!
Vagrantfile で覚えておく項目はたった 5 つです。
- config.vm.box: インストールする box 情報を指定します。
- config.vm.provider: 仮想マシンを構築するツール (例: VirtualBox) を指定します。
- config.vm.network: IP/port などのネットワーク関連の設定します。
- config.vm.synced_folder: ホスト PC と構築する仮想マシンで共有するフォルダの指定します。
- 仮想マシンは独立した環境なので SSH などでリモートアクセスする必要があります。ファイルのやりとりをしたい場合、それでは面倒なので、ホストと仮想マシン (ゲスト) とで共有フォルダを作ってリモートアクセスせずにホスト側の環境にファイルを置けば仮想マシン (ゲスト) 側からもアクセスできるという状態にし手間を省くことができます。
- config.vm.provision: 上記ステップ 1 で OS を入れた後の必要な処理 (例: OS を update して HTTP Apache Server 入れる) を指定します。
例えば Ubuntu 14.04 LTS (Trusty Tahr) だけをインストールし、特に何も設定をしない場合は、このようになります。
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/trusty64"
end
このたった 3 行のテキスト情報だけで Ubuntu 14.04 LTS (Trusty Tahr) が構築できます。すごいですね!
それでは詳しく見ていきましょ。
ヒント: “vagrant init” を実行することで、カレントディレクトリに上記 5 つの項目を含んだテンプレート Vagrantfile が生成されますので、そちらを編集することをオススメします。
config.vm.box の設定
box 環境を提供している こちらのサイト からインストールする box を選びます。
config.vm.box = "ubuntu/trusty64"
本記事では “ubuntu/trusty64” を指定しますが、他にも CentOS や Debian を使うことももちろん可能です。
config.vm.provider の設定
特に指定ばなければ VirtualBox がデフォルトで指定されます。
仮想マシンの GUI を出す・ださない (vb.gui) や仮想マシンで利用するメモリ量を指定 (vb.memory) や仮想マシンで利用する CPU の数を指定 (vb.cpus) することができます。
config.vm.provider "virtualbox" do |vb|
vb.gui = true
vb.memory = "1024"
end
VMware など別のツールを使う場合や、ある決まったメモリー量を使いたい場合は指定しましょう。
また、仮想マシン起動後でも本項目は変更可能です。変更した値を起動中の環境に適用するには “vagrant reload” で反映できます。
念のためにですが、”vg.gui = true” で仮想マシンの GUI が表示されます。ログインするための ID/PWD の入力が求められますが、どちらも “vagrant” です。
“vg.gui = false” にした場合、コマンドプロンプト (or PowerShell) から “vagrant ssh” で仮想マシンに入れます。
config.vm.network の設定
こちらが少々ややこしいかもしれませんね。頑張っていきましょ!
いくつか設定方法がありますが、その内個人的によく使っている設定を紹介します。
config.vm.network "forwarded_port", guest: 80, host: 8080
“guest” 仮想マシンで、”host” は物理マシンです (私の環境では Windows 7)。
この設定をする事で、ゲスト OS のポート 80 番で動いているウェブアプリやウェブサイトにホスト側から http://localhost:8080 でアクセスできるようになります。
ちなみに、ポート 80 番は HTTP Apache Server のデフォルトで空いているポートです。
config.vm.network "private_network", ip: "192.168.33.10"
この設定を利用した場合、”localhost” ではなく “ip” で指定した “192.168.33.10” でアクセスできるようになります。
この IP 表示ではなく任意のドメイン名 (例: vagrant-sample-lamp.com) でアクセスしたい場合、hosts ファイルの変更で可能です。
こちらが hosts ファイルの場所です。
- Windows: C:\Windows\System32\drivers\etc\hosts (Administrator 権限が必要です)
- Mac/Linux: /etc/hosts
このファイルに
"192.168.33.10 vagrant-sample-lamp.com"
を追加すると、ホスト側から “vagrant-sample-lamp.com” でアクセスできるようになります。
他にもイロイロな設定ができます。こちらでは紹介できなかった部分は 本家サイト (英語) から確認出来ます。
config.vm.synced_folder の設定
上記の “config.vm.network” でホスト PC からゲスト側のウェブコンテンツを閲覧できましたが、ここではホストとゲストに共有のフォルダを準備し、ホスト PC からゲスト側のウェブコンテンツを編集できるようにします。
config.vm.synced_folder <ホスト側のフォルダ>、<ゲスト側のフォルダ> を指定します。
具体的には、このようになります。
config.vm.synced_folder "../data", "/vagrant_data"
ホスト側のディレクトリはカレントディレクトリ (Vagrantfile のあるディレクトリ) をベースに考えますので、”../data” はカレントディレクトリから 1階層上の “data” フォルダとゲスト側の “/vagrant_data” フォルダを共有させという意味になります。
ホスト側のカレントディレクトリと、ゲスト側の HTTP Apache Server がウェブ公開しているフォルダを共有する場合は、このようになります。
config.vm.synced_folder ".", "/var/www/html"
これで Linux に SSH アクセスし、慣れないコマンドやテキストエディター四苦八苦する必要はなくなりますね。
config.vm.provision の設定
こちらの設定では、”vagrant up” する際にゲスト OS 側で実行するコマンドを設定できます。(詳細は 本家サイト (英語) から)
少ないコマンドを実行する場合は、このように Vagrant ファイルに直接書き込めます。
config.vm.provision "shell", inline: <<-SHELL
apt-get update
apt-get install -y apache2
SHELL
ただ、LAMP スタックには他にも MySQL や PHP もインストールし、update/upgrade をしますので、一般的には別ファイルを準備します。
config.vm.provision "shell", path: "install.sh"
"path" に "install.sh" を設定することで、Vagrantfile ど同階層にある "install.sh" を実行します。
実際に "install.sh" の中ではこのように設定しています。
# Update Packages
apt-get update
# Upgrade Packages
apt-get upgrade
# Apache
apt-get install -y apache2
# Enable Apache mod_rewrite
a2enmod rewrite
#Add PHP repository from Ondřej
apt-add-repository ppa:ondrej/php
apt-get update
# Install PHP
apt-get install -y php7.2
# PHP Apache Module
apt-get install -y libapache2-mod-php7.2
# Restart Apache
service apache2 restart
# PHP Modules
apt-get install -y php-pear
apt-get install -y php7.2-common
apt-get install -y php7.2-mcrypt
apt-get install -y php7.2-zip
apt-get install -y php7.2-curl
apt-get install -y php7.2-dev
apt-get install -y php7.2-gd
apt-get install -y php7.2-mbstring
apt-get install -y php7.2-mysql
apt-get install -y php7.2-xml
# MySQL Pass
debconf-set-selections <<< 'mysql-server mysql-server/root_password password root'
debconf-set-selections <<< 'mysql-server mysql-server/root_password_again password root'
# MySQL
apt-get install -y mysql-server
# Restart Apache
service apache2 restart
この "install.sh" は "root" 権限で実行されるので、"sudo" は必要ありません。
これでどの環境でも "vagrant up" をすれば、まったく同じ LAMP スタックが構築できるようになりました!
まとめ
ここまできて「大変!」という印象を持たれた方もいるでしょう。
ただ、LAMP 環境を構築する際にいずれにせよ手動で設定することですので「追記」という形でモジュールの追加を行った際に Vagrantfile に足していくのもありだと思います。私はそうしています。
今回は LAMP スタックの作成をしましたが、同じように LEMP (Linux, Nginx, MySQL, PHP) や MEAN (MongoDB, Express, AngularJS, NodeJS) スタックも簡単に構築できます。
こちらが、実際に利用した Vagrantfile です。ご自由にご利用下さい。