VagrantでCentOS7 + PHP7 + MySQL + nginxの環境を作る

経緯

個人的に契約していたさくらのVPS 2G 3Core HDD 200Gがオーバースペックだなぁと感じていたため、移行先のVPSを探していたところConoHaの評判が良さげだったのでConoha 1G 2Core SSD50Gへの移行を決めました。
これに合わせてPHPも5.4から7にしたいと思っていたので、
CentOS7 + PHP7 + MySQL + nginxの構成でVPSのセットアップすることにしました。
ローカル環境を作って動作を確認した上でVPSのセットアップをしたかったので、Vagrantで上記構成のローカル環境を作成しました。(Dockerを勉強するモチベーションがなかった)

以下解説です。今回出来上がったものはGithubにあげています。

Vagranfile

Vagrantfileは以下のようにしました。


unless Vagrant.has_plugin?("vagrant-vbguest")
  raise "please run 'vagrant plugin install vagrant-vbguest'"
end

Vagrant.configure(2) do |config|

  #CentOS7のboxを指定
  config.vm.box = "centos/7"

  #ゲストマシンのIPアドレスを指定
  config.vm.network "private_network", ip: "192.168.77.10"

  #ホストマシンとゲストマシンのディレクトリをマウント
  config.vm.synced_folder "var/www/html", "/var/www/html", create: true

  #プロビジョニングの処理をprovision.shファイルにまとめる。
  config.vm.provision :shell, :path => "provision.sh"
end

この部分


unless Vagrant.has_plugin?("vagrant-vbguest")
  raise "please run 'vagrant plugin install vagrant-vbguest'"
end

について補足すると、
vagrant-vbguestプラグインがインストールされていないとホストマシンとゲストマシンのディレクトリをマウントする際にエラーが出たため、
プラグインがインストールされていない場合はvagrant upの処理を止めて

please run 'vagrant plugin install vagrant-vbguest'

というメッセージを表示してプラグインのインストールを促すようにしています。

provision.sh

このファイルにミドルウェアのインストールや有効かなどの処理を書いていきます。


#EPElレポジトリを追加
yum install epel-release -y
#デフォルトではEPElを無効に
sed -i 's/enabled=1/enabled=0/g' /etc/yum.repos.d/epel.repo

#Remiレポジトリを追加
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

#nginxをインストール
yum --enablerepo=epel install nginx -y

#confファイルのサンプルを作成
cat << EOT > /etc/nginx/conf.d/example.dev.conf
server {
  listen 80;
  server_name example.dev;
  root /var/www/html/example/htdocs;
  index index.php index.html index.htm;
  charset utf-8;

  location / {
    index index.html index.htm index.php;
    if (!-e \$request_filename) {
      rewrite ^(.+)\$ /index.php?q=\$1 last;
    }
  }

  location ~ \.php\$ {
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
    include fastcgi_params;
  }
}
EOT
#nginxの自動起動設定、起動
systemctl enable nginx
systemctl start nginx
systemctl status nginx

#PHP7とPHP-FPMなどその他extensionをインストール
yum install --enablerepo=epel,remi-php70 php php-mbstring php-pear php-fpm php-mcrypt php-gd php-mysql -y

#PHP-FPMのuserとgroupをnginxに変更
sed -i 's/user = apache/user = nginx/g' /etc/php-fpm.d/www.conf
sed -i 's/group = apache/group = nginx/g' /etc/php-fpm.d/www.conf

#PHP-FPMの自動起動設定、起動
systemctl enable php-fpm
systemctl start php-fpm
systemctl status php-fpm

#MySQLのインストール
rpm -ivh http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm
yum install mysql-community-server -y

#VagrantではパスワードなしでMySQLのrootユーザのログインを許可したい
echo skip-grant-tables >> /etc/my.cnf
#MySQLの自動起動設定、起動
systemctl enable mysqld.service
systemctl start mysqld.service
#Basic認証使いたいのでインストール
yum install httpd-tools -y
#node.jsとnpmインストール
yum install nodejs -y
yum install npm --enablerepo=epel -y

#Vagrantでディレクトリをマウントすると403になるのでSELinuxを停止
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

特にはまりどころはなかったですが、CentOS7になって各サービスの操作コマンドが以前と変わっています。例えばnginxの再起動の場合、これまでは

/etc.ini.d/nginx restart

でしたが、CentOS7では以下のようにsystemctlというコマンドを使います。

systemctl restart nginx.service

vagrant up完了後/var/www/html/example/htdocsにindex.htmlを置きhosts解決すればexample.devが確認できるかと思います。

VPSのセットアップ

Vagrantに関係する処理を削除したprovision.shをVPS上で流して、
そのあとsshやiptables、MySQL等の設定をしていくだけだったのでとても楽でした。
このWordPressのブログもConoHa上で動いています。
ConoHaは申し込んですぐにVPSを起動でき、コントロールパネルも見やすく、今のところとても快適です。
APIも用意されているので触りたいすなぁ

参考記事

CentOS7+nginx+php7+MariaDBの環境構築
CentOS7.1にMySQL 5.7をインストール
CentOS7で使われているsystemctlについて少しまとめた