vagrantBoxの自作から公開までの第3回.
今回はLAMP環境構築を行う.
前回までの手順でcentosのみが入ったvagrant boxを生成した.
今回はこのboxにLAMP環境を構築してゆく.
vagrantBoxの自作から公開までのまとめ記事はこちら.
https://kengotakimoto.com/page-2299/
動作環境
- vagrant 1.8.7
- virtualBox 5.0.20
- centos 6.8
前提条件
centos 6.8 のみがインストールされたvagrant boxを使用する.
vagrant box作成は前回の記事を参照.
前回の記事はこちら.
今回はvagrantにssh接続をして行う作業がメインなのでホストマシンはwin, mac どちらでも構わない.
macなら vagrant ssh
winならRLoginなどでvagrantと接続する.
winユーザでクライアントソフトを使ったことがない人にはRLoginがオススメ.
RLoginを使いたい人は以前書いたこちらの記事が参考になるかも.

作業ディレクトリ作成
vagrantBoxを自作する作業ディレクトリをホストマシン上に作成する.
ディレクトリ名は何でもok.
今回は myBox とする.
$ mkdir ~/Desktop/vagrantBoxDiy/myBox
Vagrantfile生成
使用するboxなどを指定するために次のコマンドでVagrantfileを生成する.
$ cd myBox
$ vagrant init minimun/centos68-minimal
Vagrantfile編集
結論からいうと Vagrantfile に config.ssh.insert_key = false
を追記すれば良い.
何故この記述が必要なのか.
この点を少し詳しく紹介する.
vagrant Insecure Keypair 対策
概要は次の通り.
- 誰が困るのか?
- 提供されたboxを使うユーザ
- いつ困るのか?
vagrant up
時.
- どう困るのか?
vagrant up
に失敗する.- 延々と
default: Warning: Authentication failure. Retrying...
が出力される
- なぜ
vagrant up
に失敗するのか? - どうやって対策するのか?
ここでは最後の2点について解説.
なぜ vagrant up
に失敗するのか?
config.ssh.insert_key
- If true, Vagrant will automatically insert a keypair to use for SSH,
replacing Vagrant’s default insecure key inside the machine if detected.
By default, this is true.
vagrant内部に古いssh keyペアを持っていた場合, 自動的にそれとは別の新しいkeyペアを生成・置換するらしい.
第三者が提供されたboxを使う場合, vagrant up時に鍵がペアではなくなってしまう.
というのが対策の理由.
古いバージョンのvagrantを使っている場合, ssh周りでバグがあるらしい.
bugfixなどのchangelogは次のページにまとまっている.
mitchellh/vagrant | github
どうやって対策するのか?
自動的にkeypairを生成しないように, Vagrantfile に config.ssh.insert_key = false
を追記する.
我々のようなbase box creator(vagrant boxをイチから作ろうとする人)はvagrantのssh周りについて考慮しないといけない.
Insecure Keypair
These keys are the “insecure” public/private keypair we offer to base box creators for use in their base boxes
so that vagrant installations can automatically SSH into the boxes.If you’re working with a team or company or with a custom box and you want more secure SSH,
you should create your own keypair and configure the private key in the Vagrantfile with config.ssh.private_key_path
vagrant へログインするときのkeyペアはinsecure.
自前で用意したssh秘密鍵, 公開鍵は適切な場所に設置しよう.
秘密鍵は Vagrantfile に config.ssh.private_key_path
としてパスを明記しよう.
今回は一人で使う予定なので, Vagrantfile に ssh keypairの自動生成のみをoffにする.
Vagrantfile
config.ssh.insert_key = false
最終的にVagrantfileはこんな感じになる
余分なコメントは全部削除した.
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure(2) do |config|
config.vm.box = "minimun/centos68-minimal"
# prevent from creating insecure ssh key
config.ssh.insert_key = false
end
vagrant up , vagrant ssh
vagrant up
で vagrant起動.
macユーザなら vagrant ssh
でcentOSにログイン.
winユーザならRLoginなどでcentOSにログインしよう.
リポジトリ追加
本記事の作業で次の環境構築を行う.
- Apache2.4.23 追加
- MySQL 5.7.15 追加
- phpMyAdmin 追加
- PHP 5.6 追加
osにこれらのツールをインストールするとき,
- 任意のツールを
- 任意のバージョンで
使いたいと思うはずだ.
そのために, いくつかのリポジトリを利用する.
ここでは次の点を紹介する.
- リポジトリをインストールするためのyumコマンドについて
- 各リポジトリインストール方法
yumとは
Yellowdog Updater Modified (Yum ヤム)はLinuxのRPM Package Managerのパッケージを管理するメタパッケージ管理システムである。
yumについて簡単に解説.
- パッケージ管理システムだよ
- centosにデフォルトでインストールされているよ
yumコマンド
を使ってLAMP環境をinstallするよ- yum と リポジトリの関係
パッケージ管理システムだよ
必要なソフトの install, update, delete などが可能
centosにデフォルトでインストールされているよ
次のコマンドを実行すると, デフォルトでyumコマンドが使えることが判る.
[vagrant@localhost ~]$ rpm -q yum
yum-3.2.29-73.el6.centos.noarch
yumコマンド
を使ってLAMP環境をinstallするよ
Apache, MySQL, PHP は yum
コマンドを使ってインストールする.
yum と リポジトリの関係
yum は install, update, delete を行うコマンド.
リポジトリは ソフトが置いてある場所.
yum もデフォルトでリポジトリを持っているが, パッケージが古い.
最新版パッケージを利用するには外部リポジトリに頼った方が良い.
今回利用する外部リポジトリは次の通り.
- EPEL
- Remi
- IUS
- MySQL community
外部リポジトリのinstallは yum
コマンド または rpm
コマンド で行う.
リポジトリは複数持っていた方が良いけど, メリット・デメリットがある.
リポジトリを複数持つことのメリット
メリットは次の点.
- 使用可能パッケージの種類が増える
- 使用可能バージョンが増える
- ダウンロード元が増える
リポジトリを複数持つことのデメリット
デメリットは次の点.
- 管理が煩雑になる
- どのリポジトリからインストールしたのか
- どのバージョンをインストールしたのか
パッケージ管理は大抵の場合一筋縄ではいかない.
必要に応じてググって調べる方針で作業を進める.
インストール済みパッケージをアップデートしておく
作業開始前に, 次のコマンドでインストール済みパッケージのアップデートをしておく.
$ sudo yum -y update
ここからリポジトリのインストールを開始する.
EPEL リポジトリ インストール
次のコマンドを実行.
$ sudo yum -y install epel-release
-y
は, 問い合わせがあったときにすべて yes と答えるオプション.
次の表示が出たら完了.
Installed:
epel-release.noarch 0:6-8
REMI リポジトリ インストール
$ sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
今回は centos6.x なので remi-release-6.rpm
を指定.
rpm
コマンドのオプションの意味は次の通り.
オプション | 意味 |
---|---|
-U | パッケージのアップグレード. 前パージョンのパッケージが存在しない場合はパッケージの新規インストール. |
-v | 操作対象パッケージ名表示. |
-h | インストール状況を # で表示. |
IUS リポジトリ インストール
公式HPから最新版をゲット.
今回は 1.0-14 をインストールする.
次のコマンドを実行.
$ wget https://dl.iuscommunity.org/pub/ius/stable/CentOS/6/x86_64/ius-release-1.0-14.ius.centos6.noarch.rpm
$ sudo rpm -Uvh ius-release-1.0-14.ius.centos6.noarch.rpm
wgetでDLしたものは不要なので削除しておく.
$ rm ius-release-1.0-14.ius.centos6.noarch.rpm
MySQL community リポジトリ インストール
MySQL公式リポジトリをインストールする.
自分の環境に合った Yum Repository を選択.
centos6.8 はRHELと互換性があるので Red Hat Enterprise Linux / Oracle Linux の downloadページから取得する.
$ sudo rpm -Uvh http://dev.mysql.com/get/mysql57-community-release-el6-9.noarch.rpm
次のコマンドで設定されたリポジトリを確認.
$ yum repolist enabled | grep "mysql.*-community.*"
Vim 追加
vimについては Vim | wikipedia を参照.
この後設定ファイルを編集する必要があるので, Vimをエディタとして用意する.
centosには元々ミニマルなvimがインストールされている.
[vagrant@localhost ~]$ yum list installed | grep vim
vim-minimal.x86_64 2:7.4.629-5.el6_8.1
ミニマルなvimは使い勝手が悪いらしい.
vim-enhancedを入手するために次のコマンドを発行する.
まず, 使えるvimのバージョン確認
$ yum list vim-enhanced
## 結果
vim-enhanced.x86_64 2:7.4.629-5.el6_8.1 updates
インストール
$ sudo yum -y install vim-enhanced.x86_64
このとき依存関係のあるパッケージも同時にインストールされる.
次の表示が出れば完了.
Complete!
Apache2.4.23 追加
次のコマンドでインストール可能なApacheを全て表示する.
$ yum list | grep httpd24
httpd24u から始まるパッケージが多かったので次のようにインストール.
$ sudo yum -y install httpd24u
インストールしたApacheバージョンは次のコマンドで確認可能.
$ httpd -v
実行結果.
Server version: Apache/2.4.25 (CentOS)
静的ファイルキャッシュ対策
vagrant環境だとcssなど静的ファイルが正しく反映されない.
ネットワークマウントされた DocumentRoot (例えば NFS や SMB) では、カーネルは自身のキャッシュを使ってネットワークからのファイルを 送ることができないことがあります。
VirtualBoxの共有フォルダに設定したディレクトリは外部ストレージ上のものだた判断されてしまう.
その結果, Apacheが静的ファイルの更新を検知できない.
略称用語が気になったので正式名称だけ紹介しておく.
略称 | 正式名称 |
---|---|
NFS | Network File System. |
SMB | Server Message Block |
対策として vagrant用の .confファイル を作成する.
$ sudo vim /etc/httpd/conf.d/vagrant.conf
ファイルを次のように記述.
<Directory /var/www/html>
EnableSendfile Off
</Directory>
変更内容を反映するために再起動を行う.
$ sudo service httpd restart
Apache自動起動有効化
毎回vagrantを起動する度に手動でApacheをスタートさせるのは手間だ.
自動起動を有効化するために次のコマンドを実行.
$ sudo chkconfig httpd on
ランレベルの設定は次のコマンドで確認可能.
[vagrant@localhost ~]$ chkconfig --list httpd
httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
Apacheの設定は以上.
MySQL 5.7.15 追加
次の公式ドキュメントを参考に作業を進める.
vet 5.6 なら日本語もある.
公式repositoryからインストール可能なRPMパッケージ
公式repositoryからインストール可能なRPMパッケージは次の通り.
- MySQL Server
- MySQL Client
- MySQL Workbench
- MySQL Utilities
- Connector/ODBC
- Connector/Python
今回は次の2つをインストールする.
- MySQL Server
- MySQL Client
el5, el6
ここで, ドキュメントに出てくる用語を少し解説.
el5, el6 は次のような意味.
用語 | 意味 |
---|---|
el5 | Enterprise Linux 5 (Red Hat Enterprise Linux version or CentOS version) |
el6 | Enterprise Linux 6 (Red Hat Enterprise Linux version or CentOS version) |
centosのリリース(バージョン)毎に異なるパッケージが用意されている.
使用中のcentos リリースは次のコマンドで確認可能.
[vagrant@localhost ~]$ cat /etc/centos-release
CentOS release 6.8 (Final)
私の環境は 6.8 なので, el6
としてドキュメントを眺めてゆく.
MySQL Server, MySQL Client インストール
MySQL CommunityリポジトリからMySQL5.7をインストールする.
次のコマンドで先程追加したリポジトリ一覧を確認.
$ yum repolist all
更に, 次のコマンドで利用可能なパッケージ一覧を取得.
$ yum list available | grep mysql57
MySQL Server, MySQL Client インストール
$ sudo yum install -y --enablerepo=mysql57-community mysql-community-client mysql-community-server
Complete!
と表示されれば完了.
寿司・ビール問題 対策
寿司・ビール問題とは
MySQLのDBでencoding=utf8の場合, UTF-8の文字列長が4byteの文字をDBに保存できなくなる問題.
詳しくはこちらのページを参照.
このタイトルはMySQL 8.0だけど, 2015年4月1日に投稿された Bug #76553 あたりから引きずっているバグらしい.
対策
MySQLの設定ファイルを編集してデフォルト文字セットを設定する.
$ sudo vim /etc/my.cnf
[mysqld]
character-set-server = utf8mb4
[mysql]
default-character-set = utf8mb4
MySQL起動, 自動起動有効化
$ sudo service mysqld start
$ sudo chkconfig mysqld on
初期パスワードを vagrant
として設定
MySQL5.7のパスワードポリシーは次のようになっている.
Assuming that the validate_password plugin is installed, it implements three levels of password checking:
LOW, MEDIUM, and STRONG.
The default is MEDIUM; to change this, modify the value of validate_password_policy.(中略)
・MEDIUM policy adds the conditions that passwords must contain at least
1 numeric character,
1 lowercase character,
1 uppercase character,
and 1 special (nonalphanumeric) character.
ローカル開発環境のみで利用するvagrant boxなので, 毎度このルールに則ったパスワードを入力するのは面倒.
シンプルに vagrant
をパスワードとして使用したい.
パスワードのセキュリティ的な脆弱性が生まれるが, ローカル開発環境のみで利用するので良しとする.
以下, MySQLパスワード変更手順.
パスワード設定
設定方針は次の通り.
skip-grant-tables
を有効にしている間にパスワード変更を行う.
次のコマンドで初期パスワードを調べ, ログインする.
$ sudo cat /var/log/mysqld.log | grep 'temporary password'
# パスワードが表示される
$ mysql -uroot -p
# 調べたパスワードでログイン
ログイン後, どんな操作をしても次のようにパスワードの設定を求められる.
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
後で vagrant
に変更するために, ここでは一旦ポリシーに従ったパスワード Vagrant_0
に設定する.
$ set password for root@localhost=password('Vagrant_0');
一度mysqlからログアウトする.
$ exit;
MySQLを停止.
[vagrant@localhost ~]$ sudo service mysqld stop
Stopping mysqld: [ OK ]
パスワード無しでの接続を可能にする.
Resetting the Root Password: Generic Instructions
Stop the MySQL server if necessary, then restart it with the –skip-grant-tables option.
This enables anyone to connect without a password and with all privileges, and disables account-management statements such as ALTER USER and SET PASSWORD.
Because this is insecure, you might want to use –skip-grant-tables in conjunction with –skip-networking to prevent remote clients from connecting.
引用: Resetting the Root Password: Generic Instructions | dev.mysql.com
ここでは指示に従い --skip-networking
オプションも付ける.
$ sudo mysqld_safe --skip-grant-tables --skip-networking &
mysqld_safe
セーフモードで起動.
&
バックグランド動作.
MySQLへrootでログイン
$ mysql -u root
rootパスワード リセット
ここではパスワードを vagrant
とする.
use mysql;
update user set authentication_string=PASSWORD("vagrant") where User='root';
flush privileges; # 権限の反映
quit;
MySQL5.6までは authentication_string
ではなく password
となっていたらしい.
今回は MySQL5.7 なのでこれでok.
flush privileges
で設定した権限を反映する.
MySQL再起動
sudo service mysqld restart
ここまででMySQLの設定完了.
PHP 5.6 追加
apache2.4 fastcgi経由でPHPを動かす.
phpにはそのモジュール(php-fpm)が用意されているので, これを使う.
IUSリポジトリからPHPをインストール
$ sudo yum -y install --enablerepo=ius php56u-fpm php56u-cli php56u-devel php56u-gd php56u-intl php56u-mbstring php56u-mcrypt php56u-mysqlnd php56u-pdo php56u-xml
開発用に php.iniファイル を置き換える
$ sudo cp /usr/share/doc/php56u-common-5.6.30/php.ini-development /etc/php.ini
php.ini 編集 : タイムゾーンを UTC に設定
date.timezone = UTC
を追記.
$ sudo vim /etc/php.ini
php-fpm 設定
php-fpmの設定は次のサイトを参考に進める.
起動オーナーをapacheに変更
$ /etc/php-fpm.d/www.conf
user = apache
group = apache
セッションディレクトリ オーナー変更
$ chown -R root:apache /var/lib/php-fpm/*
$ chown -R apache:apache /var/log/php-fpm/
php-fpm 自動起動
$ sudo service php-fpm start
$ chkconfig php-fpm on
Apache2.4 と連携
リバースプロキシを設定することで, php-fpmを経由させる.
$ sudo vi /etc/httpd/conf.d/php-fpm.conf
<FilesMatch \.php$>
SetHandler "proxy:fcgi://127.0.0.1:9000"
</FilesMatch>
PHPの設定は以上.
ここまででvagrant boxのLAMP環境構築は完了.
boxファイル作成
ここからはホストマシンで作業.
boxに好きな名前を付けて保存する.
$ exit
起動中の仮想マシンからboxファイルを作成する.
$ vagrant package
作成した package.box を好きな名前にrenameしてVagrantに登録する.
今回は minimum/centos68amp
とした.
$ vagrant box add minimum/centos68amp package.box
minimum/centos68amp が追加されたことを確認する
$ vagrant box list
現在の仮想マシンは不要なので削除する
$ vagrant destroy -f
ここまででboxファイルの作成は完了.
今回は以上.