Vagrant + VirtualBox で CentOS8 + Nginx + PHP7.4 + MySQL8.0環境を構築する

仕事上、掲題の開発環境を構築する必要があったので構築。
その時のメモを残す。

# 必要アプリケーション
~~バージョンは最新で問題ない。~~
自分の環境にあったものを選んでローカルにインストールする。

- vagrant （URL：https://www.vagrantup.com/ ）
- virturalbox （URL：https://www.virtualbox.org/ ）

※2019/01/22追記
vagrantの最新バージョンがvirturalbox 6.1系に対応していない。
どうしてもvirturalbox 6.1系を使いたい場合は以下を参考にvagrantのコアファイルを修正すること
https://qiita.com/shuu1222/items/7a6d04172363be44025c

# フォルダ構成
以下のようなフォルダ構成で作成

```shell:フォルダ構成
作業フォルダ
　├ src              // WEBルートにマウントするソースなどを格納
　└ vagrant          // vagrantfileを配置。
　 　└ Vagrantfile
```

# Vagrantfileの作成
VagrantからVirtualBoxを起動するための設定ファイルを作成する。

###CentOS8をマウント
後々配布できるように個別でダウンロードしないで済むようにvagrant cloud上にあるファイルを指定しておく。
https://app.vagrantup.com/generic/boxes/centos8

```ruby:Vagrantfile
Vagrant.configure("2") do |config|
  # CentOS8
  config.vm.box = "generic/centos8"
end
```

### ネットワーク設定
ネットワーク設定を追加。IPアドレスは適当。
とりあえずprivate指定。
スマホアクセスなどしたいないなら以下を参照。
https://qiita.com/kurkuru/items/4a4879e01944a7c08f1d

```ruby:Vagrantfile
Vagrant.configure("2") do |config|
  # CentOS8
  config.vm.box = "generic/centos8"

  # ネットワーク設定
  config.vm.network "private_network", ip: "192.168.50.11"
end
```

### CPU/メモリ設定
ここも設定は適当。小さすぎず大きすぎずでいいと思う

```ruby:Vagrantfile
Vagrant.configure("2") do |config|
  # CentOS8
  config.vm.box = "generic/centos8"

  # ネットワーク設定
  config.vm.network "private_network", ip: "192.168.50.11"

  # メモリ/CPU
  config.vm.provider "virtualbox" do |vb|
    vb.memory = 1024
    vb.cpus = 1
  end
end
```

### 同期フォルダ設定
仮想環境上にマウントするソースフォルダの設定を入れる。
開発環境用なので、フルアクセス。
**vagrantフォルダをマウントしているのは後々プロビジョンするため。しないなら必要ない。**

```ruby:Vagrantfile
Vagrant.configure("2") do |config|
  # CentOS8
  config.vm.box = "generic/centos8"

  # ネットワーク設定
  config.vm.network "private_network", ip: "192.168.50.11"

  # メモリ/CPU
  config.vm.provider "virtualbox" do |vb|
    vb.memory = 1024
    vb.cpus = 1
  end

  # 同期フォルダ
  config.vm.synced_folder "../src", '/var/www/[任意の名前]', :mount_options => ['dmode=777', 'fmode=777']
  config.vm.synced_folder ".", '/vagrant', :mount_options => ['dmode=777', 'fmode=777']
end
```

# 仮想環境起動確認
作成したVagrantfileを使って仮想環境を立ち上げる。
使用するターミナルツール(コマンドプロンプトやPowershellなど）はなんでもいい。
エラーなく立ち上がてばOK。

```shell
cd 作業フォルダ/vagrant
vagrant up
```

# 仮想環境にアクセス
vagrantのSSH転送機能を使って楽にアクセス。

```shell
vagrant ssh
```

# 仮想環境の設定　※省略可
いよいよnginx,php,mysqlなどをインストールしていくのだが、その前に色々下地を整えておく。
ここで詳細を書くと長くなるので、参考リンクやコマンド単体を記載。

- SELinuxを無効化（ https://qiita.com/hanaita0102/items/5d3675e4dc1530b255ba ) 
- Beep音を無効化 ( https://qiita.com/vmmhypervisor/items/4bae747f7518e083570a )
- 環境を日本語化 ( https://www.server-world.info/query?os=CentOS_8&p=japanese )
- 時刻を日本標準時設定

```shell
sudo timedatectl set-timezone Asia/Tokyo
```

- firewall設定 ※offにしてもいい。

```shell
sudo firewall-cmd --add-service=http --permanent      # HTTPアクセスの許可
sudo firewall-cmd --add-service=https --permanent     # HTTPSアクセスの許可
sudo firewall-cmd --add-port=9000/tcp --permanent     # PHP Xdebug用にポート開放
sudo firewall-cmd --reload

# offにするなら
sudo systemctl stop firewalld
```

設定後vagrantを再起動

```shell
vagrant halt
vagrant up
```

# PHP7.4とNginxのインストールと設定
設定ファイルやらなんやらが関係しているので1つの章でまとめる。

### Nginxのインストール
```shell
sudo dnf install -y nginx
```
### php7.4のインストール
CentOS8の標準は7.2のためリポジトリを先に落とす。

```shell
sudo dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
sudo dnf install -y https://rpms.remirepo.net/enterprise/remi-release-8.rpm
```

デフォルトのphpモジュールを切る。
切らないと毎回リポジトリ指定をしてインストールしないといけないため。

```shell
sudo dnf module disable -y php 
```

php7.4をremiからインストール

```shell
sudo dnf module install -y php:remi-7.4 
# 関連して php-fpm,php-mbstring,php-json もインストールされる
```

他必要関連パッケージをインストール。

```shell
sudo dnf install -y php-mysqlnd php-pecl-xdebug php-intl php-zip
```
### xdebug設定
開発しやすいように設定を入れる。

```conf:/etc/php.d/15-xdebug.ini
# 追加
xdebug.default_enable = 1
xdebug.remote_enable = On
xdebug.remote_autostart = On
xdebug.remote_connect_back = On
xdebug.remote_port = 9000
```

### php-fpmの設定
nginxでphpを使うために動作ユーザをnginxにしてやる。
他の細かい設定など今回は割愛。
興味がある人は以下を参照。めっちゃ詳しい。
https://qiita.com/kotarella1110/items/634f6fafeb33ae0f51dc

```conf:/etc/php-fpm.d/www.conf
# ~~省略
# 追加
listen.owner = nginx
listen.group = nginx

#修正
user = nginx     #apache から変更
group = nginx    #apache から変更
# ~~省略
```
### nginxの設定
今後、いくつか同じ環境上に別サイトを構築する必要があったので、
デフォルトのまま、httpブロックの末尾にconf.dの読み込みを追記

```conf:/etc/nginx/nginx.conf
# ~~省略
http {
・・・

    include /etc/nginx/conf.d/*.conf;
}
```

構築サイトの設定を追加
他変なファイルにアクセスさせないなどの設定はあるが割愛。

※2020/11/12追記
`fastcgi_pass unix:/run/php-fpm/php-fpm.sock;`の部分はもしかしたら`fastcgi_pass unix:/run/php-fpm/www.sock;`じゃないと動かないかもしれません。
`/etc/php-fpm.d/www.conf`の`listen`の値と一致させれば動きますので、動かない場合は確認して修正をお願いします。

```conf:/etc/nginx/conf.d/default.conf
server {
    listen       80;
    server_name  [任意のアクセスドメイン名];
    root    /var/www/[Vagrantfileで設定したルート名];
    index   index.php;

    charset utf-8;
    access_log  /var/log/nginx/access.log  main;
    error_log  /var/log/nginx/error.log;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    # redirect server error pages to the static page /50x.html
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # pass the PHP scripts to FastCGI server listening on php-fpm.sock;
    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
        try_files $uri =404;
    }
}
```

プロセス再起動。ついでにOS起動時に動くように設定。

```shell
sudo systemctl restart nginx
sudo systemctl restart php-fpm
sudo systemctl enable nginx
sudo systemctl enable php-fpm
```

# ブラウザからアクセス確認
ローカルのhostsファイルにローカルのドメインを追加

```conf:\Windows\System32\drivers\etc\hosts
# 追記
192.168.50.11 [/etc/nginx/conf.d/default.confで設定したドメイン名]
```

テストでphpinfoを置く。

```shell
cd /var/www/[ルート]
echo '<?php phpinfo();' > index.php
```

ブラウザから「http://[設定したドメイン名]」にアクセスしてphpinfoが表示されればOK

# mysql8.0のインストールと設定
CentOS8だと特に特別なリポジトリを落とさないでもデフォルトでmysql8がインストールできる。

```shell
sudo dnf install -y @mysql
```

初期設定。
開発環境なので緩い設定（initialize-insecure）にしておく。

```shell
sudo rm -rf /var/lib/mysql
sudo  mysqld --initialize-insecure --datadir=/var/lib/mysql --user=mysql
```

あと色々あるが、以下を入れておけばとりあえずOK。

```conf:/etc/my.cnf
# 追加
# mysqlではひらがなカタカナを判別
collation_server = utf8mb4_ja_0900_as_cs_ks
```

再起動と自動起動設定

```shell
sudo systemctl restart mysqld
sudo systemctl enable mysqld
```

DBの作成とユーザの作成

```shell
mysql -u root
> create database [作成したいDB名]
> create user 'ユーザ名'@'localhost' IDENTIFIED BY 'パスワード';
> grant all privileges on DB名.* TO 'ユーザ名'@'localhost';
```

以上。