レンタルサーバーでLaravelを動かす際の環境構築手順とTips


# はじめに

この記事は**[Laravel Advent Calendar 2019](https://qiita.com/advent-calendar/2019/laravel)**の**23日目の記事**です
過去に培ったレンサバ**（[さくらサーバ](https://www.sakura.ne.jp/)、[バリューサーバ](https://www.value-server.com/)）**でLaravelを動かすためのアレコレを書いていきます

.
.
.

という予定だったんですが、**さくらサーバーでの環境構築手順メモしか手元に残ってなかったのでほぼさくらサーバーでの環境構築手順になります**（主語でかで申し訳ないです）

# AWSとかわからんからレンサバでLaravelを動かす

というのはまあ**半分冗談**で、大体が**コストになる**とか、**先方指定**とかで最終的に**レンタルサーバーにしてください**って言われるので、世間的にもそうなのかな？と思いつつ記事書いていきます。
このTipsが誰かの役に立てれば我幸です。

**情報の鮮度的に19年9月ごろまでの話で今現在以下の通りでない可能性も無きにも非ずです**
あとここで想定している**Laravelのバージョンは5.7~5.8系**です。

# さくらのレンタルサーバーで環境構築

※ローカルで作成してプロジェクトがGitホスティングサービス（GitLabとかGithub）上に上がってる前提です。

## １，sshでログイン

おそらく借りた直後にssh接続すると以下のような画面になると思います。

```
FreeBSD 11.2-RELEASE-p5 (GENERIC) #0: Tue Nov 27 09:33:52 UTC 2018

Welcome to FreeBSD!

%
% ls -la
total 56
drwx------    9 testtest  users   512 Dec 13 19:23 .
drwxr-xr-x  160 root           wheel  3584 Jan 18 10:34 ..
-rw-r--r--    1 testtest  users   773 Nov 29 17:01 .cshrc
-rw-r--r--    1 testtest  users   258 Nov 29 17:01 .login
-rw-r--r--    1 testtest  users   167 Nov 29 17:01 .login_conf
-rw-r--r--    1 testtest  users     0 Nov 29 17:01 .php.module
-rw-r--r--    1 testtest  users   762 Nov 29 17:01 .profile
-rw-r--r--    1 testtest  users   980 Nov 29 17:01 .shrc
drwx------    2 testtest  users   512 Nov 18  2009 .spamassassin
drwx------    2 testtest  users   512 Nov 18  2009 .ssh
drwx------    3 testtest  users   512 Nov 18  2009 MailBox
drwx------    2 testtest  users   512 Nov 18  2009 db
drwxr-xr-x    2 testtest  users   512 Jan 28  2015 sakura_pocket
drwxr-xr-x    2 testtest  users   512 Nov 18  2009 sblo_files
drwxr-xr-x    2 testtest  users   512 Nov 18  2009 www
```

## ２，リポジトリ用のディレクトリを生成する

`root`ディレクトリで生成する。

以下、ディレクトリ名`repos`で作成した例

```
% mkdir /home/testtest/repos
% ls -la
total 60
drwx------   10 testtest  users   512 Jan 18 16:10 .
drwxr-xr-x  160 root           wheel  3584 Jan 18 10:34 ..
-rw-r--r--    1 testtest  users   773 Nov 29 17:01 .cshrc
-rw-r--r--    1 testtest  users   258 Nov 29 17:01 .login
-rw-r--r--    1 testtest  users   167 Nov 29 17:01 .login_conf
-rw-r--r--    1 testtest  users     0 Nov 29 17:01 .php.module
-rw-r--r--    1 testtest  users   762 Nov 29 17:01 .profile
-rw-r--r--    1 testtest  users   980 Nov 29 17:01 .shrc
drwx------    2 testtest  users   512 Nov 18  2009 .spamassassin
drwx------    2 testtest  users   512 Nov 18  2009 .ssh
drwx------    3 testtest  users   512 Nov 18  2009 MailBox
drwx------    2 testtest  users   512 Nov 18  2009 db
drwxr-xr-x    2 testtest  users   512 Jan 18 16:10 repos          // これ
drwxr-xr-x    2 testtest  users   512 Jan 28  2015 sakura_pocket
drwxr-xr-x    2 testtest  users   512 Nov 18  2009 sblo_files
drwxr-xr-x    2 testtest  users   512 Nov 18  2009 www
```

## ３，秘密鍵を生成

サーバーで作成した鍵を各々使っているGitホスティングサービス（GitlabやらGithubやら）から`pull`するのに秘密鍵を生成する。

`ssh`ディレクトリがある場所で`ssh-keygen -t rsa -b 4096 -C "メールアドレス"`を実行

その後、`.ssh/id_rsa.pub`の中身を確認し、GitLabやGithubのプロジェクトへ登録する

```
% ssh-keygen -t rsa -b 4096 -C "hoge@example.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/testtest/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/testtest/.ssh/id_rsa.
Your public key has been saved in /home/testtest/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:************************************************** hoge@example.com
The key's randomart image is:
+---[RSA 4096]----+
|   B   .B..o++B=+|
|      .+o. o.=.+=|
|B    .o o.    . .|
|. o o .  B   .   |
|.  o o  .     o. |
|    . oo  .   oo.|
|. B .o.    . . +.|
|.  .     +  .  ++|
|  B   .   B   ..*|
+----[SHA256]-----+
%
% ls -la
total 60
drwx------   10 testtest  users   512 Jan 18 16:10 .
drwxr-xr-x  160 root           wheel  3584 Jan 18 10:34 ..
-rw-r--r--    1 testtest  users   773 Nov 29 17:01 .cshrc
-rw-r--r--    1 testtest  users   258 Nov 29 17:01 .login
-rw-r--r--    1 testtest  users   167 Nov 29 17:01 .login_conf
-rw-r--r--    1 testtest  users     0 Nov 29 17:01 .php.module
-rw-r--r--    1 testtest  users   762 Nov 29 17:01 .profile
-rw-r--r--    1 testtest  users   980 Nov 29 17:01 .shrc
drwx------    2 testtest  users   512 Nov 18  2009 .spamassassin
drwx------    2 testtest  users   512 Jan 18 16:13 .ssh
drwx------    3 testtest  users   512 Nov 18  2009 MailBox
drwx------    2 testtest  users   512 Nov 18  2009 db
drwxr-xr-x    2 testtest  users   512 Jan 18 16:10 repos
drwxr-xr-x    2 testtest  users   512 Jan 28  2015 sakura_pocket
drwxr-xr-x    2 testtest  users   512 Nov 18  2009 sblo_files
drwxr-xr-x    2 testtest  users   512 Nov 18  2009 www
```

`.ssh`へ移動して生成されたか確認

```
% cd .ssh/
% ls -la
total 16
drwx------   2 testtest  users   512 Jan 18 16:13 .
drwx------  10 testtest  users   512 Jan 18 16:10 ..
-rw-------   1 testtest  users  3247 Jan 18 16:13 id_rsa
-rw-r--r--   1 testtest  users   742 Jan 18 16:13 id_rsa.pub
% cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAAE/0H（ 略 ）fdg/tFm4WqQ== hoge@example.com
```

## ４，秘密鍵を各々のサービスのプロジェクトへ登録

各々使っているGitホスティングサービス（GitlabやらGithubやら）上へ登録する。

### GitLabの場合、
プロジェクトを開き、メニューから「Settings」→「Repository」→「Deploy Keys」のタブを開き、「key」に`.ssh/id_rsa.pub`の中身をコピー＆ペーストする。
「title」にはわかりやすい名前（サーバー名）を、「Write access allowed」のチェックボックスに関してはそのままで「Add Key」をクリックして完了

以下はGitHubの画面だがほぼ同じなので参考になる

- [GithubのDeploy Keysを登録してパスワードなしでアクセスする](https://qiita.com/master-of-sugar/items/a9892879f6e9cb9f3c97)


## ５，`git clone`する

ターミナルに戻り、先程作った**repos**ディレクトリへ移動し、`git clone`コマンドを実行

```
% cd repos/
% ls -la
total 8
drwxr-xr-x   2 testtest  users  512 Jan 18 16:10 .
drwx------  10 testtest  users  512 Jan 18 16:10 ..

% git clone git@gitlab.com:*******/test-project.git
Cloning into 'test-project'...
The authenticity of host 'gitlab.com (35.231.145.151)' can't be established.
ECDSA key fingerprint is SHA256:HbW3g8zUjNSksFbqTiUWPWg2Bq1x8xdGUrliXFzSnUw.
No matching host key fingerprint found in DNS.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'gitlab.com' (ECDSA) to the list of known hosts.
remote: Enumerating objects: 1145, done.
remote: Counting objects: 100% (1145/1145), done.
remote: Compressing objects: 100% (416/416), done.
remote: Total 1145 (delta 756), reused 1078 (delta 695)
Receiving objects: 100% (1145/1145), 452.28 KiB | 640.00 KiB/s, done.
Resolving deltas: 100% (756/756), done.

% ls -la
total 12
drwxr-xr-x   3 testtest  users  512 Jan 18 16:46 .
drwx------  10 testtest  users  512 Jan 18 16:10 ..
drwxr-xr-x   4 testtest  users  512 Jan 18 16:46 test-project
```

ちなみにサーバーに二つの環境（ステージング環境・本番環境）作る場合は以下の例のように、
`/repos`ディレクトリ以下に`staging`と`production`のディレクトリを作りそれぞれで`git clone`する。


```
[testtest@www4043 ~/repos]$ mkdir stg
[testtest@www4043 ~/repos]$ mkdir production
[testtest@www4043 ~/repos]$ ls -la
total 16
drwxr-xr-x   4 testtest  users  512 Jan 18 18:53 .
drwx------  12 testtest  users  512 Jan 18 18:03 ..
drwxr-xr-x   2 testtest  users  512 Jan 18 18:53 production
drwxr-xr-x   3 testtest  users  512 Jan 18 18:40 stg
```

ここからは主に`production`ディレクトリ上での作業を例として説明していきます。


## 【番外】シェルをbashに変更する

個人的に`bash`に慣れているので`chsh`から変更する方法も載せておきます。

`which`コマンドで**bash**の実行ファイルを確認。  
`chsh`コマンドでオプション`-s`(--shell)を指定し、ログインユーザーのシェルを変更する。

```
% which bash
/usr/local/bin/bash
% chsh -s /usr/local/bin/bash
Password: 
chsh: user information updated
```

今後もこのbashを使用するためのファイルを作る。  
`root`へ移動してコマンドを叩く

```
% vi .bash_profile
```

以下を記述する

```
PATH=$PATH:$HOME/bin:$HOME/usr/local/bin
export PATH
```

保存（`!wq`）して`ssh`ログアウト→再ログインする

```
[testtest@www4043 ~]$ cat .bash_profile
PATH=$PATH:$HOME/bin:$HOME/usr/local/bin
export PATH
```

これでお馴染みのbashが使えるようになる

## ６，composerをインストールする

さくらサーバーはComposer（PHPのパッケージ管理システム）が入ってない[^1]

```
% composer -h
composer: Command not found.
```

ちなみに[Composer](https://getcomposer.org/)とは  

> Composer は、PHP のプロジェクトが必要とするライブラリやパッケージを管理する「ライブラリ依存管理ツール」です。


`root`へ移動してコマンドを叩く

```.bash
// rootへ移動
$ cd ~

// ディレクトリ生成
//「-p」オプションには「ディレクトリが存在しない場合は、自動で作成される」かつ「作ろうとしているディレクトリが存在していてもエラーにしない」
$ mkdir -p usr/local/bin/

// curl コマンドでcomposerをダウンロード＆インストール
// 「-sS」でエラーメッセージ表示
// 「--install-dir」で指定のディレクトリへインストールできる
$ curl -sS https://getcomposer.org/installer | php -- --install-dir=usr/local/bin/

// composer.pharを上階層のcomposerディレクトリへ移動
$ mv usr/local/bin/composer.phar usr/local/bin/composer
```

インストール後、入ってることを確認する（※`.bash_profile`にパスを通しておくこと）

```
[testtest@www4043 ~]$ composer -v
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 1.8.0 2018-12-03 10:31:16
```


## ７，プロジェクト内で`composer install`する

プロジェクトのディレクトリへ移動後、`composer install --no-dev`コマンドを実行

```
[testtest@www4043 ~/repos/production/test-project/laravel]$ composer install --no-dev
Loading composer repositories with package information
Installing dependencies from lock file
Package operations: 41 installs, 0 updates, 0 removals
  - Installing doctrine/event-manager (v1.0.0): Loading from cache
  - Installing doctrine/cache (v1.8.0): Loading from cache

  // 省略

  - Installing psy/psysh (v0.9.9): Loading from cache
  - Installing laravel/tinker (v1.0.8): Loading from cache
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover
Discovered Package: fideloper/proxy
Discovered Package: laravel/tinker
Discovered Package: nesbot/carbon
Package manifest generated successfully.
```

※レンタルサーバーによっては**PHPのモジュールがインストールされてなかったりしてエラーが出る**場合があります。
リリース前に十分な余裕をもって事前に確認しておきましょう。

## ８，環境設定ファイル（.env）生成

Laravelの標準に`.env.example`があるのでそれをこの環境用に設置するためにコピーコマンドで複製する

```
[testtest@www4043 ~/repos/production/test-project/laravel]$ cp .env.example .env
```

`.env`の中身の例

```.env
APP_NAME=Laravel
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost

LOG_CHANNEL=stack

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret

// 以下略
```

## ９，`key:generate`でアプリケーションのキーを発行する

`.env`ファイルを作成後、同ディレクトリで`php artisan key:generate`コマンドを実行してください。
Laravelが内部で暗号化に用いるキーになるため、**環境ごとに実行するようにしてください**。

```.env
APP_NAME=Laravel
APP_ENV=local
APP_KEY=****************************************** // ここにランダムなパラメータが生成される
APP_DEBUG=true
APP_URL=http://localhost

LOG_CHANNEL=stack

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret

// 以下略
```

## １０，環境ごとの設定を`.env`に書き込む

アプリケーションのキーが生成されたことを確認後、`vi`などで必要箇所（DBの設定や環境等）を編集してください。
（黒い画面慣れてないならFTPでつないで編集しても問題ないです）
ここでDBなどの情報が間違っていると次のフェーズでうまく動きません

あと**絶対に`.env`ファイルを`public`以下（外部から参照できる場所）に配置しないようにしてください**

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Don&#39;t 👏 put 👏 your 👏 .env 👏 files 👏 in 👏 the 👏 web-server 👏directory <a href="https://t.co/DWHmT6r6E3">https://t.co/DWHmT6r6E3</a> <a href="https://t.co/Qp5tun3CZh">pic.twitter.com/Qp5tun3CZh</a></p>&mdash; svbl (@svblxyz) <a href="https://twitter.com/svblxyz/status/1045013939904532482?ref_src=twsrc%5Etfw">September 26, 2018</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

**意外と多いみたいです**

そして、構築している環境によって**`APP_ENV`**と**`APP_DEBUG`**を**適切に設定するようにしてください**。
（例：本番環境なら**`APP_ENV=production`**、**`APP_DEBUG=false`**）

特に**`APP_DEBUG`**が**本番環境なのに`true`に設定していて、バグを踏んだ際にWhoopsが表示されるWebアプリを今までに何個も発見しています**。
**どれだけ`.env`ファイルを参照できない場所へ設置していてもWhoopsが表示されて環境変数を見れる状態だとなんの意味もないです。**

## １１，DBを作成（`php artisan migrate`）

諸々と環境変数を設定後、`artisan`コマンドを実行してDBを構築

```
[testtest@www4043 ~/repos/production/test-project/laravel]$ php artisan migrate
**************************************
*     Application In Production!     *
**************************************

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

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

// 省略

// php artisan migrate:statusでできてるか確認

[testtest@www4043 ~/repos/production/test-project/laravel]$ php artisan migrate:status
+------+-------------------------------------------------------------------------------------+
| Ran? | Migration                                                                           |
+------+-------------------------------------------------------------------------------------+
| Y    | 2014_10_12_000000_create_users_table                                                |
| Y    | 2014_10_12_100000_create_password_resets_table                                      |
| Y    | 2018_12_20_122201_create_categories_table                                           |
+------+-------------------------------------------------------------------------------------+
```

## １２，リポジトリとpublicとでシンボリックリンクを張る

`root`へ戻って`www`へ移動し、シンボリックリンクを貼ります。

```
[testtest@www4043 ~/www]$ ln -s /home/testtest/repos/production/test-project/laravel/public/ production
[testtest@www4043 ~/www]$ ls -la
total 8
drwxr-xr-x   2 testtest  users  512 Jan 18 19:23 .
drwx------  12 testtest  users  512 Jan 18 19:02 ..
lrwxr-xr-x   1 testtest  users   64 Jan 18 19:23 production -> /home/testtest/repos/production/test-project/laravel/public/
```

たまにうまくパスを指定していなくて失敗することがある（本人談）ので要注意


## １３、DBに初期値入れていく（※必要あるなら）

DBへマスタデータなど入れておく必要があるなら`Seeder`を実行しておく

```
[testtest@www4043 ~/repos/production/test-project/laravel]$ php artisan db:seed --class=DatabaseSeeder
**************************************
*     Application In Production!     *
**************************************

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

Seeding: BasesTableSeeder
Seeding: CategoriesTableSeeder
[testtest@www4043 ~/repos/production/test-project/laravel]$
```


これで一通りの準備ができたはずです。
URLへアクセスして正常に動いていることを確認してください。

（ちなみにここまでしなくても「hello, world」したいだけなら１０の段階ででできるはずです）


# バリューサーバーで動かす（おまけ）

本当はバリューサーバーでの環境構築手順も書く予定でしたが、**自分用にまとめた資料がどっか逝った**ので覚えている限りのTipsを書いておきます。

## PHPのバージョンをコンパネから7.2以上へ変更しておく

おそらくPHPのバージョンがデフォルトで**5.6**になっている[^1]ので、コントロールパネルから7.2以上のバージョンへ変更してください。
でないと**Laravelがそもそも動かない**です
（確か5.4系だとPHP5.6でも動いたはずですがおすすめしません）

## `php`のエイリアスを張っておく

デフォルトでコマンドをたたく際はコンパネから設定した`PHPバージョン`+`実行したいコマンド`を打つ必要があるので、環境構築の初めにphpのエイリアスを張っておきましょう。
でないと、以下のように

```
php56cli composer.phar -V
```

と、`php[version]cli`と書かないとコマンド実行できません。

## `xmlwriter`がインストールされてない

PHPの拡張機能`xmlwriter`が入っていないため、[PhpSpreadsheet](https://github.com/PHPOffice/PhpSpreadsheet)などのライブラリが動きませんでした。[^1]
これに関してはレンタルサーバー側が対応してくれるまでどうしょうもないので、`xmlwriter`機能を使うライブラリを仕様する場合は注意が必要かなと

# おわり
- 何回も行っておきますが**情報の鮮度的に19年9月ごろまでの話で今現在上記の通りでない可能性も無きにし**です。
- ちなみに自分が携わったプロジェクトに関して言えば**8割くらい、業務システムはほぼ100％レンサバ指定**でした
- ちなみにちなみに明日は前職の後輩@namizatopが記事書くようですよ（お


# 参考
- [さくらのレンタルサーバーでcomposerめも - Qiita](https://qiita.com/tonosamart/items/e1d7ee95bf1b2a4532ff)
- [さくらのレンタルサーバにComposerをインストールする方法 – かきくけ子のブログ](http://kakikukeko.sakura.ne.jp/blog/install-composer-on-sakura/)
- [さくらのレンタルサーバのシェルをbashに変更する方法 – かきくけ子のブログ](http://kakikukeko.sakura.ne.jp/blog/chsh-bash/)


[^1]: 2019年9月頃の話ですので現在は異なるかもしれません