[Laravel-adminを導入しよう！その3] CentOS Stream8にLaravel9（PHP8、Nginx、MariaDB）をインストールする

1. [[Laravel-adminを導入しよう！その1] ConoHa VPSにCentOS Stream8をインストールしVSCodeでSSH接続できるようにする - Qiita](https://qiita.com/yuki-masaki/items/8d8e2f595f26a20cdf80)
2. [[Laravel-adminを導入しよう！その2] CentOS Stream8にNginx、PHPをインストールする - Qiita](https://qiita.com/yuki-masaki/items/4d9c2fb4769512049f03)
3. [[Laravel-adminを導入しよう！その3] CentOS Stream8にLaravel9（PHP8、Nginx、MariaDB）をインストールする - Qiita](https://qiita.com/yuki-masaki/items/fe412f961b5164536c64) ←本記事
4. [[Laravel-adminを導入しよう！その4] [CentOS Stream8 & Nginx] 無料のSSL証明書「Let's Encrypt」でSSL化する - Qiita](https://qiita.com/yuki-masaki/items/fc1e0d73c49d9afdda7e)
5. [[Laravel-adminを導入しよう！その5] Laravel-adminをインストールしSSL化する - Qiita](https://qiita.com/yuki-masaki/items/172bd66f26f9932906e0)

# サーバー構成
OS: CentOS Stream8
Nginx: 1.20.2
PHP: 8.1.5
MariaDB: 10.3.28
Laravel: 9.9.0

# 概要
本シリーズは、VPS上に構築したCentOSに、IT資産管理ツールを構築することを最終目的としています。
IT資産管理ツールのUIは、Laravelの管理画面ライブラリである「Laravel-admin」を使用する予定です。
[前回の記事](https://qiita.com/yuki-masaki/items/4d9c2fb4769512049f03)では、NginxとPHPのインストールをしました。
今回は、MariaDBとLaravelのインストール手順を説明していきます。

# MariaDBをインストールする
### MariaDBをインストール
MariaDB、Composerのインストールは下記サイトが参考になりました。

https://reuhul.org/129

```bash
sudo dnf -y install mariadb-server
sudo systemctl enable mariadb
sudo systemctl start mariadb
# 下記コマンドを実行するとDBのセットアップが始まります。
sudo mysql_secure_installation
```

```bash
Enter current password for root (enter for none): 
#空欄のままEnterキー

Set root password? [Y/n]
# yを押してEnter
# rootユーザーのパスワードを設定します。
# あとで使用するので控えておいてください。
```

あとはすべてyを押してEnterキーでOKです。

### 開発用データベースとユーザーの作成
MariaDBのコンソールにログインします。
```bash
mysql -u root -p
#さきほど設定したrootユーザーのパスワードを入力します。
```

```bash
# データベース作成（「laravel」という名前のデータベースを作成します。）
craete database laravel;

# ユーザー作成（「dev」という名前のユーザーを作成します。）
# パスワードは伏字にしています。
create user 'dev'@'localhost' identified by '********';

# データベース「laravel」へのアクセス権（全権）を付与
grant all on laravel.* to 'dev'@'localhost';
```

# Laravelをインストールする
### Composerをインストール
事前に、[Composer公式サイト](https://getcomposer.org/download/)を参考にComposerをインストールします。
※インストールコマンドはバージョンによって異なるので必ず公式サイトを確認してください。

```bash
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === '906a84df04cea2aa72f40b5f787e49f22d4c2f19492ac310e8cba5b96ac8b64115ac402c8cd292b8a03482574915d1a8') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
chmod a+x ./composer.phar
sudo mv composer.phar /usr/local/bin/composer
```

rootユーザー以外で「sudo composer」を実行できるようにします。

```bash
sudo visudo
```

以下の項目を書き換えます。

```bash
# :/usr/local/bin を追記
Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
```

Ecsキー→「:wq」と入力→Enterキーで上書き保存します。

### Laravelをインストール（Laravelプロジェクトを作成）
本記事では、公開ディレクトリにLaravelプロジェクトを作成することにします。
```bash
# プロジェクトを作成するディレクトリに移動
cd /var/www/html/example.jp

# 「laravel-admin」という名前のプロジェクトを作成（「laravel-admin」ディレクトリが作成されます）
composer create-project laravel/laravel --prefer-dist laravel-admin
```

### Nginxの設定を変更
このままだとトップページ以外が404エラーになってしまうので、
公開ディレクトリに関する記述等を書き換えます。
下記サイトが参考になりました。

https://qiita.com/maip0902/items/2fae4944e0115b40dcdc

```/etc/nginx/conf.d/default.conf
server {
    listen 80;
    server_name example.jp;
    root   /var/www/html/example.jp/laravel-admin/public;
    index index.php index.html index.htm;

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

    location ~ \.php$ {
        fastcgi_pass   unix:/var/run/php-fpm/www.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME /var/www/html/example.jp/laravel-admin/public$fastcgi_script_name;
        include        fastcgi_params;
    }
}
```

Nginxを再起動します。
```bash
sudo systemctl restart nginx
```

### パーミッション等の設定
このままではパーミッションエラーが表示されるので各種ディレクトリのパーミッション設定を変更します。
下記サイトが参考になりました。

https://awesome-programmer.hateblo.jp/entry/2019/06/30/121103

https://qiita.com/Todate/items/d0d5c38f62621711a79b

まず前提として、下記ユーザーが存在しています。
* dev: 開発用ユーザー（VSCodeでSSH接続しているのはこのユーザー）
* nginx: Webサーバーの実行ユーザー

下記コマンドを打ち込みます。

```bash
# Laravel用のグループを作成
sudo groupadd laravel

# 作成したグループにユーザー「dev」、「nginx」を参加させる
sudo gpasswd -a dev laravel
sudo gpasswd -a nginx laravel

# Laravelプロジェクトに移動
cd /var/www/html/example.jp/laravel-admin

# 配下のディレクトリ、ファイルのパーミッションを一括変更
sudo find ./ -type d -exec chmod 755 {} \;
sudo find ./ -type f -exec chmod 644 {} \;

# 所有グループを変更（これでエラーが修正される）
sudo chown -R :laravel ./storage
sudo chown -R :laravel ./bootstrap/cache

# 既存のディレクトリのパーミッションを一括変更
sudo find ./storage -type d -exec chmod 775 {} \;
sudo find ./storage -type f -exec chmod 664 {} \;
sudo find ./bootstrap/cache -type d -exec chmod 775 {} \;
sudo find ./bootstrap/cache -type f -exec chmod 664 {} \;

# SGIDを設定
# 今後作成されるファイルやディレクトリの所有グループがlaravelになるようにする
sudo find ./storage -type d -exec chmod g+s {} \;
sudo find ./bootstrap/cache -type d -exec chmod g+s {} \;

# ACLデフォルト設定を変更
# 今後作成されるファイルやディレクトリのパーミッションが、ファイル：664、ディレクトリ：775になる
sudo setfacl -R -d -m g::rwx ./storage
sudo setfacl -R -d -m g::rwx ./bootstrap/cache

# サーバー再起動
sudo shutdown -r now
```

### 動作確認
ブラウザでドメインにアクセスし下記画面が表示されたらインストールは成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1140967/805ac5a5-74ed-b450-9540-20000a541fe3.png)

# 参考サイト
[CentOS+NginxでLaravelを動かすまで（サーバー構築） | Reuhul tech memo](https://reuhul.org/129)
[Composer](https://getcomposer.org/download/)
[nginx + Laravel でホーム以外のページの404エラー解決 - Qiita](https://qiita.com/maip0902/items/2fae4944e0115b40dcdc)
[Laravelプロジェクトを本番サーバーで公開する時、Permission deniedでハマったら - バックエンドとフロントエンドを行き来するWEBプログラマ―のメモ帳](https://awesome-programmer.hateblo.jp/entry/2019/06/30/121103)
[CentOS/Apache/Laravel使用時のpermission設定方法 - Qiita](https://qiita.com/Todate/items/d0d5c38f62621711a79b)