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.
このページを見て、シェルで頑張ってみようっていう気になりました笑。