Centos7にNginx、Laravel6、MySQLの開発環境を作る

# はじめに
Nginxとphp-fpmの権限関連でハマったので、まとめることにしました。

# 実践

ゴール

・Nginx
・PHP 7.4
・Laravel6
・MySQL

## やっていくこと

・Nginx、PHP7.4のインストール
・Laravel6のインストール
・MySQLのインストール
・Laraveのindex.phpの表示

### Nginxのインストール

公式のに従いましょう。[nginx: Linux packages](http://nginx.org/en/linux_packages.html)

```
$ sudo yum install -y yum-utils
$ sudo vi /etc/yum.repos.d/nginx.repo
```

書き込むもの

```/etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
```

うまくいっているかの確認。以下の通りになればおk。

```
$ yum info nginx
利用可能なパッケージ
名前                : nginx
アーキテクチャー    : x86_64
エポック            : 1
バージョン          : 1.18.0
リリース            : 1.el7.ngx
容量                : 772 k
リポジトリー        : nginx-stable/7/x86_64
要約                : High performance web server
URL                 : http://nginx.org/
ライセンス          : 2-clause BSD-like license
説明                : nginx [engine x] is an HTTP and reverse proxy server, as well as
                    : a mail proxy server.
```

そしたら、インストールして起動までの設定もやっていく。

```
$ sudo yum install -y nginx
$ sudo systemctl enable nginx
$ sudo systemctl start nginx
```

ここで確認したくなるけど、多分表示されない。初期の設定だと、firewallとSELinuxに捕まるからその設定をしにいく。また、この時Cloud9用のポートも開けておく。

```
$ sudo vi firewall.sh
```

```firewall.sh
#!/bin/sh

firewall-cmd --permanent --add-service=http --zone=public
firewall-cmd --permanent --add-service=https --zone=public
firewall-cmd --permanent --zone=public --add-port=8080/tcp
firewall-cmd --permanent --zone=public --add-port=80/tcp
firewall-cmd --permanent --zone=public --add-port=443/tcp
firewall-cmd --reload
```

```
$ sudo bash firewall.sh
```

これ以降、スクリプトを多用する。よくわからなかったら、全部の先頭にsudoをつけて実行してくれれば良い。

次に`SELinux`の設定。

```
$ sudo vi /etc/selinux/config
SELINUX=permissive
```

今回はpermissiveを試してみます。不安であれば、disabledでも良いと思います。設定を有効化するために再起動します。

```
$ sudo reboot
```

これでアクセスできるはずです。URLは、`http://localhost`または、端末のIPがわかれば`http://端末のIP`でいけるはずです。

### PHP7.4のインストール

Remiリポジトリを利用していきます。`dnf`はいらないかもしれません。

```remi.sh
#!/bin/sh

yum -y install wget
yum -y install epel-release

# Remiリポジトリの追加
rpm -ivh http://ftp.riken.jp/Linux/remi/enterprise/remi-release-7.rpm
```

```
$ sudo bash remi.sh
```

上手くいったらレポジトリの確認をします。その後、php74がRemiレポジトリにあるかを確認します。確認できたら、レポジトリを対応させてインストールします。バージョン確認で、表示されたら成功です。

```
$ sudo yum repolist

base/7/x86_64              CentOS-7 - Base
epel/x86_64                Extra Packages for Enterprise Linux 7 - x86_64
extras/7/x86_64            CentOS-7 - Extras
remi-safe                  Safe Remi's RPM repository for Enterprise Linux 7 - x86_64

$ sudo yum info php74
利用可能なパッケージ
名前                : php74
アーキテクチャー    : x86_64
バージョン          : 1.0
リリース            : 3.el7.remi
容量                : 2.6 k
リポジトリー        : remi-safe
要約                : Package that installs PHP 7.4
ライセンス          : GPLv2+
説明                : This is the main package for php74 Software Collection,
                    : that install PHP 7.4 language.

$ sudo yum -y install --enablerepo=epel,remi,remi-php74 php

$ php -v
PHP 7.4.5 (cli) (built: Apr 14 2020 12:54:33) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
```

そうしたら、インストール関連の要件で必要なものを調べてから、インストールします。満たさないといけない用件は以下の通りです。
・PHP >= 7.2.0
・BCMath PHP拡張
・Ctype PHP拡張
・Fileinfo PHP拡張
・JSON PHP拡張
・Mbstring PHP拡張
・OpenSSL PHP拡張
・PDO PHP拡張
・Tokenizer PHP拡張
・XML PHP拡張

```
# 確認のコマンド
$ php -m | grep -e bcmath -e ctype -e fileinfo -e json -e mbstring -e openssl -e PDO -e tokenizer -e ^xml$

ctype
fileinfo
json
openssl
tokenizer
```

自分の環境の場合、BCMathとMbstring、PDO、XMLが不足していました。また、先ほどインストールにはRemiレポジトリを利用したため、引き続き利用してインストールしていきます。

```
$ sudo yum -y install --enablerepo=epel,remi,remi-php74 php-bcmath php-mbstring php-pdo php-xml php-cli php-devel php-zip php-fpm php-mysqlnd 
```

また必要なツールが足りなかったので追加でインストールしました。

#### phpinfoを表示させる

まず、`index.php`を作っていく。

```
$ sudo vi /var/www/html/index.php
```

```index.php
<?php
    phpinfo();
?>
```

あと権限とユーザーの設定。ここら辺は不安なところがあるので、わかる人はコメントをいただけると幸いです。

```
# グループの確認
$ sudo cat /etc/group
nginx:x:995:

# グループ内のユーザー確認
$ groups nginx
nginx : nginx

$ sudo chown $USER:nginx -R /var/www
$ sudo chmod 755 -R /var/www
```

そうしたら、`php-fpm`の設定。注意点としては、`Apache`と違って`www-data`はなく、`nginx`のユーザーとグループを使っている。

```
$ sudo vi /etc/php-fpm.d/www.conf

user = nginx
group = nginx

# ここの名前はNginxのFastCGIで使うときに合わせるから気をつけて
listen = /var/run/php-fpm/php-fpm.sock

listen.owner = nginx
listen.group = nginx

# 保存したら再起動
$ sudo service php-fpm start
```

そうしたらドキュメントルートの設定。

```
$ sudo cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.org
$ sudo vi /etc/nginx/conf.d/default.conf
```

```
server {
    listen       80;
    server_name  localhost;

    root   /var/www/html;
    index  index.php index.html index.htm;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

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

    #error_page  404              /404.html;

    # エラー確認用に敢えてコメントアウトしてます
    # 動くようになったら戻してね

    # 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;
    #}

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ \.php$ {
        # 自分はrootの設定も必要だったので修正しました
        root           /var/www/html
        fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}
```

そしたら諸々再起動

```
$ sudo systemctl enable php-fpm.service
$ sudo systemctl enable nginx.service
$ sudo service nginx restart
$ sudo service php-fpm restart
```

### Laravel6のインストール

LaravelをインストールするためにComposerをインストールしていきます。

```
$ sudo wget https://getcomposer.org/installer -O composer-installer.php

$ sudo php composer-installer.php --filename=composer --install-dir=/usr/local/bin

$ composer self-update

$ composer -v
```

最後のコマンドが通ったら、Composerのインストールは完了です。Composerを利用して、Laravel6をインストールしていきましょう。ここまできたら、[日本語訳公式](https://readouble.com/laravel/6.x/ja/installation.html)のインストール手順が使えるので、それを元に進めます。

```
$ composer global require laravel/installer
```

そうしたら、ドキュメントにある通りにパスを通します。コマンドで確認してから、そのパスを通すのが良いと思います。パスのパターンは２種類あるので、どちらでも良いかもしれません。

`$HOME/.config/composer/vendor/bin`
`$HOME/.composer/vendor/bin`

```
# パスを通すディレクトリの確認法
$ composer global about

Changed current directory to /home/centos/.config/composer
Composer - Dependency Manager for PHP
Composer is a dependency manager tracking local dependencies of your projects and libraries.
See https://getcomposer.org/ for more information.

# パスを通す
$ export PATH=$PATH:$HOME/.config/composer/vendor/bin

# 確認
$ echo $PATH
# 一番後ろが以下のようになっていれば成功です
:/home/centos/.config/composer/vendor/bin

# 一応永続化
$ source ~/.bash_profile
```

ユーザーのホームディレクトリ以下では`laravel new アプリ名`でアプリを作ることができます。ただ今回は、公開ディレクトリに作りにいきましょう。なのでコマンドが変わります。

```
$ cd /var/www/html
$ composer create-project --prefer-dist laravel/laravel blog "6.*"
```

今回は、`blog`という名前でアプリケーションを作っていきます。
Laravelの初期設定をしていきます。`.env`ファイルの設定は、MySQLの設定後にやります。

```
$ sudo chown $USER:nginx -R blog
$ sudo find blog -type d -exec chmod 750 {} \;
$ sudo find blog -type f -exec chmod 640 {} \;
$ sudo chmod 770 -R blog/storage blog/bootstrap/cache
```

#### Nginxの設定
Nginxのドキュメントルートを変更していきます。

```
$ sudo vi /etc/nginx/conf.d/default.conf
```

```/etc/nginx/conf.d/default.conf
server {
    listen       80;
    server_name  localhost;

    # blog/public が追加されました
    root   /var/www/html/blog/public;
    index  index.php index.html index.htm;

    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

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

    #error_page  404              /404.html;

    # 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;
    #}

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ \.php$ {

        # blog/public が追加されました
	    root	       /var/www/html/blog/public;
        fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}
```

そしたら、リスタート。

```
$ sudo service nginx restart
```

ここで、URLにアクセスしてみると`Laravel`の画面が表示されました。

### MySQLのインストール

MariaDBを削除してからインストールします。MySQLのyumリポジトリから`No thanks,just start my download.`のリンクをコピーして入れます。
[MySQL Community Downloads](https://dev.mysql.com/downloads/repo/yum/)

```
$ rpm -qa | grep maria
$ sudo yum -y remove mariadb-libs
$ sudo rm -rf /var/lib/mysql/

$ sudo yum -y install https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
```

インストールできるかを確認してみましょう。

```
$ yum info mysql-community-server

利用可能なパッケージ
名前                : mysql-community-server
アーキテクチャー    : x86_64
バージョン          : 8.0.20
リリース            : 1.el7
容量                : 488 M
リポジトリー        : mysql80-community/x86_64
要約                : A very fast and reliable SQL database server
URL                 : http://www.mysql.com/
ライセンス          : Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights
                    : reserved. Under GPLv2 license as shown in the Description field.
```

インストールと確認。

```
$ sudo yum -y install mysql-community-server

/usr/sbin/mysqld  Ver 8.0.20 for Linux on x86_64 (MySQL Community Server - GPL)

$ sudo systemctl start mysqld
$ sudo systemctl enable mysqld
```

大抵は、`5.7`を使っていますが、期限も近いので`8.0`を使ってみることにしました。

そうしたら、データベースの設定をしていきます。

```
$ sudo cat /var/log/mysqld.log | grep 'temporary password'

A temporary password is generated for root@localhost: ここのパスワードを覚えておいてください

$ mysql -u root -p
Enter password: さっきのパスワードを入力します。

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'P@ssw0rd';
mysql> create database laravel;
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| laravel            |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

mysql> exit
Bye
```

ここで`laravel`のテーブルが追加されていればOKです。

#### `.env`ファイルの設定

さっきあえてやらなかった`.env`ファイルの設定をしていきます。

```
$ cd /var/www/html/blog
$ cp .env.example .env
$ php artisan key:generate
$ vi .env
```

内容

```.env
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=さっき設定したパスワードを入力
```

最後にマイグレートしてエラーが出なければ成功です。

```
$ php artisan migrate
```

ここまできてうまくいかなかった時は、再起動してみてください。


## 参考

インストール関連
・[Laravel 7 インストール（CentOS8/PHP7.4）](https://www.ritolab.com/entry/203)
・[CentOS7でphp7.4をインストールしようとして躓いた話](https://qiita.com/print_hello/items/ae14cb3989b0806a63c7)

権限とユーザー関連
・[Laravelのパーミッションを適切に設定](https://qiita.com/engulisyu/items/ad819d06ea0cd31411df)
・[「root→自分のユーザー名」に変更すると危険でしょうか？](https://forums.ubuntulinux.jp/viewtopic.php?id=7126)
・[linuxのユーザー権限とグループについて教えてください
](https://teratail.com/questions/158549)・[Nginxの公開ディレクトリのパーミッションについて](https://teratail.com/questions/66972)


設定関連
・[EC2にWordPressをインストールする](https://hacknote.jp/archives/39600/)
・[MySQL 5.7 を CentOS 7 に yum インストールする手順](https://weblabo.oscasierra.net/installing-mysql57-centos7-yum/)
・[nginx サーバーに PHP, MySQL を入れる](https://qiita.com/Dal_/items/5c937796f91dda9e63cd)
・[nginx と PHP-FPM の仕組みをちゃんと理解しながら PHP の実行環境を構築する](https://qiita.com/kotarella1110/items/634f6fafeb33ae0f51dc)
・[nginx ディレクトリのPermissionをwww-dataに変えたい。](https://teratail.com/questions/2975)
・[nginxで403を回避するために、パブリックファイルの権限についておさらい](https://qiita.com/taumu/items/88c294a77c6499cbb988)

コマンド
・[Groupを確認したり、追加したりする方法まとめ](https://qiita.com/ritukiii/items/75f98432c47b3b0d3647)
・[【 usermod 】コマンド――ユーザーアカウントの情報を変更する](https://www.atmarkit.co.jp/ait/articles/1612/14/news022.html)

ドキュメント
・[Laravel 6.x インストール
](https://readouble.com/laravel/6.x/ja/installation.html)