Laravel 5.8 on CentOS 7 + nginx 1.14 + MySQL 8 + php 7.1 (Vagrant)

Windowsに以下のソフトウェアがインストールされてあることが前提です。

https://www.vagrantup.com/
https://www.virtualbox.org/
https://git-scm.com/downloads

基本的にGit Bashで操作します。

※ワークディレクトリは各自で読み替えてください
CentOSの準備

作業ディレクトリを移動
$ cd /c/work/vagrants/

ディレクトリを作成
$ mkdir xprj.local

ディレクトリに移動
$ cd xprj.local/

BOXリストを確認
$ vagrant box list

設定ファイルを編集
$ vi Vagrantfile
----------------
config.vm.box = "ventos/7"

config.vm.network "private_network", ip: "192.168.33.10" # 各PCのネットワーク環境と合わせる必要あり
config.vm.hostname = "xprj.local"
config.hostsupdater.aliases = ["xprj.local", "phpmyadmin-xprj.local", "phpredisadmin-xprj.local"]
----------------

host名を自動で起動時に追加・停止時に削除をしてくれるプラグインをインストール
$ vagrant plugin install vagrant-hostsupdater

VM起動
$ vagrant up

ログイン確認
$ vagrant ssh

OSバージョン確認
[vagrant@xprj ~]$ cat /etc/redhat-release
CentOS Linux release 7.1.1503 (Core)

OSバージョンアップ(7.1 ⇒ 7.6)
[vagrant@xprj ~]$ sudo yum update
[vagrant@xprj ~]$ cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)

時刻を日本時刻に
[vagrant@xprj ~]$ timedatectl
[vagrant@xprj ~]$ sudo timedatectl set-timezone Asia/Tokyo
[vagrant@xprj ~]$ timedatectl

ファイアウォールを無効
[vagrant@xprj ~]$ sudo systemctl status firewalld
[vagrant@xprj ~]$ sudo systemctl stop firewalld
[vagrant@xprj ~]$ sudo systemctl disable firewalld
[vagrant@xprj ~]$ exit

VM再起動
$ vagrant reload
ログイン
$ vagrant ssh

SELinuxの設定を確認
[vagrant@xprj ~]$ sudo getenforce
Disabled

もしDisabledでなかったら変更が必要
[vagrant@xprj ~]$ sudo vi /etc/selinux/config
----------------------
#SELINUX=enforcing
SELINUX=disabled
----------------------
設定を変更したらVM自体の再起動が必要
[vagrant@xprj ~]$ exit
$ vagrant reload
$ vagrant ssh

php 7.1インストール

[vagrant@xprj ~]$ sudo yum install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
[vagrant@xprj ~]$ sudo yum install yum-utils
[vagrant@xprj ~]$ sudo yum-config-manager --enable remi-php71
[vagrant@xprj ~]$ sudo yum install php
[vagrant@xprj ~]$ php -v
[vagrant@xprj ~]$ sudo vi /etc/php.ini
--------------------------------
;date.timezone =
date.timezone = Asia/Tokyo
--------------------------------

nginxインストール

リポジトリ登録
[vagrant@xprj ~]$ sudo rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
インストール
[vagrant@xprj ~]$ sudo yum install nginx
バージョン確認
[vagrant@xprj ~]$ nginx -v
nginx version: nginx/1.14.2
起動テスト
[vagrant@xprj ~]$ sudo nginx -t
ステータス確認
[vagrant@xprj ~]$ sudo systemctl status nginx
起動
[vagrant@xprj ~]$ sudo systemctl start nginx
ステータス確認
[vagrant@xprj ~]$ sudo systemctl status nginx
自動起動設定
[vagrant@xprj ~]$ sudo systemctl enable nginx
ログアウト
[vagrant@xprj ~]$ exit

ブラウザで以下のURLにアクセスしnginxのデフォルトページが表示されることを確認する
http://192.168.33.10/
http://xprj.local/ # これでnginxのデフォルトページが表示されるはず。
Windos の /etc/hostsファイルの設定が効いているため

nginxでphpinfoを出すまで設定

サーバ設定ファイルを編集
[vagrant@xprj ~]$ sudo vi /etc/nginx/conf.d/xrpj.local.conf
----------------
server {
listen 80;
server_name xprj.local;
root /var/www/xprj.local;
index index.php;
access_log /var/log/nginx/xprj-access.log;
error_log /var/log/nginx/xprj-error.log;

location ~ \.php$ {
root /var/www/xprj.local;
#fastcgi_pass 127.0.0.1:9000;
fastcgi_pass unix:/var/run/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
----------------

htmlを配置するディレクトリを用意する
[vagrant@xprj ~]$ sudo mkdir /var/www/xprj.local

phpinfoファイルを用意
ファイル作成
[vagrant@xprj ~]$ sudo vi /var/www/xprj.local/phpinfo.php
----------------

mysql> exit

MySQLmysql 8.0 のセキュリティ設定
[vagrant@xprj ~]$ sudo mysql_secure_installation

Securing the MySQL server deployment.

Enter password for user root: <前出の初期パスワード>

Error: Access denied for user 'root'@'localhost' (using password: YES)
[vagrant@xprj ~]$ sudo mysql_secure_installation
----------------------------------
Securing the MySQL server deployment.

Enter password for user root:

The existing password for the user account root has expired. Please set a new password.

New password: を入力 ←適当パスワードです

Re-enter new password: を入力

Estimated strength of the password: 100
Change the password for root ? ((Press y|Y for Yes, any other key for No) : n
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y
Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y

All done!
----------------------------------

開発環境ではパスワード難易度を下げます
[vagrant@xprj ~]$ sudo systemctl stop mysqld
設定ファイルの[mysqld]の下に追記する
[vagrant@xprj ~]$ sudo vi /etc/my.cnf
----------------------------------
[mysqld]
# passwd strong level
validate_password.length=4
validate_password.mixed_case_count=0
validate_password.number_count=0
validate_password.policy=0
validate_password.special_char_count=0
----------------------------------
再起動
[vagrant@xprj ~]$ sudo systemctl start mysqld

ログイン確認
[vagrant@xprj ~]$ mysql -uroot -p
Enter password: を入力

パスワード難易度を下げたので簡単なパスワードに変更可能
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'password';

ログインしたらutf8mb4でデータベース作成する
mysql> CREATE DATABASE xprjdb DEFAULT CHARACTER SET utf8mb4;

db_userユーザーを作成する
mysql> CREATE USER 'db_user'@'%' IDENTIFIED BY 'password';
mysql> exit

ログイン確認
[vagrant@xprj ~]$ mysql -udb_user -p
Enter password: を入力
⇒ログイン可能であること

DB選択
mysql> USE xprjdb
⇒ERROR 1044 (42000): Access denied for user 'db_user'@'%' to database 'xprjdb'
 xprjdbに対してのアクセス権が無いので設定する

rootでログインしなおしたらdb_userに特定のデータベースにアクセスできる権限を付与
mysql> GRANT ALL ON xprjdb.* TO 'db_user'@'%';
mysql> GRANT ALL ON xprjdb.* TO 'db_user'@'%';

db_userでログインし直してDB選択
mysql> USE xprjdb
Database changed
⇒OK

mysql> exit

redis 5.0.3 のインストール

インストール
[vagrant@xprj ~]$ sudo yum install redis --enablerepo=remi
バージョン確認
[vagrant@xprj ~]$ redis-server -v
⇒Redis server v=5.0.3 sha=00000000:0 malloc=jemalloc-5.1.0 bits=64 build=5194991bde1f5722
バージョン確認
[vagrant@xprj ~]$ redis-cli -v
⇒redis-cli 5.0.3
ステータス
[vagrant@xprj ~]$ sudo systemctl status redis
起動
[vagrant@xprj ~]$ sudo systemctl start redis
ステータス
[vagrant@xprj ~]$ sudo systemctl status redis
自動起動
[vagrant@xprj ~]$ sudo systemctl enable redis
RedisのPHPライブラリをインストール
[vagrant@xprj ~]$ sudo yum install php-redis

設定ファイルの確認
[vagrant@xprj ~]$ sudo vi /etc/redis.conf
----------------
bind 127.0.0.1
----------------

再起動
[vagrant@xprj ~]$ sudo systemctl restart redis
[vagrant@xprj ~]$ sudo systemctl restart php-fpm
[vagrant@xprj ~]$ sudo systemctl restart nginx

ファイル作成
[vagrant@xprj ~]$ sudo vi /var/www/xprj.local/phpredis.php
----------------
pconnect('127.0.0.1');
$redis->set('dog', 'baw');
var_dump($redis->get('dog'));
----------------

ブラウザからアクセスしページが表示されることを確認する
http://xprj.local/phpredis.php
⇒bawが出たらOK

phpMyAdminのインストール

[vagrant@xprj ~]$ sudo yum install phpMyAdmin
[vagrant@xprj ~]$ sudo vi /etc/nginx/conf.d/phpmyadmin.conf
----------------
server {
listen 80;
server_name phpmyadmin-xprj.local;
root /usr/share/phpMyAdmin;
index index.php;
access_log /var/log/nginx/phpmyadmin-access.log;
error_log /var/log/nginx/phpmyadmin-error.log;

location ~ \.php$ {
fastcgi_pass unix:/var/run/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
----------------

再起動
[vagrant@xprj ~]$ sudo systemctl restart nginx && sudo systemctl restart php-fpm

アクセス確認
http://phpmyadmin-xprj.local/
⇒エラーが出る。
 原因はセッションディレクトリのパーミッションがapacheになっていた…

確認
[vagrant@xprj ~]$ sudo ls -la /var/lib/php/
所有グループを変更
[vagrant@xprj ~]$ sudo chgrp nginx /var/lib/php/*
確認
[vagrant@xprj ~]$ sudo ls -la /var/lib/php/

アクセス確認
http://phpmyadmin-xprj.local/

ログインできない場合はconfigファイルを適宜書き換える

sockファイルの場所を確認する
[vagrant@xprj ~]$ grep socket /etc/my.cnf
socket = /var/lib/mysql/mysql.sock

設定ファイル書き換える
[vagrant@xprj ~]$ sudo vi /etc/php.ini
----------------
pdo_mysql.default_socket = /var/lib/mysql/mysql.sock
mysqli.default_socket = /var/lib/mysql/mysql.sock
----------------

再起動
$ sudo systemctl restart php-fpm && sudo systemctl restart nginx

※ここまでできればよいのだが、MySQL 8 系になったことで挙動が変わったようだ。
 パスワードをmysql_native_password方式で保存しておかないと現状phpMyAdminからはアクセス不可。
 本番は通常の作成方法でよいと思われる。

⇒これでブラウザでrootユーザとdb_userとでpasswordを入力してログインOKだった。

phpMyAdminにログインすると警告が出ているのを調査したら、実はパーミッションが問題だった。
[vagrant@xprj ~]$ sudo ls -la /etc/phpMyAdmin/
[vagrant@xprj ~]$ sudo chgrp nginx /etc/phpMyAdmin/
[vagrant@xprj ~]$ sudo chgrp nginx /etc/phpMyAdmin/config.inc.php

phpRedisAdminのインストール

[vagrant@xprj ~]$ cd
[vagrant@xprj ~]$ git clone https://github.com/ErikDubbelboer/phpRedisAdmin.git
[vagrant@xprj ~]$ cd phpRedisAdmin
[vagrant@xprj ~]$ git clone https://github.com/nrk/predis.git vendor
[vagrant@xprj ~]$ cd ../
[vagrant@xprj ~]$ sudo mv phpRedisAdmin/ /usr/share/

[vagrant@xprj ~]$ sudo vi /etc/nginx/conf.d/phpredisadmin.conf
--------------------------------
server {
listen 80;
server_name phpredisadmin-xprj.local;
root /usr/share/phpRedisAdmin;
index index.php;
access_log /var/log/nginx/phpredisadmin-access.log;
error_log /var/log/nginx/phpredisadmin-error.log;

location ~ \.php$ {
fastcgi_pass unix:/var/run/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
--------------------------------

再起動
[vagrant@xprj ~]$ sudo systemctl restart php-fpm
[vagrant@xprj ~]$ sudo systemctl restart nginx

アクセス確認
http://phpredisadmin-xprj.local/

Laravel のインストール

Vagrant で開発環境を作っているが http://xprj.local/ とアクセスすると
Laravel のモックスタート画面が表示されるようにする。
参考 https://readouble.com/laravel/

[Git Bash] で作業開始

vagrantのホームディレクトリに移動
$ cd /c/work/vagrants/xprj.local
vagrantを起動
$ vagrant up
vagrantにログイン
$ vagrant ssh

たまには yum update でライブラリを最新化しておく
$ sudo yum update

ホームディレクトリに移動
[vagrant@xprj ~]$ cd
composerコマンドでlaravelをインストールする。
laravelappディレクトリが誕生するはず。
[vagrant@xprj ~]$ composer create-project --prefer-dist laravel/laravel laravelapp
⇒composerコマンドが無い
composerコマンドを準備する。

CentOS 7 の場合

[vagrant@xprj ~]$ sudo yum install epel-release.noarch
[vagrant@xprj ~]$ sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
[vagrant@xprj ~]$ sudo yum install --enablerepo=remi,remi-php71 php

composer のインストール

[vagrant@xprj ~]$ curl -sS https://getcomposer.org/installer | php -- --install-dir=/tmp
[vagrant@xprj ~]$ sudo mv /tmp/composer.phar /usr/local/bin/composer
[vagrant@xprj ~]$ composer -v

composerコマンドでlaravelをインストールする。
[vagrant@xprj ~]$ composer create-project --prefer-dist laravel/laravel laravelapp
appディレクトリを適切な場所に移動させます。
[vagrant@xprj ~]$ sudo mv laravelapp /vagrant/src/laravelapp

nginxの
[vagrant@xprj ~]$ sudo vi /etc/nginx/conf.d/xprj.local.conf
-----------------------------
server {
listen 80;
server_name xprj.local;
root /var/www/xprj.local/laravelapp/public;
index index.php;
access_log /var/log/nginx/xprj-access.log;
error_log /var/log/nginx/xprj-error.log;

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

location ~ \.php$ {
try_files $uri =404;
include fastcgi_params;
#fastcgi_pass 127.0.0.1:9000;
fastcgi_pass unix:/var/run/php-fpm.sock;
fastcgi_index index.php;
fastcgi_intercept_errors on;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
-----------------------------

再起動
[vagrant@xprj ~]$ sudo systemctl restart nginx

移動
[vagrant@xprj ~]$ cd /var/www/xprj.local/

確認
[vagrant@xprj ~]$ ls -la

laravelappが実態は/vagrant/src/laravelappを見るようにシンボリックリンクを作成します。
[vagrant@xprj ~]$ sudo ln -s /vagrant/src/laravelapp laravelapp

確認
[vagrant@xprj ~]$ ls -la

ブラウザで確認
http://xprj.local/
⇒Laravelのトップ画面が表示される。OK。

[vagrant@xprj ~]$ exit

[Git Bash]

=========================================================================
Laravel のモックスタート画面にログイン認証機能をartisanコマンドを
利用して少ない手順で構築する。
参考 https://www.ritolab.com/entry/51
=========================================================================

サンプルDBを用意する。
$ mysql -uroot -ppassword sample
mysql> create database sample;
mysql> show databases;

laravelルートディレクトリへ移動
[vagrant@xprj ~]$ cd /var/www/xprj.local/laravelapp/

設定ファイルを編集する
[vagrant@xprj ~]$ sudo vi .env
------------------------------------
DB_DATABASE=sample
DB_USERNAME=db_user
DB_PASSWORD=password
------------------------------------

artisanコマンドでマイグレーションを実行する
$ php artisan migrate

実行結果
[vagrant@xprj ~]$ php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated: 2014_10_12_100000_create_password_resets_table

DBにテーブルが作成されていることを確認する
[vagrant@xprj ~]$ mysql -uroot -ppassword sample

マイグレーションの管理テーブルのカラムを確認する。
mysql> DESC migrations;
mysql> DESC password_resets;
mysql> DESC users;
mysql> exit

[vagrant@xprj ~]$ cd /var/www/xprj.local/laravelapp/

コマンドで認証に必要となるルート定義とビューを生成する
[vagrant@xprj ~]$ php artisan make:auth
Authentication scaffolding generated successfully.
⇒コントローラーやビューファイルなどが生成される。

続いてパスワードリセットする際にメール送信する必要が
あるため、メール送信にかかわる設定を行います。

以下はGMailサービスをメールサーバとして開発する場合向けです。

ブラウザでGoogleアカウントにログインします。
https://myaccount.google.com/

左側メニューの
>セキュリティ
>安全性の低いアプリのアクセス に進み
「無効」から「有効」に変換します。

[vagrant@xprj laravelapp]$ sudo vi .env
------------------------------------
MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=xxxxxxxxxxxxxxxx@gmail.com
MAIL_PASSWORD=xxxxxxxxxxxxxxxx
MAIL_ENCRYPTION=tls
------------------------------------

これにてブラウザでリセットパスワードを試すとGMailにメールが届きます。

ただしメール文面が localhostになっているので
今後メール文面を修正する必要が出てきます。
とりあえずドメイン部分を手動で書き換えたURLに対して動作確認を行えればOKです。

GMail以外でも個人で利用している自身のプロバイダのメールサーバで送信設定を行っても良いと思います。

ブラウザで確認する
http://xprj.local/
⇒OK