VagrantでLAMP環境を自動構築

7 min読了の目安(約6900字TECH技術記事

はじめに

こんばんは。
ローカル環境といえばDockerが当たり前では?みたいな風潮な昨今、
Vagrantを今更使い始める人が果たしているのか、という気はしますが。。
最近READMEを整理したので、またこんな記事でもZennを盛り上げる一助になればと思い書くことにしました。
こちらのGithubで公開しております。
また、この環境はローカル環境での使用を前提としておりセキュリティなどには考慮しておりません。

構成

内部の処理をちょこっと変えればバージョンレベルなら変更できます。
私はレガシーな環境でお仕事をしているのでNginxではなくApacheが主流なのです。。(最近Nginxも増えてきました)

  • ホストOS: Mac
    • Win対応可(後述)
  • CentOS7系
  • PHP7.4系
  • Mysql8.0系
  • Apache2.4系

使用手順

手っ取り早く使いたい方の為に(READMEとほぼ同じ内容です)

Vagrantの初期設定

  1. VirtualBoxのインストール
  2. Vagrantのインストール
  3. コマンドプロンプト(win) or ターミナル(mac)を開いてvagratn -vを実行。インストールされていることを確認
  4. vagrant plugin install vagrant-vbguestを実行。共有フォルダを使うためのプラグインをインストール
  5. 【Winの場合】vagrant plugin install vagrant-winnfsdを実行。winnfsを使うためのプラグインをインストール
  6. cd vagrant(ディレクトリのダウンロード先による)READMEがあるフォルダに移動。

プロジェクトの初期設定

  1. git clone [gitのURL] sync
    • これでsyncフォルダを作成しないとvagrant upに失敗します。(空でもフォルダがあれば良い)
  2. vagrant up 諸々のミドルウェアの設定からcomposer updateまで行う
  3. vagrant ssh ゲストOSにssh接続
  4. php artisan migrate(Laravel) or ./bin/cake migrations migrate(Cake)
  5. php artisan db:seed or ./bin/cake migrations seed

コマンドをいくつか

  • 閉じる時:vagrant halt
  • 環境を壊す時:vagrant destroy
  • 再起動:vagrant reload
  • install.shだけ再実行:vagrant provision
  • その他vagrantコマンド

作成されるDBの情報

  • DB Host: localhost
  • DB名: db
  • ユーザー名: user
  • パスワード: passwordPASSWORD@999

その他

  • 共有フォルダはホスト側は/sync配下でゲスト側は/var/www/html配下
  • DocumentRoot /var/www/html
  • ログイン時に/var/www/htmlにいくようになってる
  • 実際にコードをいじる時は共有フォルダ内をいじる
  • git cloneはローカル側の共有フォルダにする
  • vagrant ssh-configでデフォで作られるssh設定を確認できる
  • composerなどのコマンドを使うときはvagrant sshでVM内に入って叩く
  • DBクライアントはssh経由で接続する
    • ssh情報
    • Server: 192.168.3.100(Vagrantfileのprivate IP)
    • User: vagrant
    • SSH key: ~/.vagrant.d/insecure_private_key(ホストマシンのローカルに自動生成される)
  • vagrantのバージョンが最新でないと起動しないようなので注意

Vagrantfile

こんな感じです。

Vagrant.configure("2") do |config|

  Encoding.default_external = 'UTF-8'
  # centos7をバージョン指定してインストール
  config.vm.box = "centos/7"
  config.vm.box_version = "1905.1"

  config.vm.hostname = 'sample'

  # HTTPのポートフォワーディング。http://localhost:8090でアクセスできる
  config.vm.network "forwarded_port", guest: 8090, host: 80

  # ホストOSからのみhttp://192.168.3.100でアクセスできる
  config.vm.network "private_network", ip: "192.168.3.100"

  # 共有フォルダの設定(ホストの/sync配下とゲストの/var/www/html配下を共有)
    # Windowsの場合は以下のコメントアウトを外す
    # config.winnfsd.uid = 1
    # config.winnfsd.gid = 1
  config.vm.synced_folder "./sync", "/var/www/html", type: "nfs", nfs_export: true

  # ツールをvirtualboxに指定
  config.vm.provider :virtualbox do |vb|
    vb.gui = false
    vb.cpus = 4
    vb.memory = "2048"
  end

  # その他のインストール項目をinstall.shから読み込む
  config.ssh.insert_key = false
  config.vm.provision :shell, keep_color: true, path: "install.sh"
end

解説

  • boxでCentOS8を指定することも可能ですが、rpmファイルが取れなくなるとかありそうなので動作保証外です。
  • hostnameはお好きな名前を。
  • ポートフォワードの8090ポートはホストOSで他に8090番を使っていたら立ち上がらないのでご注意を。
  • Windowsで使う場合はconfig.winnfsd.uid = 1config.winnfsd.gid = 1のコメントアウトを外して下さい。
    NFSはLinuxやMacなどUNIX系のOSで使うことのできるファイル共有の仕組みです。
    詳しくないので詳細は割愛しますが、基本的にWindows環境では使えません。
    winnfsというVagrantのプラグインがWindowsでのNFSを可能にしています。(もちろんVagrant上のみですが)
  • ファイル共有は結構ハマったところでした。
    • デフォルトの共有だと速度が遅くてゲスト側でのcomposer installがコケた。
    • rsyncだとホスト→ゲストの共有しかできなくてくそ使えねー(半年くらい前。今はわからん)
    • sambaでWindows側試してみてたけどなんかうまくいかんくて諦めた。
      • 未確認の情報だけど、Windowsにおいてはsambaでの共有が一番良いらしい。
    • mutagenも使えたんだけど、ホスト側にmutagen入れる必要があって、Windowsではそれがめんどくさくて諦めた。
  • メモリとかCPUの数とかは適当に指定してますので、必要に応じて適宜増やして下さい。
  • provisionShell以外にもAnsibleとかいろいろ選択肢があります。
    ここでは外部ファイルかShellの内容を読み込ませています。
    管理しやすさでいえばShellは雑魚なので、Ansibleに変えたいと思って早幾年。。

プロビジョニング

install.shはこんな感じです。

yum update
yum -y install wget zip unzip yum-utils

# SELinuxの無効化
setenforce 0
sed -i -e "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

# firewallのポートを設定。これではhttpしか使ってないのでそこだけ空けてる
systemctl restart firewalld
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --reload

# sshで入った際のデフォルトディレクトリをドキュメントルートに設定
sed -i -e '$a cd /var/www/html' /home/vagrant/.bashrc

yum -y install epel-release
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
# phpのバージョンを変える時は"remi-php74"の数字を変える
yum -y install --enablerepo=remi,remi-php74 php php-fpm php-pdo php-mbstring php-gd php-json php-mysql php-xml php-pecl-zip php-intl php-composer composer

cp /etc/php.ini /etc/php.ini.org
sed -i -e "s/;date\.timezone =/date\.timezone = Asia\/Tokyo/g" /etc/php.ini
sed -i -e "s/display_errors = Off/display_errors = On/g" /etc/php.ini

systemctl start httpd
systemctl enable httpd

cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.org
sed -i -e "s/AllowOverride None/AllowOverride All/g" /etc/httpd/conf/httpd.conf
sed -i -e "s/DirectoryIndex index.html/DirectoryIndex index.php index.html/g" /etc/httpd/conf/httpd.conf

systemctl reload httpd

# mysqlの設定
yum -y localinstall http://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
cp /etc/my.cnf /etc/my.cnf.org

# mysql5.7の場合以下を有効にする
# yum-config-manager --disable mysql80-community
# yum-config-manager --enable mysql57-community
# yum -y install mysql-community-server mysql-community-devel mysql-utilities
# sed -i -e "s/mysqld.pid/mysqld.pid\n\ncharacter-set-server = utf8/g" /etc/my.cnf

# mysql8.0の場合以下を有効にする
yum-config-manager --disable mysql57-community
yum-config-manager --enable mysql80-community
yum -y install mysql-community-server mysql-community-devel mysql-utilities
sed -i -e "s/# default-authentication-plugin=mysql_native_password/default_authentication_plugin=mysql_native_password\ncharacter-set-server = utf8/g" /etc/my.cnf

systemctl enable mysqld
systemctl restart mysqld

database=db
user=user
host_name=localhost
# デフォルトパスワードをコピー
password=`cat /var/log/mysqld.log | grep "A temporary password" | tr ' ' '\n' | tail -n1`
new_password=passwordPASSWORD@999

mysql -u root -p${password} --connect-expired-password -e "alter user root@localhost identified by '${new_password}'"
mysql -u root -p${new_password} --connect-expired-password -e "create database $database"
mysql -u root -p${new_password} --connect-expired-password -e "create user $user@$host_name identified by '$new_password'"
mysql -u root -p${new_password} --connect-expired-password -e "grant all privileges on $database.* to $user@$host_name with grant option"

cd /var/www/html
composer install

解説

  • SELinuxは設定ファイルを書き換えれば無効にできるんだけど、再起動が必要で、でもShellだけで再起動させるのはめんどくさいので、setenforce 0で一旦無効化した上で設定ファイルも書き換えてます。
  • PHP, Apache, Mysqlを入れて設定ファイルを書き換えて、という感じです。
    • Q:設定ファイルの書き換えはsedでやっていたんだけど、めんどくさいのでもっと楽な方法を採用したい。
    • A:VagrantならAndible、使おうね。それか(ローカル構築なら)VagrantからDockerに乗り換えようね。
  • Nginx版も欲しいんだけど、それ作るくらいならDockerでローカル作るわ、という感じなのでたぶんこの構成は更新されません。

終わりに

Vagrantの記事なんて世の中に腐る程ある中、ここまで読んでくださってありがとうございました。
間違っているところ、もっとこうした方が良いよなどあれば、コメントいただけるとうれしいです。