10
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

XserverにLaravel9をデプロイした手順

Last updated at Posted at 2023-03-11

Xserver(スタンダードプラン)にLaravel9をデプロイした際の手順を備忘録として残しておきます。
今回扱うLaravelのバージョンは9.36.4となります。

SSH接続

1.XserverのSSH設定を有効にする

サーバーパネルのアカウントから「SSH設定」をクリックします。
スクリーンショット 2023-03-11 114642.png
「SSH設定」で「ONにする」を選択します。
スクリーンショット 2023-03-11 114759.png

2.公開認証用の鍵ペアを生成する

「公開認証用鍵ペアの生成」タブを選択し、パスフレーズ(SSH接続する際に必要なパスワード)を入力して、確認画面へ進むボタンをクリックします。
スクリーンショット 2023-03-11 115120.png
確認画面から「生成する」ボタンをクリックすると「サーバーID.key」という名前のファイルがダウンロードされます。

3.ダウンロードしたファイルを移動させる

CLIから以下のコマンドでダウンロード下ファイルを移動させます。

mv ~/Downloads/サーバーID.key ~/.ssh/

.sshフォルダがない場合は以下のコマンドで作成してから先ほどのコマンドを実行してください。

mkdir ~/.ssh

4.実際にSSHで接続する

接続方法はCLIで下記を実行します

ssh -l サーバーID -i ~/.ssh/サーバーID.key サーバーID.xsrv.jp -p 10022

PHPのバージョンアップ

Laravel9.xはPHPのバージョンが8.0以上必要なので変更する必要があります。

1.サーバーパネルから変更

まずは、サーバーパネルからバージョンを変更していきます。
サーバーパネルの「PHP」から「PHP Ver.切替」をクリックします。
スクリーンショット 2023-03-11 121515.png
次にLaravelを使用するドメインを選択します。
スクリーンショット 2023-03-11 121956.png
次にPHPのバージョンを選択し、変更ボタンをクリックします。
スクリーンショット 2023-03-11 122806.png
今回は8.0以上で推奨になっていた8.0.25を選択しました。

2.CLIから変更

2.1バージョン確認

まずはバージョンを確認します。

php -v

これでバージョンが8.0以上でない場合はバージョンを上げる必要があります。

2.2シンボリックリンク作成

XserverではSSH接続するユーザーにはroot権限を付与されないため、ホームディレクトリ以外にファイルを作ることができません。
そのため、ホームディレクトリからパス設定をする必要があります。
まずは「bin」ディレクトリを作成します。

mkdir $HOME/bin

次にシンボリックリンクを作成します。
ここではサーバーパネルから選択したのと同じ8.0.25を選択しています。

ln -s /opt/php-8.0.25/bin/php $HOME/bin/php

次にパスを通してあげます。
下記を実行して「.bash_profile」を編集します。

vi ~/.bash_profile

インサートモードにして、編集します。

.bash_profile
PATH=$PATH:$HOME/bin
 下記に変更
PATH=$HOME/bin:$PATH

エスケープして、「:wq」で保存したら下記を実行します。

source ~/.bash_profile

最後にもう一度PHPのバージョンを確認します。

php -v

これでバージョンが変わっていればOKです。

Composerのインストール

下記のコマンドを実行してComposerをインストールします。
バージョンによって異なる場合があるためComposer公式サイトから参照するのをオススメします。

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');"

インストールするとcompoer.pharと.configディレクトリが作成されるので、composer.pharをcomposerという名前にして.config/composer/vendor/bin/の下に保存します。

mkdir -p .config/composer/vendor/bin/
mv composer.phar .config/composer/vendor/bin/composer

.config/composer/vendor/bin/にはパスが通っていないためパスを設定する必要があります。(先ほどのPHPの場合と同様に、composerのパスを追加)

.bash_profile
PATH=$HOME/bin:$PATH PHP
PATH=$HOME/.config/composer/vendor/bin:$PATH Composer

.bash_profileの変更を反映させます。

source ~/.bash_profile

最後にバージョン確認をします。

composer -V

これでバージョンが確認できればOKです。

Node.jsのインストール

npmを使用するのに必要なのでインストールをします。

ただし、Node.jsをそのまま入れるとバージョンの管理に手間がかかるため、バージョン管理ツール「nodebrew」を使ってNode.jsをインストールを行います。

1.nodebrewのインストール

CLIから下記のコマンドでインストールをします。

wget git.io/nodebrew

ダウンロードができたら、セットアップをします。

perl nodebrew setup

この際に、下記のエラーが発生しましたが特に問題ありませんでした。

perl nodebrew setup
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
	LANGUAGE = (unset),
	LC_ALL = (unset),
	LC_CTYPE = "UTF-8",
	LANG = "ja_JP.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
Can't open perl script "nodebrew": No such file or directory

一応こちらの記事を参考に解決できるみたいです。

次に、/.bash_profileに下記のコマンドを追記してパスを通します。

echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.bash_profile

変更した内容を反映させます。

source ~/.bashrc

最後にバージョン確認をします。

nodebrew -v

バージョンが確認できればOKです。

2.Node.jsのインストール

nodebrewを使って、Node.jsのインストールをします。

nodebrew install-binary latest

下記のコマンドでインストールしたNode.jsを確認します。

nodebrew list

今回インストールしたのは「v19.7.0」だったので、こちらをアクティブにします。

nodebrew use v19.7.0

最後にバージョンを確認します。

node -v

ここで、私の環境では下記のエラーが発生しました。

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)

こちらのサイトを参考にバージョンをv17.9.1に変更したら解決できました。

Laravelプロジェクトの作成

1.git clone

今回は既に作成済みのものなのでGitからcloneしていきます。
まずはホームディレクトリから使用するドメインのディレクトリに移動します。

cd ドメイン名

次にgitからcloneします。

git clone リモートURL

2.シンボリックリンク作成

Xserverの公開ディレクトリであるpublic_htmlに、Laravelの公開ディレクトリであるpublicのシンボリックリンクを作成します。

ln -s $HOME/サーバーID/ドメイン名/プロジェクト名/sample-project/public $HOME/サーバーID/ドメイン名/public_html

3.htaccessを編集

ドメイン名のURLにアクセスがあったら、先ほど作成したシンボリックリンク「public」フォルダ内を参照するように(すべてのリクエストがプロジェクト名/publicを通して処理されるように)、public_html内の.htaccessを編集します。

vi ~/ドメイン名/public_html/.htaccess

から下記を追記します。

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

データベースの設定

1.データベースの追加

サーバーパネルからデータベースを追加していきます。
データベースの「MySQL設定」をクリックします。
スクリーンショット 2023-03-11 200342.png
「MySQL追加」タブからMySQLデータベース名を入力して確認画面へ進み、確認して追加を行います。
スクリーンショット 2023-03-11 200524.png

2.MySQLユーザーの追加

「MySQLユーザー追加」タブからMySQLユーザーIDとパスワードを入力して確認画面ヘ進み、確認して追加を行います。
スクリーンショット 2023-03-11 200928.png
「MySQL一覧」タブからアクセス未所有ユーザーの追加ボタンをクリックして、先ほど作成したデータベースにユーザーを追加します。
スクリーンショット 2023-03-11 201304.png

3.「.env」ファイルの編集

cloneしたプロジェクトは.envファイルは存在しないので、プロジェクトに移動して.env.exampleからコピーします。

cd ~/ドメイン名/プロジェクト名
cp .env.example .env

.envファイルを下記に修正します。

DB_CONNECTION=mysql 
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=作成したMySQLデータベース名
DB_USERNAME=MySQLユーザ名
DB_PASSWORD=MySQLユーザを作成した時のパスワード

次に下記のコマンドからmigrationを実行します。

php artisan migrate

この際に私の環境では下記のエラーが発生しました。

SQLSTATE[HY000]: General error: 1298 Unknown or incorrect time zone: 'Asia/Tokyo'

原因としては、config/database.php内のtimezoneを設定していたからでした。

database.php
'mysql' => [
    'driver' => 'mysql',
    'url' => env('DATABASE_URL'),
    'host' => env('DB_HOST', '127.0.0.1'),
    'port' => env('DB_PORT', '3306'),
    'database' => env('DB_DATABASE', 'forge'),
    'username' => env('DB_USERNAME', 'forge'),
    'password' => env('DB_PASSWORD', ''),
    'unix_socket' => env('DB_SOCKET', ''),
    'charset' => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
    'prefix' => '',
    'prefix_indexes' => true,
    'strict' => true,
    'engine' => null,
    'timezone' => 'Asia/Tokyo', ←ここが原因
    'options' => extension_loaded('pdo_mysql') ? array_filter([
    PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
    ]) : [],
],

timezoneを指定している箇所を削除してあげると解決できました。

Nodeパッケージのインストールとビルド

プロジェクト直下で下記のコマンドを実行し、NPMパッケージをインストールします。

npm install

次に、トランスパイルを行います。(JS/CSSをビルド)
今回のLaravel9はViteになるので下記のコマンドを実行します。

npm run build

Mixの場合は下記を実行します。

npm run prod

実行するとプロジェクト直下のpublicフォルダにjs/cssが出力されます。

各種設定

最後に少し設定を行います。

.envファイルの設定

まずはアプリケーションキーを下記コマンドから生成します。

php artisan key:generate

次にAPP_DEBUGをfalseに変更します。

APP_DEBUG=false

Cron設定

Cron設定に少し躓いたのでここに記しておきます。
まず、サーバーパネルのアカウントから「Cron設定」をクリックします。
スクリーンショット 2023-04-05 153748.png
その次にCron設定追加をクリックします。
スクリーンショット 2023-04-05 153654.png
分・時間・日・月・曜日に「*」を入力します。
スクリーンショット 2023-04-05 154043.png
次にコマンドに下記を入力し、確認画面ヘ進み作成します。

cd /home/プロジェクト名 && /usr/bin/php8.0 artisan schedule:run >> /dev/null 2>&1

ここではphp8.0を指定していますが自分の環境のphpのバージョンに合わせる必要があります。

常時SSL化

public_html内の.htaccessに下記を追加して常にhttpsにアクセスするようにします。

.htaccess
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

以上でデプロイ作業は完了です。
URLにアクセスして正しく画面が表示されるか確認してください。

10
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?