この作業が何回やっても慣れず、自分の備忘録的な意味も含めて書かせていただきました。
もしよければ参考にしてみてください。
SSH接続
初期設定の部分は簡単なので飛ばします
ログインコマンドはこちらです
ssh -l サーバーID -i ~/.ssh/サーバーID.key サーバーID.xsrv.jp -p 10022
PHPのバージョンアップ
1 , 現在のバージョンを確認
LaravelにはPHPのバージョンが7以上であることを要求されています。
まずは以下のコマンドを実行してphpのバージョンを確認してみます。
php -v
laravel8.*を使うときはバージョンが7以上
laravel9.*を使うときはバージョンが8以上であれば、そのままでも大丈夫です。
2 , バージョンアップ
では、実際にphpのバージョンを変更していきます。
まずはHOME直下にbinディレクトリを作成します。
mkdir $HOME/bin
下記コマンドを実行すると使えるバージョンが表示されます。
find /opt/php-*/bin -type f -name 'php'
次に先ほど作成したbinディレクトリにシンボリックリンクを作成します。
ln -s /opt/php-8.0.12/bin/php $HOME/bin/php
*「php-8.0.12」のところは使いたいphpのバージョンに合わせてください。
次に「.bash_profile」ファイルを開きます。
vi ~/.bash_profile
ファイルを開いたら次の「変更後」のように「変更前」の内容を書き換えます。
//変更前
PATH=$PATH:$HOME/bin
//変更後
PATH=$HOME/bin:$PATH
「a」キーを押してインサートモードにし、記述内容を修正します、修正が終わったら「esc」キーでInsertモードを解除、「:wq」で変更したファイルを保存します。
次に新しく作ったバスを反映させます。
source ~/.bash_profile
これでphpのバージョンアップは完了です。
バージョンアップ出来ているか確認してみます。
php -v
このときXserverの方でも設定したphpバージョンに合わせておくことをお勧めします。
3 , Composerのインストール
以下のコマンドを実行してComposerをインストールします。
curl -sS https://getcomposer.org/installer | php
composerのインストールが正常に終了したらバージョンを確認してみます。
composer -v
バージョンが表示されていれば、composerはインストールされています。
4 , Node.jsのインストール
今回はバージョン管理ツール「nodebrew」を使ってNode.jsをインストールを行います。
下記コマンドで「nodebrew」をインストールします。
wget git.io/nodebrew
次に「nodebrew」を使えるようにするため下記コマンドでセットアップします。
perl nodebrew setup
表示されたログの通りにパスを通していきます。
下記コマンドでパスを通します。
echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.bath_profile
下記コマンドでパスを反映させます。
source ~/.bath_profile
「nodebrew」がインストールされているか確認しましょう。
nodebrew -v
続いて「nodebrew」を使って「Node.js」をインストールします。
nodebrew install-binary latest
インストールしたNode.jsのバージョンを確認し、これをアクティブにします。
nodebrew list
nodebrew use 確認したバージョン
最後にnodeとnpmのバージョンを確認して、node.jsのインストールは完了です.
node -v
npm -v
5 , LaravelをGIT経由でクローン
まず、SSHの現在の場所から、Laravelをインストールするディレクトリ(フォルダ)に移動します。
cd ドメイン名
ここに、Laravelプロジェクトをクローンします。
git clone https://github.com/user/xxxx.git
このときプロジェクトをprivateにしているとパスワードを求められ、アクセストークンが必要になるので
この作業の時だけはpublicにしとくのがお勧めです。
cloneしただけだと、vendorフォルダなど、足りないものがあり、まだLaravelは動かないので、それをComposerでインストールしていきます。
cd プロジェクト
composer install
続いて、envファイルの設定をしていきますが、cloneしたプロジェクトには.envファイルがないので、「.env example」をコピーして使います。
cp .env.example .env
ファイルを開いて、変更します。
vi .env
修正する内容は下記の通りです。
APP_NAME=○○ //アプリ名
APP_ENV=production //「local」から「production」にする
APP_KEY= ←空白でOK
APP_DEBUG=false //「true」から「false」にする
APP_URL=https://ドメイン名 //httpsにするのがポイント
~省略~
DB_CONNECTION=mysql
DB_HOST=○○.xserver.jp もしくは localhost //Xserverのphpmyadminから確認
DB_PORT=3306
DB_DATABASE=○○ //xserverで作成したデータベース名
DB_USERNAME=○○ //xserverでユーザー名
DB_PASSWORD=○○ //xserverでパスワード
~省略~
次にアプリケーションキーを作成します
php artisan key:generate
これで.envファイルの「APP_KEY=」の空白のところに値が追加されているはずです。
データベースのテーブルを作る必要があるので、マイグレーションファイルを実行します。
php artisan migrate
5 , シンボリックリンクの作成
Laravelでは全ての処理の起点は「public」ディレクトリでされているので、アプリURLにアクセスしたらpublicディレクトリに通るようにシンボリックリンクを貼ります。
ということで、下記コマンドでシンボリックリンクを貼ってください。
ln -s ~/メインドメイン/プロジェクト名/public ~/メインドメイン/public_html/public
6 , .htaccessファイルを2つ追加
まず、public_html内に.htaccessがあるかチェックしてください。あればそれを編集、無ければメモ帳などで作成します。
下記コードをpublic_html内の.htaccessに書き換えます
<IfModule mod_rewrite.c>
RewriteEngine On
# Laravelのpublicフォルダをサイトトップ表示
RewriteRule ^(.*)$ public/$1 [QSA,L]
</IfModule>
さらに今度は、プロジェクト/public内に.htaccessがあるかチェックしてください。
あれば、それを編集、無ければ作成してください。下記コードを追記します。
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews -Indexes
</IfModule>
RewriteEngine On
# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$
RewriteRule ^ %1 [L,R=301]
# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
# httpsからの通信でwww有りの場合、www無しにリダイレクト
RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} ^www.japaslang.com$
RewriteRule ^(.*)$ https://japaslang.com/$1 [R=301,L]
</IfModule>
以上で、デプロイ作業は完了です。
URLにアクセスして、画面に表示される確認をしましょう。
お疲れ様でした。
おまけ
laravel9で作成したwebアプリを公開するときに、xseverのphpバージョンが古いことから
Fatal error: Uncaught TypeError:
Return value of Illuminate\Container\Container::offsetGet()
must be an instance of Illuminate\Container\mixed,
instance of Illuminate\Events\Dispatcher returned in
/home/xxx/vendor/laravel/framework/src/Illuminate/Container/Container.php:1417
こちらのエラーが出ました。
同様のエラーが出た方は、Xserverのphpバージョンを8以上にすることで解決すると思います。