XSERVER BusinessでLaravelとNode.jsを動かす

XSERVER Business （エックスサーバー社が提供する法人向けレンタルサーバサービス）にLaravelアプリケーションを新規導入した際の手順メモです。

# 制約事項
- レンタルサーバなので、root権限がない。
- 対象のサーバが、かつて存在したシックスコアを継承したものであるため、最新ハード／ソフトが導入されたサーバに移行できない。

という制約があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/a02ac8d2-a39b-3693-5ee5-2d9c34ce9482.png)
また、ディストリビューションなどの仕様は非公開となっています。

https://support.xserver.ne.jp/faq/service_server_os.php

# 手順
## サーバーパネルでの操作
XSERVER Business のサーバーパネルにログインします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/ed3e1cb3-fb27-800b-721a-2aaa20170090.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/36d5f473-d36f-4ef1-1e54-fdf9bbed93dc.png)

### PHPバージョン切替
【PHP】－【PHPバージョン切替】－【ドメイン名】から設定します。
今回導入するのはLaravel9ベースになるので、PHPのバージョンは8.1以上を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/b38e14b3-139e-3e9b-c60e-35e48a95d712.png)
PHPスクリプトの動作モードには、Webサーバ経由で実行するCGI版と、Webサーバを経由せずコマンドラインで実行するCLI版があります。
サーバーパネルから変更できるのはCGI版です。

### データベースの作成
【データベース】－【MySQL設定】から設定します。

「MySQL追加」のタブをクリックし、データベース名を入力します。
必ず固定のプレフィックス（サーバーID）が付きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/b5cb5b6f-dce5-4273-8241-87e641c22fa3.png)

「MySQLユーザ追加」のタブをクリックし、ユーザIDとパスワードを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/e435b528-907b-48b8-6aa9-42ae3b393677.png)

最後に、追加したデータベースのアクセス権を、追加したユーザに付与します。

## ターミナルでの操作
SSHでサーバにログインします。
SSHが無効なら、サーバーパネルから有効化し、公開鍵認証の鍵ペア生成と公開鍵の登録を済ませて下さい。

ホームディレクトリ（`/home/[サーバーID]`）に移動します。
```shell
cd ~
```

### PHPの設定
コマンドラインで動作するPHPのバージョンを切り替えます。（シンボリックリンク）

```shell
mkdir bin
ln -s /usr/bin/php8.1 $HOME/bin/php
```

パスを通します。

```:~/.bash_profile
PATH=$HOME/bin:$PATH
```

即時反映し、PHPのバージョンを確認します。

```shell
source .bash_profile
php -v
```

### Composerのインストール
https://getcomposer.org/download/ からインストールスクリプトをターミナルにコピペし、実行します。

```shell:例
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === '55ce33d7678c5a611085589f1f3ddf8b3c52d662cd01d4ba75c0ee0459970c2200a51f492d557530c71c15d8dba01eae') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
```

パスの通ったディレクトリにコマンドを移し、composerのバージョンを確認します。

```shell
mv composer.phar bin/composer
composer -V
```

### Laravelプロジェクトの作成

```
cd $HOME/[ドメイン名]
mkdir laravel && cd laravel
composer create-project laravel/laravel [プロジェクト名]
```

プロジェクトのルートディレクトリに移動し、Laravelのバージョンを確認します。

```
cd [プロジェクト名]
php artisan --version
```

### プロジェクトディレクトリのpublicフォルダを公開フォルダに設定

```
ln -s $HOME/[ドメイン名]/laravel/[プロジェクト名]/public $HOME/[ドメイン名]/public_html
```

`.htaccess`にURLリダイレクトのルールを記述します。
エックスサーバーはnginxですが、`.htaccess`をそのまま利用できるようです。

```apache:/home/[サーバーID]/[ドメイン]/public_html/.htaccess
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule ^(.*)$ public/$1
</IfModule>
```

`https://[ドメイン名]` にアクセスし、トップページの正常表示を確認します。
独自SSLを設定しなかった場合は、`https`を`http`に読み替えて下さい。

:::note warn
`Composer detected issues in your platform: Your Composer dependencies require a PHP version ">= 8.1.0".` のエラーになった場合は、サーバーパネルにおいてPHPバージョン切替ができていません。
:::

### データベースの設定
サーバーパネルで設定したデータベース情報をLaravelの環境ファイルに記述します。
プロジェクトのルートディレクトリにある`.env`を編集します。

```ini:.env
DB_CONNECTION=mysql
DB_HOST=mysql5b.sixcore.ne.jp
DB_PORT=3306
DB_DATABASE=データベース名（サーバーID含む）
DB_USERNAME=ユーザー名
DB_PASSWORD=パスワード
```

マイグレーションできることを確認します。
```
php artisan migrate
```

### Node.js のインストール
ここからは必要に応じて。
`nodebrew`を使って`Node.js`をインストールしていきます。

```
wget git.io/nodebrew
perl nodebrew setup
```

パスを通します。

```:~/.bash_profile
PATH=$HOME/.nodebrew/current/bin:$HOME/bin:$PATH
```

即時反映し、`nodebrew`のバージョンを確認します。

```
source .bash_profile
nodebrew -v
```

いったん、最新バージョンの`Node.js`をインストールしてみます。

```
nodebrew install-binary latest
nodebrew use v19.5.0
```

```
node -v
```

nodeコマンドでエラーになりました。

```
node: /lib64/libm.so.6: version `GLIBC_2.27' not found (required by node)
node: /lib64/libc.so.6: version `GLIBC_2.25' not found (required by node)
node: /lib64/libc.so.6: version `GLIBC_2.28' not found (required by node)
node: /lib64/libstdc++.so.6: version `CXXABI_1.3.9' not found (required by node)
node: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by node)
node: /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by node)
```

このNodeバージョンでは、GLIBCのさらに新しいバージョンを必要としているようです。
インストールされているGLIBCのバージョンを確認します。

```
$ ldd --version
ldd (GNU libc) 2.17
```

今現在利用可能なNodeバージョンの一覧を確認します。

```
nodebrew ls-remote
```

GLIBC 2.17で動くNodeバージョンをインストールします。

```
nodebrew install-binary v17.9.1
nodebrew list
```

Nodeバージョンを切り替えます。

```
nodebrew use v17.9.1
```

Laravelプロジェクトのルートディレクトリに移動し、`package.json`に記述されたパッケージを一括でインストールします。

```
cd /home/[サーバーID]/[ドメイン名]/laravel/[プロジェクト名]
npm install
```