【Laravel】XServerにFTPでアップロードする手順!git未使用の超初心者向け
この記事からわかること
- Laravelを本番環境へアップロードする方法
- gitを使わない簡単な方法
- FTPで送信した場合にやらなければいけないこと
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
ローカル環境で構築していたLaravelのアプリ(サイト)を本番環境へアップロードする方法を超初心者向けに詳しくまとめてみました。
今回は実際に起きたエラーや解決法、gitを使わないLaravelアプリのデプロイ方法を解説していきます。
Laravelを本番環境にアップロードするには
ローカル環境にあるLaravelアプリを本番環境へアップロードする方法は以下の2つの方法があります。アプリを本番環境にアップロードすることをデプロイと言います。
Laravelを本番環境へアップロードする方法
- FTP(ファイル送信ソフト)を使う
- git(バージョン管理システム)を使う
FTPとはファイル送信ソフトのことで、本番環境であるサーバーに自分のパソコン内のファイルを送信できるソフトウェアです。
gitは分散型バージョン管理システムのことで、複数人でアプリを運営する時やバージョン管理をしたい時に古い状態に戻せたり、編集履歴を共有したりできるシステムです。
両者とも一長一短がありますが、gitを使って送信する方が将来的には良いのかもしれません。しかし今回はあえてgitを使わない送信方法を実践してみたのでまとめていきたいと思います。
gitを使わずFTPでアップロードする方法
まずは実際にローカル環境にあるLaravelアプリを本番環境へアップロードする流れを確認してみます。ローカル環境に既にLaravelアプリがある前提で話を進めていきます。
- 本番環境用に設定ファイルを変更
- ドキュメントルートを修正
- FTPで接続してローカルのLaravelをアップロード
- ターミナルからSSHでサーバーと接続
- バージョンアップやキャッシュの削除
このような流れで進めていきます。私の環境も載せておきますので参考にしてください。
私の環境
- ハードウェア:Mac
- ローカル環境:MAMP
- 本番環境 :X Server(エックスサーバー)
1.本番環境用に.envファイルを変更
まずは本番環境で運用するために「.envファイル」を編集していきます。「.envファイル」はプロジェクト配下にある隠しファイルで環境(environment)設定用のファイルです。
隠しファイルは通常では非表示になっているので「Shiftキー+cmdキー+.キー」を押して表示させます。
.envファイルを開いてみると以下のように記述されています。デフォルトではローカル環境で動作するような設定が記述されているのでここを本番環境にあったものに変更していきます。
APP_NAME=Laravel
APP_ENV=local
APP_KEY=キー値
APP_DEBUG=true
APP_URL=http://プロジェクト名.test
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=8889
DB_DATABASE=DBname
DB_USERNAME=root
DB_PASSWORD=root
DB_SOCKET=/Applications/MAMP/tmp/mysql/mysql.sock
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
↓↓↓本番用に↓↓↓
APP_NAME=公開するアプリ名
APP_ENV=production
APP_KEY=キー値
APP_DEBUG=false
APP_URL=公開用のURL
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=8889
DB_DATABASE=DBname
DB_USERNAME=本番用ユーザーネーム
DB_PASSWORD=本番用パスワード
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
変更したのはAPP_NAME
、APP_ENV
、APP_DEBUG
、APP_URL
とデータベース設定の部分です。DB_SOCKET
の記述があれば丸々削除しておきます。
APP_NAME
…サイト名
APP_ENV
…配置している環境状態(local/staging/production)
APP_DEBUG
…デバッグのON/OFF(本番ではOFFにする)
APP_URL
…本番サイトURL
データベース設定…Xサーバーのユーザー情報を記述(サーバーパネルから確認)
「.envファイル」を変更したら念の為、「config」>「database.php」も変更しておきましょう。
'default' => env('DB_CONNECTION', 'mysql'),
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
'mysql' => [
'driver' => 'mysql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '8889'),
'database' => env('DB_DATABASE', 'MyDB'),
'username' => env('DB_USERNAME', '本番用ユーザーネーム'),
'password' => env('DB_PASSWORD', '本番用パスワード'),
エックスサーバーのデータベースであるMySQLでの接続方法はこちらの記事にもまとめてありますので参考にしてください。
2.ドキュメントルートの修正(publicを消す)
続いてドキュメントルートの修正をしていきます。Laravelを使用するとアクセスするURLは「/public/ファイル名
」のようになっています。
本番環境ではURLをドメインのみにしたいのでドキュメントルート(URLで最初にアクセスできるファイル)を修正しておきます。
方法は色々ありますが、今回は超初心者向けの簡易版ということで「.htaccess」を新規に設置してのリダイレクト処理を行なっていきます。
GitHubにコードを共有してくれている方がいたので参考にさせていただきました。
Php laravel 5.5 project .htaccess file
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ ^$1 [N]
RewriteCond %{REQUEST_URI} (\.\w+$) [NC]
RewriteRule ^(.*)$ public/$1
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ server.php
</IfModule>
上記のコードをコピーして新しく「.htaccess」を作成します。設置場所はプロジェクト配下の「.envファイル」と同階層でOKです。
これでURLからpublicを消すことができます。ローカル環境でも使えますので正しい動作をしているか確認してみてください。
3.FTPで接続してローカルのLaravelをアップロード
設定ファイルの変更が終わったら実際にFTPソフトを使用してアップロードしていきます。今回は「FileZila(ファイルジラ)」というソフトを使っていきます。
エックスサーバーにアプリの格納場所(ドメイン)を準備し、「public_html」の下、サブドメインであれば「サブドメインファイル」の下にプロジェクトフォルダ配下の中身を全てアップロードしていきます。
appフォルダや.envファイル、publicフォルダがある以下画像階層を丸ごとです。作成した「.htaccess」も一緒にアップロードしてください。
多少時間はかかりますが、私の場合は10分ほどで終了しました。
4.ターミナルからSSHでサーバーと接続
続いてターミナル(コマンドライン)を使っての作業になります。まずSSHを使用できるようにサーバーの設定を変更していきます。
SSHとは「Secure Shell」の略称でネットワークに接続されているパソコンを安全(セキュア)に遠隔操作できる機能です。この機能を使ってサーバー内にアップロードしたファイルを操作していきます。
エックスサーバーのSSH設定でやること
- SSHを使えるようにONにする
- 公開鍵認証用鍵ペアを生成する
SSHの設定はエックスサーバーのサーバーパネルから変更します。公式サイトでも設定方法を説明していますので参考にしてください。
「アカウント」>「SSH設定」から設定をON
に、次に「公開鍵認証用鍵ペアの生成」にパスフレーズ(サーバーパスワード)を入力して生成をクリックするとファイル名:[サーバーID].keyといったファイルがダウンロードされます。
ダウンロードできたらファイル名([サーバーID].key)も格納場所(ダウンロードフォルダ)もいじらず次のステップに進みます。
4.1ターミナルでのSSH接続方法
まずは自分のパソコンの「アプリケーション」>「ユーティリティ」の中に入っているターミナルを開きます。起動したら以下のコマンドを打ちます。
$ mkdir ~/.ssh
mkdir
コマンドはディレクトリ(フォルダ)を作成するコマンドです。ここではhomeの真下に「.ssh」フォルダを作成しています。
$ mv ~/Downloads/サーバーID.key ~/.ssh/
続いて先ほど生成したID.keyを「.ssh」フォルダの中にmv
コマンドを使って移動させます。
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/サーバーID.key
移動させたらchmod
コマンドでパーミション(アクセス権)を変更しておきます。コマンドの引数は数字(0〜7で指定)が大きいほどアクセス権を緩く、少ないほど制限できます。数字で指定する場合、3つ続けて指定することで左から所有者権限、グループ権限、その他のユーザに対しての権限を付与することができます。
今回は2つのファイルに対して所有者のみに7(読込・書込・実行)と6(読込・書込)を付与して、操作できるようにしています。
これでSSH接続の準備が整ったので実際に接続していきます。下記のコマンドを自分のサーバIDに置き換えながら実行してみてください。
$ ssh -l サーバーID -i ~/.ssh/サーバーID.key サーバーID.xsrv.jp -p 10022
初めて接続しようとする場合、以下のような結果がでることがあります。
The authenticity of host '[サーバーID.xsrv.jp]:10022 ([XX.XXX.XXX.XX]:10022)' can't be established.
ED25519 key fingerprint is SHA256:**************************
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])?
これは「まだこの接続は信頼できません。暗号化キーは他に使われていません。接続を続行してもよろしいですか?」と表示されていますのでそのままyes
と入力してEnterを押せば接続が開始されます。
パスワード入力を求められるので先ほどのフレーズを入力して接続は完了です。
SSH接続を切断したい場合はexit
コマンドで実行できます。ここではまだ切断せずに次のステップに進んでいきます。
[サーバID] $ exit
5.PHPのバージョンアップやキャッシュの削除
SSH接続が完了したらやるべきことを一度整理しておきます。
- 適応されているPHPをLaravelが使えるバージョンに変更
- Laravelアプリ内に残っているキャッシュを削除
PHPのバージョンを更新しておかないとLaravelのartisan
コマンドが使えない可能性があるのでちゃんと最新にしておきましょう。
ここではComposerのインストールやnordbrewのインストールなどをやる人も多いですが、インストールせずとも正常に動作しますので飛ばした場合の解説をしていきます。
インストール方法を知りたい方は以下の記事を参考に、Mac部分を読み替えながら実行すれば可能です。
5.1PHPのバージョン確認とバージョンアップ
この段階でLaravelアプリがサーバーに格納されましたがまだ公開URLにアクセスしても正常に動作はしてくれません。
まずはサーバーで使われているPHPのバージョンを確認します。カレントディレクトリはそのままに以下のコードを打ち込みます。
$ php -v
PHP 5.4.16 (cli) (built: Apr 1 2020 04:07:17)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
with Zend OPcache v7.0.5, Copyright (c) 1999-2015, by Zend Technologies
するとこのようにバージョンを確認できます。2021/12/8時点ではPHP 5.4.16が使われていました。Laravelを動作させるには古いので最新のものに切り替えていきます。
PHPのバージョンを切り替える流れ
- Laravelが使えるバージョンか確認
- 古ければ変更できるバージョンを確認→変更
- 変更したPHPを使えるように$HOME/bin/php内にシンボリックリンクを作成
- 環境変数PATHを通す
まずはmkdir
コマンドで「bin」ディレクトリを作成しておきます。
$ mkdir $HOME/bin
次に以下のコマンドでバージョン変更できるPHPのバージョンを確認します。
$ find /opt/php-*/bin -type f -name 'php'
/opt/php-5.1.6/bin/php
/opt/php-5.3.3/bin/php
/opt/php-5.4.16/bin/php
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
/opt/php-7.4.3/bin/php
/opt/php-7.4.4/bin/php
/opt/php-7.4/bin/php
/opt/php-8.0.0/bin/php
/opt/php-8.0.1/bin/php
/opt/php-8.0.10/bin/php
/opt/php-8.0.12/bin/php
/opt/php-8.0.6/bin/php
/opt/php-8.0.7/bin/php
/opt/php-8.0/bin/php
バージョンを決めたらファイルのリンクを作成できるIn
コマンドでシンボリックリンク(ファイルの詳細や内容は見えないただのリンク)を先ほどの「bin」ディレクトリの中に作成しておきます。
$ ln -s /opt/php-8.0.12/bin/php $HOME/bin/php
phpのバージョン部分は適宜置き換えてください。続いて環境変数PATHを通します。ファイルの中身を変更したいのでテキストエディタであるVimを使って操作していきます。
vi
コマンドで指定したファイルを開きます。するとファイルが開きますので中身を変更していきます。
$ vi ~/.bash_profile
ファイルが開いたらi
キーを押してインサートモード(挿入)にします。これでメモ帳を操作するように変更できるようになります。PATH=$PATH:$HOME/bin
をコピペで貼り付け、変更できたら:wq
と打ち込みvimを終了させます。
PATH=$HOME/bin:$PATH
// ↓この行を追加する
PATH=$PATH:$HOME/bin
// 変更したら以下のコマンドをそのまま半角でそのまま入力し閉じる
:wq
これで環境変数PATHを通すことができたので設定を以下のコードで反映させます。
$ source ~/.bash_profile
最後にしっかりバージョンが変更できているか確認してみます。
$ php -v
PHP 8.0.12 (cli) (built: Oct 22 2021 18:35:15) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.12, Copyright (c) Zend Technologies
エックスサーバーのPHP変更の注意点
実はエックスサーバーはサーバーパネルからも使用するPHPのバージョンを変更することができます。
しかしサーバーパネルで変更できるPHPとSSH接続後に変更するPHPは別物なので注意してください。
先ほどターミナルで変更したPHPはCLI(コマンドラインインタフェース)用のPHPになります。
サーバーパネルからはCLI用のPHPは変更できませんのでこの手続きを必ず実行するようにしてください。
5.2Laravelアプリ内に残っているキャッシュを削除
PHPのバージョンを変更したのでartisan
コマンドが使えるようになっているはずです。
現段階では変更した.envファイルが反映されておらず古いデータベース情報がキャッシュとしてLaravel内に残っているのでこれを削除していきます。
以下のコードを打ち込むことでキャッシュを削除できます。
$ php artisan cache:clear
$ php artisan config:clear
これで全ての作業が完了しました。アップロードしたLaravelアプリが公開URLでアクセスできるか確認してみてください。
Laravelをアップロードする流れで起きたエラーの解決法
There is no existing directory at "" and it could not be created: Permission denied
There is no existing directory at "/Applications/MAMP/htdocs/プロジェクト名/storage/logs" and it could not be created: Permission denied
私は最初に「3.FTPでアップロード」をした後に公開URLで接続しようとして上記のようなエラーが出てきました。
エラー内容は「/Applications/MAMP/htdocs/プロジェクト名/storage/logs」に既存のディレクトリがなく、作成できませんでした:アクセスが拒否されました」といったもの。
Laravel内の「storage」>「logs」の中の「laravel.log」が認知されていないのかと思い、パーミション(アクセス権)を変更してみました。
パーミションを変更する際にいじったのは「config」>「logging.php」の以下の部分です。
'daily' => [
'driver' => 'daily',
'path' => storage_path('logs/laravel.log'),
'level' => env('LOG_LEVEL', 'debug'),
'days' => 14,
'permission' => 0664, // 追記
],
これが功を奏したのかSSHで接続後、キャッシュを削除することでこのエラーは解決しました。
PHP Parse error: syntax error, unexpected 'class'(T_CLASS), expecting identifier 〜 artisan on line 33
$ php artisan -v
PHP Parse error: syntax error, unexpected 'class' (T_CLASS), expecting identifier (T_STRING) or variable (T_VARIABLE) or '{' or '$' in /home/XXXXXX/Xxxxxxxxx/public_html/ドメイン/artisan on line 33
これは古いバージョンのPHPでartisan
コマンドを実行しようとしたために起きたエラーでした。バージョンを適切なものに変更することで無事解決できました。
Laravelアプリ公開に悩んでいる方のお役に立っていれば幸いです。また私もまだまだ初心者なので至らぬ点や間違っているところがあると教えていただけると助かります。
ご覧いただきありがとうございました。