LEMPスタックを使ってECS上にLaravel 5.6アプリケーションをデプロイする

このチュートリアルでは、**LEMPスタック(Laravel, Nginx, MySQL, PHP)**を使用して、**Alibaba ECSインスタンス**上に**Laravel 5.6アプリケーション**をデプロイします。

[Alibaba Cloud Tech Share](https://www.alibabacloud.com/campaign/techshare?spm=a2c65.11461447.0.0.2fec50200CZZHl) 執筆、 Himanshu Gupta。[Tech Share](https://www.alibabacloud.com/campaign/techshare?spm=a2c65.11461447.0.0.2fec50200CZZHl)は、技術的な知識やベストプラクティスをクラウドコミュニティ内で共有することを奨励するAlibaba Cloudのインセンティブプログラムです。

Laravelは、シンプルで複雑なWebアプリケーションを開発するために使用されている人気のPHPフレームワークの一つです。Laravelは、API開発やダッシュボードの生成に適したフレームワークであることが判明しています。


###前提条件
1、Alibaba Cloudアカウント。Alibaba Cloudアカウントに[サインアップ](https://account-intl.aliyun.com/register/intl_register.htm?spm=a2c65.11461447.0.0.2fec50200CZZHl&biz_params=%7B%22intl%22%3A%22%7B%5C%22referralCode%5C%22%3A%5C%22wa9hix%5C%22%7D%22%7D)すると、新規ユーザー無料クレジットをお楽しみいただけます。アカウントの設定方法がわからない場合は、こちらの[ステップバイステップのチュートリアル](https://www.alibabacloud.com/getting-started/projects/how-to-use-the-new-user-free-credit?spm=a2c65.11461447.0.0.2fec50200CZZHl)に従ってください。
2、SSHログインのためのsudoアクセスが可能なユーザーアカウント(ルートユーザーでも動作します)
3、このチュートリアルでは、Laravel 5.6アプリケーションを実行するためにLEMPスタックが必要です。LEMPスタックの設定方法がわからない場合は、この記事の手順に従ってください：[Alibaba ECSインスタンスでLEMPスタックを設定](https://www.alibabacloud.com/blog/WordPress-with-LEMP-on-Alibaba-Cloud-%E2%80%93-Part-2-Completing-the-LEMP-Stack_278805?spm=a2c65.11461447.0.0.2fec50200CZZHl)。

注: ただし、Laravel 5.6アプリケーションを実行するには、PHP 7.2を使用する必要があります（上記の記事では、PHP 7.0をインストールするのに役立ちます）。UbuntuにPPAリポジトリを追加してPHP 7.2をインストールし、updateコマンドを使用してUbuntu上のパッケージインデックスを更新します。チュートリアルに従う前に、これらのコマンドを実行してください。

```
$ sudo apt-get install -y software-properties-common 
$ sudo add-apt-repository ppa:ondrej/php
$ sudo apt-get update
```

他の必要なPHPモジュールと一緒にPHPをインストールします。

```
$ sudo apt install php7.2-fpm php7.2-mysql php7.2-common php7.2-mbstring php7.2-xmlrpc php7.2-xml php7.2-intl php7.2-cli php7.2-zip php7.2-curl
php -v
```

PHP ファイルのみを fpm で提供するには、root 権限で php-fpm 設定ファイルを開きます。

`$ sudo nano /etc/php/7.2/fpm/php.ini`

パラメータ cgi.fix_pathinfo を探して、プレフィックスのセミコロンを削除してコメントを外し、値を 0 に変更してください。

`$ cgi.fix_pathinfo=0`

php-fpmを再起動して設定を反映させます。

`$ sudo systemctl restart php7.2-fpm`

さて、上記の記事の続きですが、Nginx ServerをPHPリクエスト用に設定します。php7.2のバージョンでロケーションブロックの行をphp7.2-fpm.sockに変更してください。

4、サーバーにデプロイする準備ができたLaravelアプリケーションです。どんなLaravelアプリでも構いませんが、ここではサーバー上にデプロイするために、この[クイックスタートLaravelアプリケーション](https://github.com/laravel/quickstart-basic?spm=a2c65.11461447.0.0.2fec50200CZZHl)を使用します。

#ステップ1: 依存関係のインストール
Laravel 5.6アプリケーションをスタック上で実行するために、いくつかの依存関係をインストールします。Alibaba Cloud ECSインスタンスで以下のコマンドを実行します。

root権限を持つユーザーアカウントでサーバーインスタンスにSSHログインします。（Windows用のPutty/Mobaxtermを使用してサーバーインスタンスにログインします。）

`$ ssh root@server_ip_address`

インスタンスのパッケージマネージャキャッシュを更新します。

`$ sudo apt-get update`

Composerをインストールして、Laravelアプリケーションに必要なマルチバイト文字列やXMLなどのパッケージと一緒に、LaravelでPHPパッケージを管理します。ComposerはPHPアプリケーションのパッケージの依存関係管理に使用します。

公式ドキュメントでLaravel 5.6のサーバー要件を確認することができます。

`$ sudo apt-get install composer unzip zip php7.2-mbstring php7.2-xml php7.2-common php7.2-curl`

#ステップ2：MySQLサーバの設定
LEMPスタックのインストール時には、MySQLによって作成されたroot管理アカウントを持っていなければなりません。そのため、必要な権限を持つLaravelアプリケーション専用の新しいMySQLユーザーを作成します。

MySQLの管理ルートアカウントにログインします。アクセスにはMySQLのrootパスワードが必要です。

`$ mysql -u root -p`

アプリケーションの新しいデータベースを作成します。

`$ mysql> CREATE DATABASE laravel_db DEFAULT CHARACTER SET utf COLLATE utf8_unicode_ci;`

新しいユーザーを作成し、データベースに権限を付与します。私たちは、名前を'laravel_user'とパスワード'password123'でユーザーを作成しています。

`$ mysql> GRANT ALL ON laravel_db.* TO 'laravel_user'@'localhost' IDENTIFIED BY 'password123’;`

特権をフラッシュして終了します。

```
$ mysql>  FLUSH PRIVILEGES;
$ mysql>  Exit;
```

しかし、次のようにデータベースの資格情報をメモしておきます。

- データベース名: laravel_db
- データベースユーザー: laravel_user
- データベースホスト：DBサーバのホスト(同一サーバの場合はlocalhost)
- データベースパスワード: password123

#ステップ3：サーバーにLaravelのアプリケーションコードをアップロードする
これで、Laravelアプリケーションのデータベースが設定されたので、サーバーディレクトリにアプリケーションコードをアップロードします。gitを使ってGithubやBitbucketからリポジトリをクローンすることができます。

Laravelが提供する[デモLaravelアプリケーション](https://github.com/laravel/quickstart-basic?spm=a2c65.11461447.0.0.2fec50200CZZHl)を使って、Alibaba ECSのインスタンスにインストールします。このデモアプリケーションは、学習目的で使用するシンプルなメモ取りアプリケーションです。


htmlフォルダ内にlaravelappという名前のディレクトリを作成します。

`$ sudo mkdir -p /var/www/html/laravelapp`


新しいディレクトリlaravelappの所有権を私たちのユーザーに変更するように、私たちのユーザーjohnは、プロジェクトフォルダ内のファイルやフォルダを管理し、操作することができるようになります。

`$ sudo chown john:john /var/www/html/laravelapp`

laravelappディレクトリに変更し、gitリポジトリからサンプルのLaravelアプリケーションをクローンします。

```
$ cd /var/www/html/laravelapp
$ git clone https://github.com/laravel/quickstart-basic .
```

プロジェクトのファイルやフォルダが laravelapp フォルダにコピーされたコンソールには、以下のような出力が表示されます。

```
------- Git Output-----
Cloning into '.'...
remote: Counting objects: 263, done.
remote: Total 263 (delta 0), reused 0 (delta 0), pack-reused 263
Receiving objects: 100% (263/263), 92.75 KiB | 0 bytes/s, done.
Resolving deltas: 100% (72/72), done.
Checking connectivity... done.
```

次に、プロジェクトフォルダ内のcomposer installコマンドを実行して、プロジェクトの様々な依存関係をインストールします。Composerは、様々なPHPフレームワークが依存関係を管理するために使用しています。

`$ composer install`

これは必要なパッケージをインストールしますが、完了するまでに1分ほどかかるかもしれません。composer.jsonファイルに記載されているすべてのパッケージのインストールを示す出力が表示されます。

これでLaravelアプリケーションがデプロイされたので、本番環境、ステージング環境、開発環境などのアプリケーション環境を設定する必要があります。

#ステップ4: アプリケーション環境を設定する
Laravelのアプリケーション環境を設定して、アプリケーションがデータベースに接続したり、様々な環境変数を管理できるようにしていきます。
Laravelアプリケーションの環境ファイルを開きます。

`$ sudo nano /var/www/html/laravelapp/.env`

下図のように変更してください。（変更はカラーと斜体で表示されます)

```
APP_ENV=production
APP_DEBUG=false
APP_KEY=b809vCwvtawRbsG0BmP1tWgnlXQypSKf
APP_URL=http://yourdomain.com

DB_HOST=127.0.0.1
DB_DATABASE=laravel_db
DB_USERNAME=laravel_user
DB_PASSWORD=password123
...
...
```

CTRL+Xを押し、Yを押し、Enterを押してファイルを保存して終了します。
データベースの移行を実行して、私たちのアプリケーションのテーブルとインデックスを作成します。本番環境なので、確認のためのプロンプトが表示されます。

`$ php artisan migrate`

移行の実行について確認を求められる場合は、「はい」と入力してください。

```
Artisan output
**************************************
*     Application In Production!     *
**************************************

Do you really wish to run this command? [y/N](yes/no) [no]:> yes

Migration table created successfully.
Migrated: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_100000_create_password_resets_table
```

ストレージ、キャッシュ、セッションなどを含むLaravelアプリケーションのファイルやフォルダのパーミッションを設定します。

所有者をwww-dataに変更します。www-dataはウェブサーバーを管理するためのデフォルトのユーザーグループです。

```
$ sudo chgrp -R www-data storage bootstrap/cache
$ sudo chmod -R ug+rwx storage bootstrap/cache
```

最後に、アプリケーション内に存在するファイルやフォルダをサーバー化するためにnginxの設定を微調整する必要があります。

#ステップ5: アプリケーションのためにNginxサーバーを設定する
ケース1: ドメイン名を持っている場合は、/etc/nginx/sites-availableフォルダに新しいファイルを作成し、デフォルトの設定を上書きすることで、新しいサーバーブロックを作成することができます。

ケース2: 一方、ドメイン名を持っていない場合は、LaravelアプリケーションのためのNginxのデフォルト設定ファイルの変更を行います。

デフォルトのnginx設定ファイルを開きます。

`$ sudo nano /etc/nginx/sites-available/default`

以下のようにデフォルトファイルの変更をイタリック体と赤色で行います。

```
server {
    listen 80 default_server;
    listen [::]:80 default_server;

    root /var/www/html/laravelapp/public;
    index index.php index.html index.htm index.nginx-debian.html;

    server_name _;

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

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.2-fpm.sock;
    }

    location ~ /\.ht {
        deny all;
    }
}

```

nginxの設定をテストします。

`$ sudo nginx -t`

変更を反映させるためにNginxの設定を再起動します。

`$ sudo service nginx restart`

おめでとうございます。Alibaba Cloud ECSインスタンスにLaravel 5.6アプリケーションをデプロイしました。

ブラウザのIPアドレスにアクセスして、タスクを追加するオプションを持つWebページを表示します。クイックスタートアプリケーションはタスクアプリケーションで、タスクを追加したり削除したりすることができます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/b8e2ff60-35ab-21f7-2779-dc9f513a2516.png)

*本ブログは英語版からの翻訳です。オリジナルは[こちら](https://www.alibabacloud.com/blog/deploy-a-laravel-5-6-application-on-alibaba-ecs-instance_593730)からご確認いただけます。一部機械翻訳を使用しております。翻訳の間違いがありましたら、ご指摘いただけると幸いです。*

*アリババクラウドは日本に２つのデータセンターを有し、世界で60を超えるアベラビリティーゾーンを有するアジア太平洋地域No.1(2019ガートナー)のクラウドインフラ事業者です。
アリババクラウドの詳細は、こちらからご覧ください。
[アリババクラウドジャパン公式ページ](https://www.alibabacloud.com/ja)*