Laravel勉強 その1 サーバのセットアップ、DockerでのLaravel環境構築

## 目的
- 勉強のため、Laravel 7.xの公式ドキュメントを読み解いていく。
- 今回はそのための準備として、Dockerを使用して環境を構築する。


## EC2の構築～セットアップ
今回は勉強なので、AWSの無料枠を利用する。
インスタンスタイプはt2.micro、OSはAmazon Linux2で作成。

### 参考
[EC2（Amazon-Linux-2）にNginxを入れてブラウザで確認するまで2018冬 [画像で解説] Nginx編](https://qiita.com/ymzk-jp/items/49daf14495ba090b3187)

### rootでのPWログインをON
セキュリティ的には微妙なところもあるかもしれないが、いちいちsudo打たなければいけないのも面倒なので。。。

#### rootのPWを設定
```
# sudo su
# passwd
```

#### sshの設定ファイル変更
```
# vi /etc/ssh/sshd_config
```

```/etc/ssh/sshd_config
PermitRootLogin yes
PasswordAuthentication yes
```  

#### sshd再起動
```
# systemctl restart sshd
```

#### ec2-userの無効化
セキュリティ的に消した方がいいよ、という記事を見つけた。確かに。

```
# userdel ec2-user
```


### EC2を日本時間と日本語に対応させる
```  
# yum update -y
# timedatectl set-timezone Asia/Tokyo
# localectl set-locale LANG=ja_JP.UTF-8
# localectl set-keymap jp106
```  


### パッケージを自動更新させる
#### yum-cronのインストール
```
# yum install yum-cron -y
```

[yum-cronとは？](https://access.redhat.com/ja/solutions/2247221)
　yum-cron パッケージは、アップデートを自動的に確認し、ダウンロードし、適用するための便利な方法を提供します。
　パッケージをインストールするとすぐに yum-cron パッケージの cron ジョブが有効になり、特別な設定は必要ありません。通常の日次 cron ジョブの実行時に、このジョブが実行します。

#### yum-cronを編集
```
  # vi /etc/yum/yum-cron.conf
```

```/etc/yum/yum-cron.conf
apply_updates = yes
```  

#### cronの自動起動をON
```
# systemctl status yum-cron
# systemctl start yum-cron
# systemctl enable yum-cron
```


## Laravel開発環境構築

### 参考
[Docker × PHP7.3 × Laravel環境作ってみた](https://qiita.com/A-Kira/items/be0602fe28b445e865db)

### Docker・Docker Composeのインストール
``` 
Dockerインストール
# amazon-linux-extras install docker

Dockerサービス起動
# systemctl start docker.service

サービスの起動確認
# systemctl status docker

Dockerの自動起動設定
# systemctl enable docker

試しにDockerコマンド実行
# docker info
```  

```  
Docker Composeインストール
# curl -L https://github.com/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose

Docker Composeのインストールを確認
# docker-compose --version
docker-compose version 1.25.4, build 8d51620a
```  


## ディレクトリ作成

>以下の構成を想定しています。
**project**
├ docker-compose.yml
├ **docker**
│　 ├ **db**
│ 　│　 ├ data
│ 　│　 ├ sql
│ 　│ 　└ my.cnf
│　 ├ **nginx**
│ 　│　 ├ default.conf
│　 ├ **php**
│ 　│　 ├ php.ini
│ 　│ 　└ Dockerfile
└ **server**

とのこと。（太字はディレクトリ）

```  
# cd /var
# mkdir project
# mkdir project/docker project/server
# mkdir project/docker/{php,nginx,db}
# ll -d `find ./project`
drwxr-xr-x 4 root root 34 May 21 19:08 ./project
drwxr-xr-x 4 root root 30 May 21 19:08 ./project/docker
drwxr-xr-x 2 root root  6 May 21 19:08 ./project/docker/db
drwxr-xr-x 2 root root  6 May 21 19:08 ./project/docker/nginx
drwxr-xr-x 2 root root  6 May 21 19:08 ./project/docker/php
drwxr-xr-x 2 root root  6 May 21 19:08 ./project/server
``` 

別にvarじゃなくてもいいけど、なんとなくvarで。


## swap領域の有効化
過去の経験上、これをやらないとこける。

``` 
# /bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 13.537 s, 79.3 MB/s

# /sbin/mkswap /var/swap.1
mkswap: /var/swap.1: insecure permissions 0644, 0600 suggested.
Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
no label, UUID=8be78b55-de6d-4ed4-9f9a-7a48f3dc30ae

# /sbin/swapon /var/swap.1
swapon: /var/swap.1: insecure permissions 0644, 0600 suggested.
``` 


## docker-compose.yml作成

```docker-composer.yml
version: '3'

services:
  php:
    container_name: php
    build: ./docker/php
    volumes:
      - ./server:/var/www

  nginx:
    image: nginx
    container_name: nginx
    ports:
      - 80:80
    volumes:
      - ./server:/var/www
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - php

  db:
    image: mysql:5.7
    container_name: db
    environment:
      MYSQL_ROOT_PASSWORD: ****（パスワードを記載しておく）
      MYSQL_DATABASE: test_db
      TZ: 'Asia/Tokyo'
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    volumes:
      - ./docker/db/data:/var/lib/mysql
      - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
      - ./docker/db/sql:/docker-entrypoint-initdb.d
    ports:
      - 3306:3306
``` 


## Dockerfile作成

phpコンテナの構築時に、以下のDockerfileを使用する。

```:Dockerfile 
FROM php:7.3-fpm
COPY php.ini /usr/local/etc/php/

RUN apt-get update \
    && apt-get install -y zlib1g-dev libzip-dev mariadb-client \
    && docker-php-ext-install zip pdo_mysql

#Composer install
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

ENV COMPOSER_ALLOW_SUPERUSER 1

ENV COMPOSER_HOME /composer

ENV PATH $PATH:/composer/vendor/bin

WORKDIR /var/www

RUN composer global require "laravel/installer"
``` 

各行の処理については、[Dockerfileリファレンス](http://docs.docker.jp/engine/reference/builder.html)を参照。


## php.ini作成

phpの設定ファイル。

```:php.ini 
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
``` 

## default.conf作成

nginxの設定ファイル。

```:default.conf 
server {
  listen 80;

  root  /var/www/public;
  index index.php;

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

  location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass   php:9000;
    fastcgi_index  index.php;

    include        fastcgi_params;
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param  PATH_INFO $fastcgi_path_info;
  }
}
``` 

## php.ini作成

mysqlの設定ファイル。

```:my.cnf 
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

[client]
default-character-set=utf8mb4
``` 

## Laravelプロジェクト作成
``` 
docker起動
# docker-compose up -d
（略）
Creating php     ... done
Creating db-host ... done
Creating nginx   ... done

起動の確認
# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
9fdcb0da6745        nginx               "nginx -g 'daemon of…"   2 minutes ago       Up 2 minutes        0.0.0.0:80->80/tcp                  nginx
e1394b974a68        project_php         "docker-php-entrypoi…"   3 minutes ago       Up 2 minutes        9000/tcp                            php
cbc7a83db192        mysql:5.7           "docker-entrypoint.s…"   3 minutes ago       Up 2 minutes        0.0.0.0:3306->3306/tcp, 33060/tcp   db

phpコンテナに入る
# docker-compose exec php bash
root@eec8f5f9ebe2:/var/www#

Laravelプロジェクト作成
# laravel new
（略）
Application ready! Build something amazing.
``` 


## Laravelまわりのディレクトリのパーミッション変更

``` 
# sudo chmod 2775 /var/project/server
# find /var/project/server -type d -exec sudo chmod 2775 {} +
# find /var/project/server -type f -exec sudo chmod 0664 {} +
# sudo chmod -R 777 /var/project/server/storage/
# sudo chmod -R 777 /var/project/server/bootstrap/cache
``` 

## セキュリティグループの編集
今回環境を作成したEC2について、PORT:80からのインバウンド通信を許可するように編集する。

## 動作確認
動作確認をして、Laravelの白い画面が出てくればOK。