VagrantでCentOSにphpやMySQLやphpMyAdminを入れるよ、Chefなしで

VagrantとVirtualBoxを入れてからいろいろいじってますが、おもしろいですね。ただ、phpやMySQLの入った個人用の環境構築をするのに、Chefとかansibleとかを勉強するのってハードルが高いんですよね。ということで、シェルスクリプトで頑張ります。

とりあえず最低限のphpとMySQLを入れる

まずは、全体像を先に書いておきます。

Vagrant.configure(2) do |config|

  config.vm.box = "chef/centos-6.5"
  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.synced_folder ".", "/vagrant", disabled: true
  config.vm.synced_folder "../", "/var/www/html"

  config.vm.provision "shell", inline: <<-SHELL

DBPASS=vagrant


#
# apache 2.2.15
#
yum -y install httpd
chkconfig httpd on
service iptables stop
chkconfig iptables off

grep '^LoadModule php5_module' /etc/httpd/conf/httpd.conf
if [ $? -eq 1 ]; then
cat >> /etc/httpd/conf/httpd.conf << "EOF"
LoadModule php5_module modules/libphp5.so
<FilesMatch "\.php$">
  SetHandler application/x-httpd-php
</FilesMatch>
EOF
fi


#
# php 5.3.3
#
yum -y install php php-mbstring php-pear php-gd

grep '^date.timezone = Asia/Tokyo' /etc/php.ini
if [ $? -eq 1 ]; then
cat >> /etc/php.ini << "EOF"
date.timezone = Asia/Tokyo
mbstring.language = Japanese
default_charset = UTF-8
mbstgring.internal_encoding = UTF-8
mbstring.http_input = auto
mbstring.http_output = UTF-8
mbstring.detect_order = UTF-8,EUC-JP,SJIS,JIS,ASCII
EOF
fi


#
# mysql 5.1.73
#
yum -y install mysql-server
chkconfig mysqld on

grep '^character-set-server = utf8' /etc/my.cnf
if [ $? -eq 1 ]; then
service mysqld start
mysql -u root -e "delete from mysql.user where host <> 'localhost' or user <> 'root';"
mysql -u root -e "SET PASSWORD FOR root@localhost=PASSWORD('$DBPASS');"
service mysqld stop

sed -i '/mysqld\]/a character-set-server = utf8' /etc/my.cnf
cat >> /etc/my.cnf << "EOF"
[client]
default-character-set = utf8
[mysql]
default-character-set = utf8
[mysqldump]
default-character-set = utf8
EOF
fi


service httpd start
service mysqld start
  SHELL
end

以下で、こまかく見ていきます。

CentOSのインストールなど

シェルスクリプト以外の部分はこうなっています。

Vagrant.configure(2) do |config|

  config.vm.box = "chef/centos-6.5"
  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.synced_folder ".", "/vagrant", disabled: true
  config.vm.synced_folder "../", "/var/www/html"

end

まずは、chef社が管理しているCentOSのboxを指定しています。その次に、private_networkの設定です。これによって、「http://192.168.33.10」でアクセスできるようになります。

その次の2行は、共有フォルダの設定です。デフォルトでは、ホスト(自分のPC)のvagrangfileがあるディレクトリとゲスト(仮想環境)のvagrantディレクトリが同期されます。僕の場合、プロジェクトディレクトりの下にvagrantディレクトリを作り、その下にvagrantfileを置いています。そのため、vagrantfileの1個上のディレクトリと同期しようと考えました。よって、まずはデフォルトの設定を切ってから、自分用に共有フォルダの設定を施しています。ここの設定は、ディレクトリをどう管理するかによって変わってきます。

このあと、「config.vm.provision "shell", inline: <<-SHELL」と「SHELL」で囲った部分がシェルで書いている設定になります。

Apache

まずは、Apacheのインストールです。

yum -y install httpd
chkconfig httpd on
service iptables stop
chkconfig iptables off

2行目はApacheを自動起動させるための設定です。3行目と4行目はファイアーウォールの停止です。続いて、設定ファイルもいじります。

grep '^LoadModule php5_module' /etc/httpd/conf/httpd.conf
if [ $? -eq 1 ]; then
cat >> /etc/httpd/conf/httpd.conf << "EOF"
LoadModule php5_module modules/libphp5.so
<FilesMatch "\.php$">
  SetHandler application/x-httpd-php
</FilesMatch>
EOF
fi

これは、Apacheにphpファイルを認識させるための設定です。httpd.confファイルに、php5_moduleを読ませること、また、phpファイルを実行することを設定しています。これをしないと、index.phpなどをブラウザで読みにいっても、ソースコードがそのまま表示されてしまいます。なお、一度設定したら重複して設定しないように、if文を使って対応しています。

php

次は、phpのインストールです。

yum -y install php php-mbstring php-pear php-gd

必要なパッケージは人によって違ってきます。つぎに、php.iniを編集します。

grep '^date.timezone = Asia/Tokyo' /etc/php.ini
if [ $? -eq 1 ]; then
cat >> /etc/php.ini << "EOF"
date.timezone = Asia/Tokyo
mbstring.language = Japanese
default_charset = UTF-8
mbstgring.internal_encoding = UTF-8
mbstring.http_input = auto
mbstring.http_output = UTF-8
mbstring.detect_order = UTF-8,EUC-JP,SJIS,JIS,ASCII
EOF
fi

timezoneと文字コードの設定です。一度設定したら、それ以降設定しないようにしています。

MySQL

最後に、MySQLです。まずはインストールから。

yum -y install mysql-server
chkconfig mysqld on

2行目は、自動起動の設定です。次に、ユーザーの削除と、my.cnfファイルの更新をします。

DBPASS=vagrant

grep '^character-set-server = utf8' /etc/my.cnf
if [ $? -eq 1 ]; then
service mysqld start
mysql -u root -e "delete from mysql.user where host <> 'localhost' or user <> 'root';"
mysql -u root -e "SET PASSWORD FOR root@localhost=PASSWORD('$DBPASS');"
service mysqld stop

sed -i '/mysqld\]/a character-set-server = utf8' /etc/my.cnf
cat >> /etc/my.cnf << "EOF"
[client]
default-character-set = utf8
[mysql]
default-character-set = utf8
[mysqldump]
default-character-set = utf8
EOF
fi

前半は、root@localhost以外のユーザーを削除し、このユーザーにパスワードを設定しています。後半ではMySQLの文字コードを指定しています。ここでも、設定済みかどうかを判断しています。

サービスの開始

最後に、ApacheとMySQLを起動します。

service httpd start
service mysqld start

これで「vagrant up」すればApacheとphpとMySQLがインストールされます。「http://192.168.33.10」を見に行くと、Apacheが動いていることがわかる画面になります。vagrantfileのあるディレクトリの1階層上のところにindex.phpを置くと、その実行結果も見えるようになります。

phpとMySQLを新しくして、phpMyAdminも入れる

実はyumでインストールするだけだと、phpやMySQLは古いものしか取得できず、phpMyAdminは取得すらできません。なので、リポジトリを追加し、phpMyAdminを入れつつphpやMySQLも新しくしてみます。vagrantfileは次のようになります。

Vagrant.configure(2) do |config|

  config.vm.box = "chef/centos-6.5"
  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.synced_folder ".", "/vagrant", disabled: true
  config.vm.synced_folder "../", "/var/www/html"

  config.vm.provision "shell", inline: <<-SHELL

DBPASS=vagrant

yum -y update
wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
rpm -Uvh epel-release-6-8.noarch.rpm
rpm -Uvh rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
rpm -Uvh remi-release-6.rpm
sed -i -e 's/enabled *= *1/enabled=0/g' /etc/yum.repos.d/epel.repo
sed -i -e 's/enabled *= *1/enabled=0/g' /etc/yum.repos.d/rpmforge.repo
sed -i -e 's/enabled *= *1/enabled=0/g' /etc/yum.repos.d/remi.repo


#
# apache 2.2.15
#
yum -y install httpd
chkconfig httpd on
service iptables stop
chkconfig iptables off

grep '^LoadModule php5_module' /etc/httpd/conf/httpd.conf
if [ $? -eq 1 ]; then
cat >> /etc/httpd/conf/httpd.conf << "EOF"
LoadModule php5_module modules/libphp5.so
<FilesMatch "\.php$">
  SetHandler application/x-httpd-php
</FilesMatch>
EOF
fi


#
# php 5.6.5
#
yum -y install php php-mbstring php-pear php-gd
yum --enablerepo=remi,epel,rpmforge,remi-php56 -y install php php-mbstring php-pear

grep '^date.timezone = Asia/Tokyo' /etc/php.ini
if [ $? -eq 1 ]; then
cat >> /etc/php.ini << "EOF"
date.timezone = Asia/Tokyo
mbstring.language = Japanese
default_charset = UTF-8
mbstring.detect_order = UTF-8,EUC-JP,SJIS,JIS,ASCII
EOF
fi


#
# mysql 5.6.23
#
wget http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
rpm -Uvh mysql-community-release-el6-5.noarch.rpm
yum -y install mysql-community-server
chkconfig mysqld on

grep '^character-set-server = utf8' /etc/my.cnf
if [ $? -eq 1 ]; then
service mysqld start
mysql -u root -e "delete from mysql.user where host <> 'localhost' or user <> 'root';"
mysql -u root -e "SET PASSWORD FOR root@localhost=PASSWORD('$DBPASS');"
service mysqld stop

sed -i '/mysqld\]/a character-set-server = utf8' /etc/my.cnf
cat >> /etc/my.cnf << "EOF"
[client]
default-character-set = utf8
[mysql]
default-character-set = utf8
[mysqldump]
default-character-set = utf8
EOF
fi

#
# phpmyadmin 4.3.9
#
yum --enablerepo=remi,epel,rpmforge,remi-php56 -y install phpMyAdmin php-mysql php-mcrypt
sed -i 's/Allow from 127.0.0.1/Allow from 192.168/g' /etc/httpd/conf.d/phpMyAdmin.conf


service httpd start
service mysqld start
  SHELL
end

変わったところを中心に見ていきます。

リポジトリの追加

Apacheのインストールの前に、リポジトリの追加を行っています。

yum -y update
wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
rpm -Uvh epel-release-6-8.noarch.rpm
rpm -Uvh rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
rpm -Uvh remi-release-6.rpm
sed -i -e 's/enabled *= *1/enabled=0/g' /etc/yum.repos.d/epel.repo
sed -i -e 's/enabled *= *1/enabled=0/g' /etc/yum.repos.d/rpmforge.repo
sed -i -e 's/enabled *= *1/enabled=0/g' /etc/yum.repos.d/remi.repo

1行目はyumのアップデートですね。次の6行で、EPELとRepoForgeとRemiという3つのリポジトリを追加しています。最後の3行は、リポジトリの無効化の設定です。無効にしておかないと、yumで毎回これらのリポジトリを使うことになってしまいます。使うときだけ有効にするので、ここでは無効にしておきます。なお、Remiはもともと無効になっていますが、一応設定しています。

php

Apacheはさきほどと内容が変わっていないので、phpを見ていきます。

yum -y install php php-mbstring php-pear php-gd
yum --enablerepo=remi,epel,rpmforge,remi-php56 -y install php php-mbstring php-pear

「remi-php56」という名前からもわかる通り、これでphp5.6がインストールされます。また、これに伴って、php.iniも少し修正します。

grep '^date.timezone = Asia/Tokyo' /etc/php.ini
if [ $? -eq 1 ]; then
cat >> /etc/php.ini << "EOF"
date.timezone = Asia/Tokyo
mbstring.language = Japanese
default_charset = UTF-8
mbstring.detect_order = UTF-8,EUC-JP,SJIS,JIS,ASCII
EOF
fi

php5.6からmbstgring.internal_encodingなどが非推奨になったので、設定項目から削除しました。

MySQL

MySQLはインストールの部分を変えています。

wget http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
rpm -Uvh mysql-community-release-el6-5.noarch.rpm
yum -y install mysql-community-server
chkconfig mysqld on

phpMyAdmin

最後にphpMyAdminです。

yum --enablerepo=remi,epel,rpmforge,remi-php56 -y install phpMyAdmin php-mysql php-mcrypt
sed -i 's/Allow from 127.0.0.1/Allow from 192.168/g' /etc/httpd/conf.d/phpMyAdmin.conf

「remi-php56」が入っていますが、これがないと依存関係のところでエラーが出てしまいます。2行目は、「192.168」からのアクセスを許すという設定で、これにより「192.168.33.10/phpmyadmin/」でアクセスできるようになります。

まとめ

一度作れば楽できますが、一度目がしんどい。今までxamppで楽してたので、勉強になりました。

【参考になったサイト】
VagrantでXAMPPに替わる開発環境を整備 | 14時の間食
このサイトをベースに試行錯誤していました。

Vagrant provision script for php, Apache, MySQL, phpMyAdmin, Laravel, and javascript helpers. Outputs nearly everything to /dev/null since "quiet" on most commands is still noisy.
このページを見て、シェルで頑張ってみようっていう気になりました笑。

前の記事:
win7にVagrantとかvccw2.0.0を入れるよ
次の記事:
wordpressテーマ作成をする環境をvccwで構築する手順