Laravelアプリケーションをレンタルサーバーで動作させる

この記事は、「[【連載】初めてのWindows用Laravel 5.7開発環境構築入門](https://qiita.com/hitotch/items/a646972fe1992611e92b)」の子記事です。環境などの条件は、親記事をご覧ください。

---
　連載最後の今回は、これまでに作成したLaravelアプリケーションをレンタルサーバーで動作させます。

　Laravelは特別な設定なく一般的なレンタルサーバーで動作させられるため、サーバーを選ばずに利用することができます。ただし、動作条件がかなり最新バージョンを必要とするので、古いサーバーでは動作させられません。

　今回はレンタルサーバーでよく利用されている管理ソフト「cPanel」での操作を前提に説明していきますが、他の管理ソフトや環境でも問題ないはずです。

# サーバーの準備

　今回準備したテストサーバーは、http://laraveltest.mirai-it.com というドメインを割り当てています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/75b45e18-52a0-512c-3ef1-0c96287f1972.png)

ブラウザから http://laraveltest.mirai-it.com にアクセスすると、ほぼ空っぽです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/6d2c1af5-d386-89f1-d459-971146450cf4.png)

初期状態のファイル構成は：
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/de535808-8686-3ec0-620e-d5210a5e112a.png)

**【重要】サーバーのPHPが7.1.3以上であることを、確認します。**


# データベースの作成

MySQLデータベースを作成します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/eff0c831-357b-b3ad-5912-e21c947e61c7.png)

今回は以下のように作成しました。
**データベース名：laravelt_test**
**ユーザー名：laravelt_test**
**パスワード：**

忘れずに、作成したユーザーに権限を割り当てます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/f45be3e4-2513-0b6c-9c6b-e373ab18d1bf.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/c62f8668-0470-ea39-dc82-297b22c197f3.png)

# データをローカルPCからコピーする

今回は、いまローカルPCで動作しているアプリをそのままアップすることにしたいので、データをローカルからサーバーにコピーします。

HeidiSQLを開けて、Localhostのlaravelexampleを右クリックし、「データベースをSQLとしてエクスポート」します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/f560eea5-28c0-6f4c-5a15-c56b30c2d733.png)

テーブルの作成を選択、データの挿入を選択、ファイル指定を開始。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/932f1e12-e471-51d7-fb91-1fdb6e7d036b.png)

保存先はデスクトップとして、ファイル名に「laraveltest」を指定し、保存。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/f75be5e2-e521-8392-5a41-4e58086d8b36.png)

ファイルが設定されていることを確認して、エクスポート。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/cdffe734-b06f-ba33-1803-bccd33577de1.png)

デスクトップにダンプファイルができます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/03567841-c63d-49d2-2fb6-9ca7f64a112b.png)

サーバー上のphpMyAdminを開いて
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/2ef6197f-aedb-9ff5-7945-0658d1ce2614.png)

laravelt_testデータベースの、インポートタブで、ファイルを選択。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/1946a29b-5edc-8dbd-5b62-b8709fbecffd.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/2d58b924-9586-be02-6b1e-6b912a26f353.png)

ファイルを指定したら実行します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/b7285386-b4fb-55a2-33cb-2631521b0863.png)

正常終了したら、テーブルがインポートされているのが見えます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/45d0396d-ff68-bddf-913e-e10eb931a31f.png)

ユーザー情報もコピーされています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/e38dd944-506d-1974-6480-e2737cbbf2bc.png)

# ファイルをアップロードする

FTPソフトを使って、サーバーに接続します。（ここはサーバーごとに違うので説明は省きます）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/7c90879a-2217-714f-0f5c-b37f42a6a6ec.png)

このサーバーの場合、public_htmlが公開用ドキュメントルートです。

ファイルのアップロードは、Laravel本体やコントローラなどのプログラムコードが入った非公開ファイルと、画像、CSS、JavaScriptなどの公開ファイルで２つに分けます。

## 非公開フォルダのアップロード

Laravelプロジェクトのpublicフォルダ**以外**がすべて非公開ファイルです。

まずは非公開ファイルを入れるフォルダをサーバーに作ります。ここでは``laravelapp``フォルダにします。
公開用ドキュメントルート（ここではpublic_html）と同じ階層に作成します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/64dac11e-8424-d9b2-9952-a89075eec686.png)

作成したフォルダに、ローカルPCの公開フォルダ(public)以外すべてをコピーします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/8d5f1a7e-8be1-7502-8cc3-d9f72cb71332.png)

つぎに、サーバーの公開用ドキュメントルート（public_html）に、ローカルPCのpublicフォルダの**中身**をすべてコピーします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/84cb991a-987f-1fe7-3a2c-f0b20b50eaa7.png)

## エラーの確認

まだ設定は残っていますが、ブラウザを開いて「http://[あなたのドメイン]」にアクセスしてみましょう。（今回の場合 http://laraveltest.mirai-it.com ）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/864b59cd-707f-51e9-036b-5f5eaab0931c.png)

当然エラーが出ますが、もし何も出ずに真っ白の場合は、サーバーの設定でPHPのエラー表示がオフになっているので、オンにしましょう。エラー表示を頼りに、サーバーの設定を行っていくことになります。

# 公開用フォルダからLaravelアプリフォルダに接続する

上に出ているエラーの1つ目は、「index.phpに書かれているvendor/autoload.phpが見つからない」という意味です。

FTPソフトや、サーバーのファイルマネージャーから、ドキュメントルートのindex.phpを編集モードで開きます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/5e123824-3391-7801-6785-fbd2d135993d.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/edd34546-0d92-ac1a-d75d-0a82cc11513c.png)

すると上のように「自分のフォルダ/../vendor/autoload.php」を見に行っているので、これを今回設置した条件に合わせます。
今回はドキュメントルートの並びのlaravelappフォルダをアプリフォルダとしたので、

```php
require __DIR__.'/../laravelapp/vendor/autoload.php';
```

と記述を変更します。
同様に、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/2848c21d-75b3-d26d-ae9f-dc708205e3d4.png)

この記述も

```php
$app = require_once __DIR__.'/../laravelapp/bootstrap/app.php';
```

にします。最後に保存します。

## アプリフォルダ接続の動作テスト

ブラウザでリロードすると、Laravelトップページが見えるはずです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/dcf82e8e-07c5-0224-18c7-e0383e2d1c50.png)

ちなみに、もし↓これが出たら、PHPのバージョンが合ってない可能性が高いので、再確認してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/e8178501-9479-82bd-42cc-d0665a9800d4.png)

# データベースとの接続

次に、ブラウザで「http://[あなたのドメイン]/users」にアクセスしてみます。（今回の場合 http://laraveltest.mirai-it.com/users ）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/dee74c1f-9da0-692d-5fcb-f27e87953cdb.png)

データベースへのアクセスが拒否された(Access denied for user)と出ていますね。データベースへの接続設定はしていないので当然です。

FTPソフトや、サーバーのファイルマネージャーから、アプリフォルダ(laravelapp)の.envを編集モードで開きます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/f8aa6ac6-7f43-9825-986e-e577d06eb1ae.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/e93f640f-163e-25bd-4795-0de2b55841ba.png)

APP_URLと、データベース設定のところをサーバーに合わせて設定し、保存します。

- **DB_CONNECTION** そのままでOK
- **DB_HOST** そのままでOKの場合が多いですが、たまに別のIPアドレスやサーバー名を指定されることがあります。
- **DB_PORT** そのままでOKの場合が多い
- **DB_DATABASE** 上で作ったデータベースの名前
- **DB_USERNAME** 上で作ったユーザー名
- **DB_PASSWORD** 上で作ったユーザーのパスワード

## データベース動作テスト

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/3fa7f8fa-1967-3b88-2391-f6424ec63a4d.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/57e15c20-cbd5-5ed1-02bc-34aaf88054f3.png)

OKですね。

# パブリックディスクの設定

　今回のサンプルアプリはこれで動作OKですが、もうひとつやるべき設定があります。
　多くのアプリではファイルのアップロードがあり、アップロードされたファイルはサーバー上のフォルダに格納されるわけですが、Laravelでは``[プロジェクトフォルダ/]storage/app/public``に実態が格納されているため、publicじゃないのでブラウザからアクセスできません。そのため、``public/storage``から``storage/app/public``にシンボリックリンクを張る必要があります。詳しくは[こちら](https://readouble.com/laravel/5.7/ja/filesystem.html)。

 サーバー上の公開用ドキュメントルート（public_html）フォルダに``createsymlink.php``を作ります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/ab3b40c8-e157-dad6-c520-e5e05bc20e0b.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/751ba687-bdc1-c7a9-351b-5a4e015f0403.png)

　この中に、シンボリックリンクを作るコードを書き込みます。

```php:createsymlink.php
<?php
symlink('[storage/app/publicへのフルパス]', '[public_htmlへのフルパス]/storage');
```

ここで言うフルパスはサーバーによって違いますので、慎重に調べてください。
今回サンプルで使っているサーバーは以下のようになりました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/316ef1eb-3a54-b6ad-254a-b45fdc38cc4e.png)

できたら保存して、ブラウザ上からこのプログラムにアクセスします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/816c39ae-d2f9-de73-21ed-03589dc6450b.png)

真っ白ですが、エラーも出てないのでOKと思われます。確認しましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/15e819cd-6067-59c5-fc02-7c88584b20df.png)

できてるっぽいですね。FTPソフトで見るとファイルに見えてます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/315589/42859a48-2a3e-d056-f5e8-92f04e81b9bf.png)

見えにくいですが、アイコンも「ショートカット」っぽアイコンですね。

これですべての設定が終わりです。お疲れ様でした。