初心者がVagrantでローカル環境にLAMP環境構築してみた

LAMP環境でサイト制作することが多いので、VagrantでローカルにLAMP環境構築してみたメモ。

---

# ローカル環境
マシン：mac os 10.15.4
知識：Linuxを少しいじったことがあるくらい


# 構築環境


| LAMP | version |
| --- | --- |
| centOS | 7 |
|APACHE|2.4|
|PHP|7.3|
|MYSQL|8.0|

---


# 手順

## 1，VirtualBoxをインストール
https://www.virtualbox.org/wiki/Downloads

## 2，Vagrantをインストール
https://www.vagrantup.com/downloads.html

## 3，Vagrantfileを設置

### 3-1，Vagrantfile作成
作業用のフォルダを作成しcuiで該当ディレクトリに移動し下記コマンドをうつ

```
vagrant init centos/7
```
### 3-2，Vagrantfile修正

Vagrantfile が作成されるので下記と差し替え

- Vagrantfile：OS情報や基本的な環境設定が記載された。ファイル中身を書き換える

```shell:Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"
  config.vm.network :private_network, ip: "192.168.33.10"
  config.vm.provider "virtualbox" do |vb|
   # GUIの有無
   vb.gui = false
   # 仮想マシンの名前
   vb.name = "centOS7"
   # 仮想マシンが使うメモリ(MB)
   vb.memory = "2048"
   # 仮想マシンが使うCPU
   vb.cpus = 1
 end

  # 秘密鍵の場所
  config.ssh.private_key_path = "/Users/xxxxxxx/.vagrant.d/insecure_private_key"
  config.ssh.insert_key = false
  if Object.const_defined? 'VagrantVbguest'
    config.vbguest.auto_update = false
    config.vbguest.no_remote = true
  end
  # ミドルウェアのインストール
  config.vm.provision :shell, keep_color: true, path: "Vagrantfile.provision.sh"
  # ホスト環境のフォルダをマウント（初期ではエラーになるのでコメントアウトしとく）
  # config.vm.synced_folder "xxxxxxxxxxx", "/var/www/html", mount_options: ['dmode=777','fmode=777']

end
```
Vagrantfile の下記行は適宜自分の環境に置き換える。

```
config.ssh.private_key_path = "/Users/xxxxxxx/.vagrant.d/insecure_private_key"
```

### 3-3，ミドルウェアインストールファイルの設置
ミドルウェア（Apache,Mysql,Php）のインストールのためのシェルスクリプトを設置

- Vagrantfile.provision.sh：ミドルウェアをインストールするためのシェルスクリプトを記載。（ファイル名は任意）

```sh:Vagrantfile.provision.sh
#filename: Vagrantfile.provision.sh
#!/usr/bin/env bash

# timezone
cp -p /usr/share/zoneinfo/Japan /etc/localtime

# history format
HISTTIMEFORMAT='%y/%m/%d %H:%M:%S ';


# yumにリポジトリ追加してupdate
sudo yum -y install epel-release
sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
sudo yum -y update

# yumでmariadbは削除
sudo yum remove mariadb-libs
sudo rm -rf /var/lib/mysql/

# yumで apatch mod_ssl wget git curl vim unzip インストール
sudo yum -y install httpd mod_ssl wget git curl vim unzip
# yumで 拡張パッケージ インストール
sudo yum -y install gcc gcc-devel curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-ExtUtils-MakeMaker

# php7.3 インストール
sudo yum -y install --enablerepo=epel,remi,remi-php73 php php-{devel,mbstring,mysql,pdo,xml,gd,mcrypt,opcache,pear,pecl-ssh2,pecl-zip}

# composer
curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer

# ポート開放(SELinux無効化)
sudo systemctl restart firewalld
sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --reload
sudo setenforce 0

# Apacheの起動、自動起動設定
sudo systemctl start httpd
sudo chkconfig httpd on

# PHPの設定ファイルのバックアップ、timezoneの設定
cp /etc/php.ini /etc/php.ini.org
sed -i -e "s/date\.timezone =/date\.timezone = Asia\/Tokyo/g" /etc/php.ini

# /etc/httpd/conf/httpd.confのバックアップと編集
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

#Apachenのバージョン非表示
sed -i -e "s/ServerTokens OS/ServerTokens Prod/g" /etc/httpd/conf/httpd.conf
lineNum=`sudo grep "AddType application/x-gzip .gz .tgz" -n /etc/httpd/conf/httpd.conf | cut -d ":" -f 1`
if [ $lineNum ]; then
  sudo sed -i -e "${lineNum}a \    AddType application/x-httpd-php .php" /etc/httpd/conf/httpd.conf
  lineNum=$((lineNum+1))
  sudo sed -i -e "${lineNum}a \    AddType application/x-httpd-php-source .phps" /etc/httpd/conf/httpd.conf
fi


# mysql8 インストール
sudo yum -y localinstall https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
sed -i 's/enabled=1/enabled=0/g' /etc/yum.repos.d/mysql-community.repo
sudo yum -y install --enablerep=mysql80-community mysql-community-server mysql-community-devel

# MySQLの起動と設定
systemctl restart mysqld

# 必要最小限のMySQLの設定内容を書き込む
cat << __CONF__ >> /etc/my.cnf
character-set-server = utf8
default_password_lifetime = 0
default-authentication-plugin = mysql_native_password
validate_password.policy = LOW
__CONF__

# MySQLの自動起動を有効化し起動する
systemctl enable mysqld
systemctl start mysqld


# httpd.confの反映
sudo systemctl restart httpd
```


## 4，Vagrantのコマンド実行
下記コマンドでVagrand実行し仮想環境を立ち上げる

```
vagrant up
```


## 5，Vagrant環境へログイン

下記コマンドで作成した仮想環境にSSH接続する

```
vagrant ssh
```

無事ログインできたら必要なミドルウェアがインストールされているか確認

```
yum list installed | grep httpd
httpd -v

yum list installed | grep php
php -v

yum list installed | grep mysql
mysqld -V
```



## 6，MYSQLの初期設定
vagrant環境にSSH接続しrootのパスワード変更する。
その後各種ユーザー作成する
（下記記載はMiiT+）


```
######################################################
## MYSQLの設定
#######################################################

# rootに変更
sudo su

# 初期パスワードを取得する
cat /var/log/mysqld.log | grep "A temporary password" | tr ' ' '\n' | tail -n1

# 最低限のセキュリティ設定
mysql_secure_installation

```

## 7，Vagrant環境（ゲストOS）にローカル環境（ホストOS）のフォルダ（ディレクトリ）をマウント（共有化）

長くなったので続きは
[初心者がVagrantでローカル環境にLAMP環境構築してみた（マウント編）](https://qiita.com/tonkatu_tanaka/items/25f3bc482d33a3cd1276)
に記載。

---

# Vagrandコマンドメモ


| コマンド | 内容 | 注釈 |
| --- | --- | --- |
| vagrant init | Vagrantfile作成 | 環境構築の最初の一歩すでに Vagrantfile がある場合は不要 |
| vagrant up | Vagrantで仮想環境立ち上げ | Vagrantfile に記述された環境が作成される、2回目以降は基本環境立ち上げ |
| vagrant reload | 再起動 | 仮想環境の再起動 |
| vagrant halt | シャットダウン | 仮想環境のシャットダウン。癖つけよう |
| vagrant destroy | 環境削除 | 作成した環境を削除 |


# 参考

初心者必読：【Linux環境構築】VagrantとVirtualBoxとは？使い方を初心者向けに解説！
https://kitsune.blog/linux-environment

参考：vagrant up 時の共有フォルダのマウントエラー解消方法
https://qiita.com/takutoki/items/33cf1230e032931f9adc

参考：Install MySQL 8.0 on CentOS 7
https://qiita.com/ymasaoka/items/7dc131dc98ba10a39854