Laravel6.x On Xserver(X10) with Queue/Job

XserverにLaravelアプリケーションをデプロイして動かしたメモ　わりと簡単だった
# 概要
基本的には、https://readouble.com/laravel/6.x/ja/installation.html に記載されているシステム要件を満たすように準備していけばいいはず。アセットのコンパイルでnpm、デプロイはgitサーバーからpullしたいので、

- php7.2以上
- composer
- node/npm
- git

が入っていれば概ね良さそう。更に、job/queue を使いたいのでキューワーカーのプロセスをデーモン化する

- supervisor

がほしい。上記環境を整えた後、Laravelアプリケーションを公開するセッティングを進める。

## 事前調査（超やっつけ）
- Linuxディストリビューション
 よくはわからんがyumがあったのでRedHat系っぽい。が、root権限は無いのでyumは使えなそう（当たり前か）

- PHP 
  コンパネから7.3に変更しても、CLIのバージョンは5.4.16となっていた。
  /usr/bin/php を指してる。
- git
  入ってる（version 1.8.3.1）
- node
  入ってない
- composer 
  入ってる（version 1.9.1）
- supervisor
  入ってない。root権限が無いのでyumでインストールすることもできない。困りそう。cronは使えるので、1分間隔でcronにキューワーカのプロセスを起動させる、くらいで行けるかな？
  →[ググったら全く同じことをやろうとしてる](https://chinotsubo.com/laravel-queue-on-shared-hosting/)のを見つけたので、なんとか大丈夫そう

# 前提
Laravelバージョンは6.x、XServerのプランはX10
[SSH設定/エックスサーバー](https://www.xserver.ne.jp/manual/man_server_ssh.php)
→SSH接続成功してる

[PHPのバージョンについて/エックスサーバー](https://www.xserver.ne.jp/manual/man_program_php_ver.php)
→PHP7.3に切り替え実施済み

[MySQLの設定/エックスサーバー](https://www.xserver.ne.jp/manual/man_db_setting.php)
→Mysqlデータベース作成、接続ユーザー設定済み

[無料独自SSL設定/エックスサーバー](https://www.xserver.ne.jp/manual/man_server_ssl.php)
→SSL設定済み


# 環境構築
## CLIのPHPバージョン変更
### 参考URL
[XSERVER（エックスサーバー）にLaravelアプリを構築する方法/2018.12.10](https://blog.hiroyuki90.com/articles/laravel-xserver/)

[XSERVER の cli（ssh接続） で PHP7 を使用する](https://pgmemo.tokyo/data/archives/1350.html)

### 手順

デフォルトのバージョンは5.4.16のようなので、webサーバ側に合わせる（今回は7.3）

~~~sh
mkdir $HOME/bin
ln -s /usr/bin/php7.3 $HOME/bin/php
vi $HOME/.bash_profile
~~~

.bash_profile を修正

~~~diff
- PATH=$PATH:$HOME/.local/bin:$HOME/bin
+ PATH=$HOME/bin:$PATH:$HOME/.local/bin
~~~

修正したら保存して、反映

~~~sh
source $HOME/.bash_profile
~~~

## Node.js インストール

### 参考URL

[レンタルサーバ「XSERVER」にNode.jsをインストールする](https://helog.jp/server/xserver-node-js-install/)

[nodebrewのインストールとnodeのセットアップ](https://qiita.com/nakanowax/items/48f32a1f22a60dbd2959)

### 概要

nodebrew経由で入れるのが楽っぽい

### 手順

#### nodebrew インストール

~~~sh
wget git.io/nodebrew
perl nodebrew setup
vi $HOME/.bash_profile
~~~

またパスを追加

~~~diff
- PATH=$HOME/bin:$PATH:$HOME/.local/bin
+ PATH=$HOME/bin:$HOME/.nodebrew/current/bin:$PATH:$HOME/.local/bin
~~~

修正したら保存して反映、バージョン表示されればOK

~~~sh
source $HOME/.bash_profile
nodebrew -v
~~~

#### node/npm のインストール

~~~sh
# stableを入れる
nodebrew install-binary stable
# 入ったバージョンを確認
nodebrew list
# 確認したバージョンをuse
nodebrew use v12.14.1
# node/npmのバージョン確認
node -v
npm -v
~~~

## キューワーカー設定

キューワーカーをデーモンプロセスにしたいがsupervisorはインストールできないっぽい。crontabに一定間隔で叩かせればいけそう。

### 参考URL

[https://chinotsubo.com/laravel-queue-on-shared-hosting/](https://chinotsubo.com/laravel-queue-on-shared-hosting/)

### Karnel.php にスケジュール設定

参考URLとオプションを少し変えて、1分間隔でキューワーカー起動、JOBがなければ勝手に落ちるようにしてる。アプリケーションの運用上Jobがたまり続けることもそんなになさそうなので、restartも要らないかなー、運用しながら様子みるかなー、って感じで

~~~php
/**
  * Define the application's command schedule.
  * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
  * @return void
  */
protected function schedule(Schedule $schedule)
{
    //supervisorが使えない環境用の代替運用：1分間隔でキューワーカーを起動。
    $schedule->command('queue:work --tries=1 --stop-when-empty')
        ->everyMinute()
        ->withoutOverlapping();
}
~~~

### crontabにLaravelのタスクスケジューラを登録

いつもの。Xserverのコンパネから設定すればOK

[https://readouble.com/laravel/6.x/ja/scheduling.html](https://readouble.com/laravel/6.x/ja/scheduling.html)



# アプリケーションのセットアップ

## ソースコードのデプロイ

gitリポジトリ上にLaravelプロジェクトが置いてある前提、とりあえずlaravelというディレクトリを作って放り込む

~~~sh
cd ~/<example.com>
git clone <repo url> laravel
cd laravel
~~~

## 依存パッケージのインストール

いつもの。

~~~
composer install
~~~

## .envファイルの作成と編集

いつも通り。

~~~sh
cp .env.example .env
php artisan key:generate
vi .env
~~~

いつも通り。コンパネで作成したMysqlデータベースを指すように、設定を適宜修正。

~~~diff
- DB_HOST=
- DB_DATABASE=
- DB_USERNAME=
- DB_PASSWORD=
+ DB_HOST=＜コンパネで確認＞
+ DB_DATABASE=＜コンパネで作成したDB名＞
+ DB_USERNAME=＜コンパネで作成、設定したユーザ＞
+ DB_PASSWORD=＜コンパネで設定したパスワード＞
~~~

他にも必要な項目があれば適宜実施。とりあえず動かして動作確認するところまで行けば良いので、開発環境と同じような感じで設定しておくと良いでしょう。（メールはログに吐いたり、とりあえずRedisを使わない設定にしておいたり、Queueをsyncにしたり、とか）

### DB接続の確認

上記編集を完了して、DBに接続できるかをチェック

~~~sh
php artisan tinker
~~~

tinker内で下記実行し、日時が正しく取れればDB接続OK

~~~php
DB::select("select now()");
~~~

## webサーバー周りの設定

ドキュメントルートをいじったりはできなそう（調べてない）ので、.htaccessを編集しリダイレクトを設定（全部 public へ）

~~~sh
vi ~/example.com/public_html/.htaccess
~~~

~~~diff
+ <IfModule mod_rewrite.c>
+    RewriteEngine On
+    RewriteRule ^(.*)$ public/$1 [QSA,L]
+ </IfModule>
~~~

※webサーバがnginxでも.htaccessを書けばいいらしい。謎

.htaccessに書いたリダイレクト先のpublic がLaravel/publicを指すようにシンボリックリンク作成

~~~sh
 ln -s /home/<USERNAME>/<example.com>/laravel/public ./public
~~~