LaravelをCentOS7にデプロイする方法

# 概要
AWSのEC2インスタンスにてCentOSを載せた仮想サーバーにLaravelのプロジェクトをデプロイする手順を紹介します。

# 前提条件
・開発環境で動作してGit管理されているLaravelのプロジェクトをCentOS7にデプロイします。
・今回紹介するのはCentOSにssh接続して作業する内容のみ紹介します。
・DBはAmazon RDSに接続します。


# 作業内容
1.ミドルウェアインストール(Apache、mysql-community-client、PHP7.3)
2.OSの設定変更(SELinuxの停止、タイムゾーン、ロケール)
3.RDS接続、DB作成、設定
4.Composerインストール
5.ソースコードClone
6.動作するよう設定(Apache、Laravel)

# 1. ミドルウェアインストール(Apache、mysql-community-client、PHP7.3)
PCからサーバーにSSH接続します。

```
% ssh -i ~/.ssh/xxxxx.pem centos@xxx.xx.x.xxx
```

##1.1 rootに変更、更新するパッケージ確認、全パッケージの更新 、再起動
### rootに変更
root権限がないと権限が足りずパッケージの更新ができない事もあるのでrootに変更します。

```
$ sudo -i
```
### アップデートされるパッケージ確認
メディアからインストールされたCentOSは含まれているパッケージが古いことがあるため、事前に全パッケージのアップデートします。以下のコマンドで今回アップデートされるパッケージを確認できます。

```
[root]
$ yum check-update
```

### 全パッケージをアップデート
```
[root]
$ yum update
```

### 再起動
再起動が必要なプロセスもあるため再起動します。
※「$needs-restarting」コマンドで再起動必要なプロセスを調べられます。

```
[root]
$reboot
```

※yumとは、RedHat系ディストリビューションのパッケージ管理システムの事です。
リポジトリと呼ばれるパッケージ置き場からのパッケージをダウンロードし、インストール、アンインストール、更新をする事ができます。

## 1.2 リポジトリ追加(epel、remi)
### epelリポジトリ追加
```
[root]
$yum install epel-release.noarch
```
※epelリポジトリ: CentOS 標準のリポジトリでは提供されていないパッケージを、yum コマンドでインストールすることを可能にするリポジトリ

### remiリポジトリの追加

```
[root]
$rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
```
※remiリポジトリ: 最新のPHPスタックが使え、その他のソフトウェアを、できる限りvanillaな（そのままの）バージョンのまま利用できるようにするためのリポジトリ

##1.3 Apacheインストール、起動、自動起動設定
### Apacheインストール
```
[root]
$yum install httpd
```

### Apache起動
```
[root]
$ systemctl start httpd.service
```

### Apache自動起動設定
```
[root]
$systemctl enable httpd.service
```

### Apacheステータス確認
 Loadedの()内に「enabled」と表示されているのと「Active: active (running)　」と表示されていればOKです。

```
[root]
$ systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: active (running) since 金 2020-11-06 04:57:30 UTC; 42s ago
     Docs: man:httpd(8)
           man:apachectl(8)
 Main PID: 8618 (httpd)
   Status: "Total requests: 0; Current requests/sec: 0; Current traffic:   0 B/sec"
   CGroup: /system.slice/httpd.service
           ├─8618 /usr/sbin/httpd -DFOREGROUND
           ├─8619 /usr/sbin/httpd -DFOREGROUND
           ├─8620 /usr/sbin/httpd -DFOREGROUND
           ├─8621 /usr/sbin/httpd -DFOREGROUND
           ├─8622 /usr/sbin/httpd -DFOREGROUND
           └─8623 /usr/sbin/httpd -DFOREGROUND
```

## 1.4 MYSQLリポジトリ追加、mysql-community-clientをインストール、接続確認
### MYSQLリポジトリ追加

```
[root]
$yum install http://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm
```

### mysql-community-clientをインストール
今回はAmazon RDSにあるMysqlに接続ができればいい為、Mysqlコマンドが実行できればOKです。その為「mysql-community-client」のみインストールします。
サーバー内にDBを作成する場合は「mysql-community-server」をインストールしてください。

### 欲しいバージョンが有効になっていることを確認(5.7)
yum infoコマンドを使ってmysql-community-clientが使用できることを確認する

```
[root]
$yum info mysql-community-client
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
37 packages excluded due to repository priority protections
インストール済みパッケージ
名前                : mysql-community-client
アーキテクチャー    : x86_64
バージョン          : 5.7.32
リリース            : 1.el7
容量                : 101 M
リポジトリー        : installed
提供元リポジトリー  : mysql57-community
要約                : MySQL database client applications and tools
URL                 : http://www.mysql.com/
....

```
yum repolistコマンドをでmysqlリポジトリが有効(enabled)になっていることを確認します。

```
[root]
$yum repolist enabled | grep mysql
mysql-connectors-community/x86_64 MySQL Connectors Community                 175
mysql-tools-community/x86_64      MySQL Tools Community                      120
mysql57-community/x86_64          MySQL 5.7 Community Server                 464
```
###  mysql-community-clientをインストール
```
[root]
$yum install  mysql-community-client.x86_64
```

### 接続確認
RDSに接続します。mysqlに接続できていることを確認できればOKです。

```
[root]
$ mysql -u [DBユーザー] -p -h [エンドポイント] -P 3306
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 322
Server version: 5.7.31-log Source distribution

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 
```



## 1.5 PHP7.3のインストール
### remi-php73を使用してphpインストール
```
[root]
$yum install php php-cli php-common php-devel php-gd php-mbstring php-mysqlnd php-pecl-mysql php-pdo php-xml php-pecl-memcache --enablerepo=remi-php73

$yum install --enablerepo=remi-php73 php-zip
```
### PHPのバージョンが7.3系であることを確認
```
[root]
$php -v
PHP 7.3.24 (cli) (built: Oct 27 2020 11:01:59) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.24, Copyright (c) 1998-2018 Zend Technologies
```
これにてApache、Mysql、PHPが動作する環境が整いました。
## 1.6 Git、zip、unzip、postfixインストール
ここでは適宜必要なリポジトリを追加してください。

```
[root]
$yum install git
$yum install zip unzip
$yum install postfix
```



# 2.OSの設定変更(SELinuxの停止、タイムゾーン、ロケール)
## 2.1SELinuxの停止
SELinuxはカーネルの制御機能のひとつでSecurity-Enhanced-Linuxの略称です。SELinuxを利用すると細かいアクセス制御が可能になる。しかし、難関な上に余計な挙動をしたりと管理しにくいので無効にします。
### SELinuxの状態の確認(Enforcingだったら有効になっている)
```
[root]
$ getenforce
Enforcing
```
### 無効化する(SELINUXの値をdisabledにする)
```
[root]
$vi /etc/selinux/config
SELINUX=disabled
```

### 再起動
```
[root]
$ reboot
```

### 無効になっていることを確認
```
$ getenforce
Disabled
```

## 2.2 タイムゾーンの変更
デフォルトの状態だと時刻の設定が「UTC, +0000」になっています。これを日本時間に変更します。

```
$timedatectl status
      Local time: 土 2020-11-07 05:31:41 UTC
  Universal time: 土 2020-11-07 05:31:41 UTC
        RTC time: 土 2020-11-07 05:31:41
       Time zone: n/a (UTC, +0000)
     NTP enabled: yes
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a
```

### timezoneのAsia/Tokyoをセット
```
[root]
$timedatectl set-timezone Asia/Tokyo
```

### タムゾーンが変更されているか確認
「Time zone: Asia/Tokyo (JST, +0900)」となっていればOKです。

```
[root]
$  timedatectl status
      Local time: 金 2020-11-06 14:22:07 JST
  Universal time: 金 2020-11-06 05:22:07 UTC
        RTC time: 金 2020-11-06 05:22:07
       Time zone: Asia/Tokyo (JST, +0900)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a
```

##2.3 ロケールの変更
### 現在のロケール設定を確認
```
[root]
$localectl status
   System Locale: LANG=en_US.UTF-8
       VC Keymap: us
      X11 Layout: us
```

### ロケール変更
```
[root]
$localectl set-locale LANG=ja_JP.UTF-8
```

###日本語106キーボードに設定する
```
[root]
$localectl set-keymap jp106
```

###ロケールの変更を確認
```
[root]
$localectl status
localectl status
   System Locale: LANG=ja_JP.UTF-8
       VC Keymap: jp106
      X11 Layout: jp
       X11 Model: jp106
     X11 Options: terminate:ctrl_alt_bksp
```


#3.RDS接続、DB作成、アプリユーザー作成
 1.4の作業でMYSQLに接続できるようになったので次はDBの作成とデータベースユーザーを作成していきます。
### RDSに接続
```
[root]
$mysql -u [DBユーザー] -p -h [エンドポイント] -P 3306
```

### DB作成
```
mysql> create database [DB名];
Query OK, 1 row affected (0.00 sec)
```

###データベースユーザーの作成
```
mysql>GRANT USAGE ON [DB名].* to [新DBユーザー]@"%" IDENTIFIED BY '[パスワード]';
Query OK, 0 rows affected, 1 warning (0.00 sec)
```

### データベースに対するユーザーのアクセス権限付与
```
mysql>GRANT ALL PRIVILEGES ON [DB名].* TO [新DBユーザー]@"%";
Query OK, 0 rows affected (0.00 sec)
```

### ユーザーの権限確認
以下のようになっていればOKです。

```
mysql>show  grants for [新DBユーザー]@%
+---------------------------------------------------------+
| Grants for [新DBユーザー]@%                                    |
+---------------------------------------------------------+
| GRANT USAGE ON *.* TO '[新DBユーザー]'@'%'                     |
| GRANT ALL PRIVILEGES ON `[DB名]`.* TO '[新DBユーザー]'@'%' |
+---------------------------------------------------------+
2 rows in set (0.00 sec)

```

### [新DBユーザー]ユーザーで接続できるか確認
EC2に戻って今回作成したユーザーでログインできるか確認します。

```
[root]
$mysql -u [新DBユーザー] -p -h [エンドポイント] -P 3306
```


# 4.composerインストール
###php コマンドで copy を実行して composer-setup.php をダウンロード
```
$php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
```
「composer-setup.php」がコピーされます。

```
$ll
合計 272
-rw-rw-r-- 1 centos centos 276190 11月  6 16:55 composer-setup.php
```

### ダウンロードした composer-setup.php を実行して、Composer の実行ファイル(phar)を作成
```
$php composer-setup.php
All settings correct for using Composer
Downloading...

Composer (version 2.0.4) successfully installed to: /home/centos/composer.phar
Use it: php composer.phar
```
/home/centosに「composer.phar」が追加されました。
### インストーラを削除する
```
$php -r "unlink('composer-setup.php');"
$ ll
合計 2132
-rwxr-xr-x 1 centos centos 2180422 11月  6 16:56 composer.phar
```

### グローバルで使えるように移動
```
$mv composer.phar /usr/local/bin/composer
```
### composer動いていることを確認
```
$ composer -v
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 2.0.4 2020-10-30 22:39:11
.......
```

#5. LaravelのソースコードをClone
### 配置するディレクトリに移動
今回は/var/wwwの直下にLaravelプロへジェクトを配置します。

```
$ cd /var/www/
```
### ソースをclone
```
$ git clone リモートリポジトリ.git
fatal: could not create work tree dir 'xxxx'.: ????????
```
cloneするディレクトリに権限がない為エラーとなりました。

### 権限変更
「www」の所有者と所有グループが「root」になっていたので「centos」に変更します。

```
[root]
$ ll
drwxr-xr-x.  4 root root   33 11月  6 13:56 www

$ chown centos:centos www
$ ll
drwxr-xr-x.  4 centos centos   33 11月  6 13:56 www
```
### もう一度ソースをcloneしてきます。
```
$ git clone　リモートリポジトリ.git
remote: Enumerating objects: 2841, done.
remote: Counting objects: 100% (2841/2841), done.
remote: Compressing objects: 100% (2767/2767), done.
remote: Total 2841 (delta 1874), reused 110 (delta 22)
Receiving objects: 100% (2841/2841), 33.21 MiB | 35.94 MiB/s, done.
Resolving deltas: 100% (1874/1874), done.

$ ll
合計 4
drwxrwxr-x  13 centos centos 4096 11月  6 17:15 xxxx(cloneしたソース)
drwxr-xr-x.  2 root   root      6  4月  2  2020 cgi-bin
drwxr-xr-x.  2 root   root      6  4月  2  2020 html
```

cloneに成功しました。ただディレクトリ の中を見ると「cgi-bin」と「html」ディレクトリ が存在します。今回は使用しないので削除します。

#### cgi-binとhtmlを削除
```
[root]
$ rm -r html
rm: ディレクトリ `html' を削除しますか? yes
$ rm -r cgi-bin
rm: ディレクトリ `cgi-bin' を削除しますか? yes
$ ll
合計 4
drwxrwxr-x 13 centos centos 4096 11月  6 17:15 xxxx(cloneしたソース)
```

# 5.動作するよう設定(Apache、Laravel)
## 5.1Apacheの設定
### httpd.confに以下を追記
「ServerName」と「DocumentRoot」.htaccessが動くように以下を追記します。

```[root]
$vi /etc/httpd/conf/httpd.conf

ServerName xxxx.com:80
DocumentRoot "/var/www/xxxx/public"

<Directory /var/www/xxxx/public>
    AllowOverride All
</Directory>
```

### Apache再起動
設定を反映させるために再起動します。

```
[root]
$ systemctl restart httpd
```

## 5.2 Laravelの設定
ここからはLaravelが動作するように設定を変更します。
### composer install
```
cd /var/www/xxxx
$ composer install
```

### config, routeのキャッシュクリア
```
$ php artisan config:cache
Configuration cache cleared!
Configuration cached successfully!

$ php artisan route:cache
Route cache cleared!
```

### パーミッション変更
```
$ chmod 777 storage -R
$ chmod 777 bootstrap -R
```
### 確認
パーミッションが変更されていることを確認します。

```
$ ll
drwxrwxrwx  5 centos centos     46 11月  6 17:15 storage
drwxrwxrwx  3 centos centos     34 11月  6 17:15 bootstrap
```

### .env設定
次にLaravelの環境設定を行う「.env」を編集していきます。

```
$cp .env.example .env
$vi .env

APP_ENV=production
APP_URL=xxxx.com
APP_DEBUG=false

DB_HOST=[エンドポイント]
DB_PORT=3306
DB_DATABASE=[DB名]
DB_USERNAME=[新DBユーザー]
DB_PASSWORD=[パスワード]
```

### キーを作成し、キャッシュをクリアする
```
$ php artisan key:generate
Application key set successfully.

$ php artisan config:clear
Configuration cache cleared!
```

### シンボリックリンクの作成
```
$ php artisan storage:link
The [public/storage] directory has been linked.
```

### dumpをインポート
今回はこの環境で動くか一時的に確認がしたかったので開発環境のdumpファイルをDBにインポートして確認します。

```
mysqldump -u admin -p -h [エンドポイント] -P 3306  [DB名] <  xxxx.dump
```

上記ではdumpファイルを入れて動作確認しましたが、しない場合は以下のコマンドでDBのマイグレートを実行します。

```
php artisan migrate
```

ここでエラーになる場合は「.env」のDBの設定に間違いがないか確認してみてくだいさい。


### アクセスして確認
xxxx.comにアクセスしてページが表示されていれば完了です。
まだドメインを取得してない場合はIPに直接アクセスしても確認できるかと思います。

以上でCentOS7でLaravelプロジェクトをデプロイする方法でした。