🐱
VagrantでLAMP環境を自動構築
はじめに
こんばんは。
ローカル環境といえばDockerが当たり前では?みたいな風潮な昨今、
Vagrantを今更使い始める人が果たしているのか、という気はしますが。。
最近READMEを整理したので、またこんな記事でもZennを盛り上げる一助になればと思い書くことにしました。
こちらのGithubで公開しております。
また、この環境はローカル環境での使用を前提としておりセキュリティなどには考慮しておりません。
構成
内部の処理をちょこっと変えればバージョンレベルなら変更できます。
私はレガシーな環境でお仕事をしているのでNginxではなくApacheが主流なのです。。(最近Nginxも増えてきました)
- ホストOS: Mac
- Win対応可(後述)
- CentOS7系
- PHP7.4系
- Mysql8.0系
- Apache2.4系
使用手順
手っ取り早く使いたい方の為に(READMEとほぼ同じ内容です)
Vagrantの初期設定
- VirtualBoxのインストール
- Vagrantのインストール
- コマンドプロンプト(win) or ターミナル(mac)を開いて
vagratn -v
を実行。インストールされていることを確認 -
vagrant plugin install vagrant-vbguest
を実行。共有フォルダを使うためのプラグインをインストール - 【Winの場合】
vagrant plugin install vagrant-winnfsd
を実行。winnfsを使うためのプラグインをインストール -
cd vagrant
(ディレクトリのダウンロード先による)READMEがあるフォルダに移動。
プロジェクトの初期設定
-
git clone [gitのURL] sync
- これで
sync
フォルダを作成しないとvagrant up
に失敗します。(空でもフォルダがあれば良い)
- これで
-
vagrant up
諸々のミドルウェアの設定からcomposer update
まで行う -
vagrant ssh
ゲストOSにssh接続 -
php artisan migrate
(Laravel) or./bin/cake migrations migrate
(Cake) -
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 = 1
とconfig.winnfsd.gid = 1
のコメントアウトを外して下さい。
NFSはLinuxやMacなどUNIX系のOSで使うことのできるファイル共有の仕組みです。
詳しくないので詳細は割愛しますが、基本的にWindows環境では使えません。
winnfs
というVagrantのプラグインがWindowsでのNFSを可能にしています。(もちろんVagrant上のみですが) - ファイル共有は結構ハマったところでした。
-
デフォルトの共有
だと速度が遅くてゲスト側でのcomposer install
がコケた。 -
rsync
だとホスト→ゲストの共有しかできなくてくそ使えねー(半年くらい前。今はわからん) -
samba
でWindows側試してみてたけどなんかうまくいかんくて諦めた。- 未確認の情報だけど、Windowsにおいては
samba
での共有が一番良いらしい。
- 未確認の情報だけど、Windowsにおいては
-
mutagen
も使えたんだけど、ホスト側にmutagen入れる必要があって、Windowsではそれがめんどくさくて諦めた。
-
-
メモリ
とかCPU
の数とかは適当に指定してますので、必要に応じて適宜増やして下さい。 -
provision
はShell
以外にも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に乗り換えようね。
- Q:設定ファイルの書き換えは
- Nginx版も欲しいんだけど、それ作るくらいならDockerでローカル作るわ、という感じなのでたぶんこの構成は更新されません。
終わりに
Vagrantの記事なんて世の中に腐る程ある中、ここまで読んでくださってありがとうございました。
間違っているところ、もっとこうした方が良いよなどあれば、コメントいただけるとうれしいです。
Discussion