Laravel本番環境の構築
Laravelを学ぶと簡単なサービスなら個人でも構築できるようになります。ただし、今まで個人のPCの中で行なっていた設定を本番環境に移行しなければなりません。結構面倒でつまづく人も多いと思うので、少し知識のある人ならこのページをみればできるようにまとめて行きます。
- Laravelを本番環境に実装したい
- 実装がうまくできない
- 実装に必要な周辺知識も学びたい
お名前.comでのドメイン取得
ドメインの取得は特に難しくないです。お名前.comに書かれているように進めて問題ないです。
ドメイン取得時に「エックスサーバーで利用する」を選択すると後の手続きが簡単になります。具体的にはネームサーバー の登録が必要なくなります。
今回は「エックスサーバーで利用する」を選択したとしてエックスサーバーの設定を解説します。
エックスサーバーの準備
サーバーパネルにログイン後、ドメイン➡️ドメイン設定➡️ドメインの追加、と進みお名前ドットコムで取得したドメインを入力し登録します(無料SSLやXアクセラレータは有効にします)。
ドメイン取得時に「エックスサーバーで利用する」を選択していたらこれでドメイン設定は完了です。「エックスサーバーで利用する」を選択していない場合はドメインとサーバーが紐付けられていないためネームサーバー の設定が必要です。
エックスサーバーの提供するネームサーバー は下記の通りです。
- ns1.xserver.jp
- ns2.xserver.jp
- ns3.xserver.jp
- ns4.xserver.jp
- ns5.xserver.jp
これでサーバーとドメインの紐付けが完了し、ネットからドメインにアクセスできるようになります。ただし、表示するものを設定していないのでエックスサーバーで初期設定されている画面に飛びます。
任意のページが表示されるように設定して行きましょう。
SSHの設定
SSHはSecure Shellのことでサーバーを遠隔操作する際に安全に操作するためのプロトコルです。暗号化されて情報をやり取りするため安全性が非常に高いです。
エックスサーバーにアクセスする際にもSSHを設定しましょう。
基本的には下記のエックスサーバーが提供しているマニュアルで設定できます。
https://www.xserver.ne.jp/manual/man_server_ssh.php
簡単に書くと「アカウント」➡️「SSH設定」➡️「公開鍵認証用鍵ペアの生成」➡️「生成した公開鍵登録・更新」という流れです。
「公開鍵認証用鍵ペアの生成」で作成した鍵を使ってエックスサーバーにアクセスするのですが、つまづいたので補足します。
Terminalから鍵の置き場所とパーミッションを設定します。
//ディレクトリの作成
mkdir ~/.ssh
//生成した鍵の移動
mv ~/Downloads/生成した鍵の名前 ~/.ssh/
//鍵の名前変更
mv 生成した鍵の名前 新しく設定したい名前
//パーミッションの設定
chmod 700 ~/.ssh
chmod 600 ~/.ssh/新しく設定したい名前
chmodって何?という方は下記の記事を参考にしてください。chmod 600は自分だけ読み書きができる、chmod 700は自分だけ読み書き実行ができる、という意味です。
この設定をしておけば次回から下記のコマンドでレンタルサーバーにアクセスできます。
$ ssh -l サーバーID -i 秘密鍵ファイル名 サーバーID.xsrv.jp -p 10022
パスフレーズを求められるので「公開鍵認証用鍵ペアの生成」の時に設定したパスフレーズを使いましょう。
FTPソフトの設定
FTPとはFile Transfer Protocolのことです。自分のパソコン内のファイルを簡単にレンタルサーバーに送ることができます。FileZilaが無料で使えて簡単なので今回はFileZilaの接続方法を紹介します。
ちなみに、サーバーにアクセスしてlaravel newとするやり方もあるのですが、FTPソフトから送った方が確実です。
下記のリンクからFileZilaをダウンロードできます。
https://filezilla.softonic.jp/
FileZilaを開き、左上のマークよりサイトマネージャーを開きます。サイトマネージャーの右上を入力して行きます。入力に困る項目の調べ方は次の通りです。
- ホスト:エックスサーバーの「アカウント」➡️「サーバー情報」➡️「ホスト名」
- ユーザー:エックスサーバーパネルログイン時のホーム画面に記載
- パスワード:エックスサーバーパネルログイン時のパスワード
うまく接続できると左に自分のパソコン、右にサーバーの情報が表示されるので、アップロードしたいファイルをドラッグします。Laravel関連のファイルをドラッグしたらファイルの転送完了です。時間がかかるので時間に余裕があるときに行いましょう。
サーバーにファイルを入れたのでサイトにアクセスできるようになった、と思いきやまだアクセスできません。エックスサーバーで初期設定されている画面に飛んでしまうので、index.htmlとdefault_page.pngを削除します。
これでアクセスできると思いきや、次は403のエラーが出てきます。これを解決するために.httpaccessを変更します。
.httpaccessの変更
Laravelのディレクトリの中身一式を普通にサーバーに設置した場合、アクセスするURLは”ドキュメントルートURL/public/”といったように、URLに”public”を含めなければアクセスが出来ません。これを解決するために.httpaccessに下記を追記します。
<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>
されに.envファイルも変更してFileZilaでアップロードします。
APP_NAME= //サイトの名前
APP_ENV= //productionにする
APP_KEY=キーが入っています(いじらなくて良い)
APP_DEBUG=true
APP_URL= //URLにする
これでサイトに接続できるようになっているはずです。
Databaseの設定
サイトにアクセスできるようになりましたが、まだデータベースが使えません。まずは、エックスサーバーパネルからデータベースを作成します。
「データベース」➡️「MySQL設定」➡️「MySQL追加」からデータベースを作成します。また、同じく「MySQLユーザー追加」からユーザーを追加し、MySQLにアクセスできるユーザーを「アクセス権所有ユーザ」から設定ます。
続いて、.envファイルからデータベースとサイトを紐付けます。
DB_CONNECTION=mysql
DB_HOST=MySQL設定の下の方に書かれているIPアドレス
DB_PORT=3306
DB_DATABASE=作成したデータベース名
DB_USERNAME=アクセスできるように設定したユーザー名
DB_PASSWORD=ユーザー追加時に設定したパスワード
ローカル環境で作成してFileZilaでアップロードしましょう。これでデータベースとサイトが紐付けられました。Terminalからサーバーにアクセスし、目的のディレクトリでマイグレーションしましょう。
//サーバーにアクセスするコマンド
$ ssh -l サーバーID -i 秘密鍵ファイル名 サーバーID.xsrv.jp -p 10022
//マイグレーションのコマンド
php artisan migrate
//マイグレーションができない場合はコンポーザーのインストールができてないかもしれません。
composer install
//キャッシュが残っていてうまくいかないときは下記のコマンドでキャッシュ削除
php artisan config:cache
マイグレーションが正常に行われたか「データベース」➡️「phpMyAdmin」から確認できます。
ターミナルからも下記のコマンドで確認できます。
mysql -h ホスト名 -u ユーザー名 -p パスワード
//ホスト名:DB_HOST=MySQL設定の下の方に書かれているIPアドレス
//ユーザー名:DB_USERNAME=アクセスできるように設定したユーザー名
//パスワード:DB_PASSWORD=ユーザー追加時に設定したパスワード
本番環境の場合はホスト名が必要なので注意しましょう。
SQLSTATE[42S02]: Base table or view not found:
私は上記の方法で設定したのですがエラーメッセージが出ました。どうやらテーブル名が複数形になっていなかったのが原因のようです。エックスサーバーではテーブルを全て複数形として認識します。
phpMyAdminでテーブルが作成できているのが確認できたので、なぜうまくいかないのか随分と悩みました。
解決策
解決するために下記の2つを行いました。
- マイグレイションファイルでテーブル名を複数形に修正。
- モデルにprotected $table = ‘テーブル名s’を追記。
FileZilaでアップロードして、下記のコマンドで解決しました。
php artisan migrate:fresh
メールの設定
サイトからメールを送る設定もして行きましょう。
メールの設定には「サーバーパネル」➡️「メール」➡️「メールアカウント設定」➡️対象のドメインを選択➡️「メールアカウントの追加」と進み、アドレスとパスワードを設定します。
.envファイルは下記のように記載します。
MAIL_MAILER=smtp
MAIL_HOST=POP/IMAPサーバー名(「メールアカウント設定」➡️対象のドメインを選択➡️「メールソフト設定」から確認できます。)
MAIL_PORT=587(SSLを使用する場合は465なのですが、接続がうまくいかないので587にしました。)
MAIL_USERNAME=追加したメールアカウント
MAIL_PASSWORD=メールアカウントを追加した時のパスワード
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=MAIL_USERNAMEと同じ
MAIL_FROM_NAME="${APP_NAME}"
MAIL_PORTが465にできない理由はよくわかりませんでした。また、キャッシュが残っている場合もあるので下記のコマンドを使いましょう。
php artisan config:cache
これで一通りの設定が完了です。お疲れ様でした。