エックスサーバーVPSでLaravelをデプロイする環境構築手順

「LaravelアプリをエックスサーバーVPSにデプロイしたいけど、どうやって環境構築すればいいの?」

Laravel開発者の多くが、ローカル環境では動作するアプリを本番環境にデプロイする際に悩みを抱えています。VPSサーバーの設定、Apache・PHP・MySQLの構築、デプロイ後のエラー対処など、初めての方には複雑に感じられるでしょう。

結論から言うと、エックスサーバーVPSのLaravelアプリイメージを使えば、最短30分でデプロイ環境を構築できます。 Apache、PHP 8.2、MySQL、Composerが自動インストールされるため、手動設定の手間を大幅に削減できます。

本記事では、SSH接続から環境設定、Apache設定、トラブルシューティングまで、実際のコマンドと画像付きで全手順を解説します。この記事を読めば、VPSデプロイ初心者でも確実にLaravelアプリを本番公開できるようになります。


エックスサーバーVPSでLaravelをデプロイする全体像【初心者向け完全ガイド】

Xserver VPS Laravel環境の3つの構築方法と選び方

エックスサーバーVPSでLaravel環境を構築する方法は3つあり、それぞれメリット・デメリットが異なります。

最も推奨される方法は「Laravelアプリイメージ」の利用です。 この方法では、サーバー作成時にLaravelに必要な環境(Apache、PHP 8.2、MySQL 8.0、Composer)が自動的にインストールされます。初心者でも設定ミスが少なく、わずか10分程度で基本環境が整います。

2つ目の方法は「OSイメージからの手動構築」です。Ubuntu 22.04などのOSイメージを選択し、Apache、PHP、MySQLを個別にインストールします。細かいバージョン指定や独自のカスタマイズが可能ですが、設定ファイルの編集が多く、初心者には難易度が高い方法です。所要時間は2〜3時間程度かかります。

3つ目は「Docker環境での構築」です。docker-composeでLaravel環境をコンテナ化する方法で、開発環境と本番環境を完全に一致させられるメリットがあります。ただし、Dockerの知識が必要で、メモリ使用量も多くなるため、最低4GBプラン以上が推奨されます。

構築方法難易度所要時間推奨対象
Laravelアプリイメージ 30分VPSデプロイ初心者
OSイメージから手動構築 2〜3時間カスタマイズ重視の方
Docker環境 1〜2時間Docker経験者

本記事では、最も効率的で失敗しにくい「Laravelアプリイメージ」を使った構築方法を解説します。

本記事で解説するデプロイ手順の流れ(所要時間:約60分)

本記事で解説するデプロイ手順は5つのステップに分かれており、合計約60分で完了します。

全体の流れは以下の通りです。 まずXserver VPSでサーバーを作成し(10分)、SSH接続で環境確認を行います(5分)。次にローカルのLaravelプロジェクトをアップロードし(15分)、.envファイル設定とデータベース構築を実施します(20分)。最後にApache設定を調整して本番公開します(10分)。

各手順の詳細内容は以下の通りです:

手順1: Xserver VPSサーバー作成(10分)

  • アカウント登録とプラン選択
  • Laravelアプリイメージの選択
  • SSH接続情報の受信確認

手順2: SSH接続と環境確認(5分)

  • ターミナルからSSH接続
  • PHP、Composer、MySQLバージョン確認
  • デフォルトLaravel画面の表示確認

手順3: Laravelプロジェクトアップロード(15分)

  • rsyncまたはSFTPでファイル転送
  • vendorディレクトリの除外
  • アップロード後のファイル確認

手順4: 環境設定とDB構築(20分)

  • composer installの実行
  • .envファイル編集(本番環境設定)
  • マイグレーション実行

手順5: 本番公開設定(10分)

  • Apache DocumentRoot変更
  • ディレクトリ権限設定
  • Apache再起動と動作確認

これらの手順を順番に実行することで、確実にLaravelアプリケーションをデプロイできます。各ステップで発生しやすいエラーとその対処法も後述します。


【事前準備】Xserver VPSの申し込みと最適プラン選定

Laravel運用に必要なサーバースペックと料金比較

Laravel運用には最低2GB以上のメモリプランが推奨されます。

2GBプランを推奨する理由は、Composerのメモリ消費量にあります。 Laravelプロジェクトでcomposer installを実行すると、依存パッケージのインストール時に1GB以上のメモリを使用します。1GBプラン(月額900円)では、インストール途中でメモリ不足エラーが発生する可能性が高いため、安定運用には2GBプラン(月額1,150円)以上が必要です。

エックスサーバーVPSの各プランと料金は以下の通りです:

プランメモリCPUSSD容量月額料金推奨用途
2GB2GB3コア50GB1,150円小規模Laravelアプリ
4GB4GB4コア100GB2,200円中規模アプリ・DB負荷高
8GB8GB6コア100GB4,400円大規模アプリ・高トラフィック

開発環境とし使用する場合は2GBプランで十分ですが、本番環境で月間10万PV以上のアクセスが見込まれる場合は4GBプラン以上を選択しましょう。データベースのレコード数が100万件を超える場合や、画像処理などメモリを多く使う処理がある場合も4GB以上が安全です。

料金は12ヶ月契約で約10%、24ヶ月契約で約15%割引されるため、長期運用が決まっている場合は年間契約がお得です。初期費用は無料で、契約期間中のプラン変更も可能です。

Xserver VPS申し込み手順

エックスサーバーVPSの申し込みは5分程度で完了します。

申し込みの流れは以下の通りです。 まずXserver VPS公式サイトにアクセスし、「今すぐお申し込み」ボタンをクリックします。Xserverアカウントを持っていない場合は「すぐにスタート!新規お申込み」を選択してアカウント登録を行います。

サーバー新規申し込み画面では、以下の項目を設定します:

  1. サーバー名: 任意の名前(例:laravel-production)
  2. プラン: 2GB以上を選択
  3. サーバーの契約期間: 1ヶ月〜24ヶ月(12ヶ月以上で割引適用)
  4. イメージタイプ: 「アプリケーション」を選択
  5. アプリケーション: 「Laravel」を選択(重要)
  6. rootパスワード: 強固なパスワードを設定

Laravelイメージ選択時の注意点として、必ず「アプリケーション」→「Laravel」を選んでください。 「OS」タブからUbuntuなどを選ぶと手動構築が必要になり、作業時間が大幅に増加します。

申し込み内容を確認し、支払い方法(クレジットカードまたは翌月後払い)を選択して申し込みを確定します。サーバー作成には5〜10分程度かかり、完了すると登録メールアドレスに「サーバー設定完了のお知らせ」が届きます。

このメールにはSSH接続に必要な情報(IPアドレス、rootパスワード、MySQL接続情報)が記載されているため、必ず保存しておきましょう。

SSH接続情報の確認とローカル環境の準備

SSH接続情報は、サーバー作成完了メールとVPSパネルで確認できます。

SSH接続に必要な情報は3つです。 サーバーのIPアドレス、ユーザー名(初期はroot)、rootパスワードです。これらの情報は「サーバー設定完了のお知らせ」メールに記載されています。VPSパネル(https://vps.xserver.ne.jp/)からも、契約サーバーの「接続情報」タブで確認可能です。

ローカル環境で準備すべきツールは以下の通りです:

Windowsの場合:

  • PowerShellまたはコマンドプロンプト(SSH接続用、Windows 10以降は標準搭載)
  • WinSCP、FileZilla、Cyberduckのいずれか(SFTP接続用)

Mac/Linuxの場合:

  • ターミナル(標準搭載、SSH接続用)
  • Cyberduck、FileZillaのいずれか(SFTP接続用)

SSH接続テストとして、以下のコマンドを実行してみましょう:

ssh root@[サーバーIPアドレス]

初回接続時は「The authenticity of host can’t be established」という警告が表示されますが、「yes」と入力して続行します。rootパスワードを入力すると、VPSサーバーにログインできます。

接続できない場合は、IPアドレスの入力ミス、rootパスワードの誤り、ファイアウォール設定などを確認してください。VPSパネルの「コンソール」機能を使えば、ブラウザ経由でもサーバーにアクセスできます。


【手順1】Laravelアプリイメージでサーバー環境を自動構築

Xserver VPS管理画面からLaravelイメージを選択

Laravelアプリイメージを選択すると、必要な環境が自動構築されます。

イメージ選択画面では、必ず「アプリケーション」タブを選んでください。 サーバー新規申し込み画面の「イメージタイプ」で「アプリケーション」を選択すると、インストール可能なアプリケーション一覧が表示されます。その中から「Laravel」を選択します。

選択時のポイントは以下の3つです:

  1. イメージバージョンの確認: Laravel 11.30.0(執筆時点の最新版)が選択されていることを確認します
  2. プラン選択: メモリ2GB以上のプランを選択(1GBではComposerがエラーになる可能性)
  3. サーバー名の設定: 後で識別しやすい名前(例:laravel-prod-001)を付けます

間違えてOSイメージ(Ubuntu、CentOSなど)を選ばないよう注意してください。 OSイメージを選ぶと、Apache、PHP、MySQLなどを全て手動でインストールする必要があり、設定に2〜3時間かかります。

申し込み完了後、サーバーの自動構築が開始されます。構築状況はVPSパネルの「ステータス」欄で確認でき、「稼働中」と表示されたら構築完了です。通常5〜10分程度で完了します。

自動インストールされる環境の詳細

Laravelアプリイメージでは、以下の環境が自動的にインストールされます。

インストールされるソフトウェアとバージョンは以下の通りです:

ソフトウェアバージョン用途
Apache2.4.xWebサーバー
PHP8.2.xLaravelの実行環境
MySQL8.0.xデータベースサーバー
Composer2.xPHP依存関係管理ツール
Laravel11.30.0デフォルトプロジェクト

これらのバージョンはLaravel 11の推奨環境を満たしており、そのまま本番運用できる設定になっています。PHP 8.2には最新のセキュリティパッチが適用され、パフォーマンスも従来バージョンより約20%向上しています。

MySQL 8.0は、JSONデータ型のサポートや改善されたクエリ最適化により、Laravel Eloquent ORMとの親和性が高くなっています。デフォルトでは「laravel_database」という名前のデータベースが作成され、専用のMySQLユーザーも自動生成されます。

Composerは最新の2.x系が導入されており、パッケージインストールの高速化とメモリ使用量の最適化が図られています。/var/www/html/配下にはサンプルのLaravelプロジェクトが配置され、すぐに動作確認が可能です。

これらの環境はsudo systemctl status apache2sudo systemctl status mysqlコマンドで起動状態を確認できます。

サーバー作成完了後の確認事項

サーバー作成完了後、SSH接続情報メールの内容を確認します。

メールには以下の重要情報が記載されています:

  1. サーバーIPアドレス: SSH接続とブラウザアクセスに使用
  2. rootパスワード: 申し込み時に設定したパスワード
  3. MySQL接続情報: データベース名、ユーザー名、パスワード
  4. 初期Laravel URL: http://[IPアドレス] でアクセス可能

まず、ブラウザでhttp://[サーバーIPアドレス]にアクセスして、Laravelのウェルカム画面が表示されることを確認しましょう。この画面が表示されれば、Apache、PHP、Laravelが正常に動作しています。

初回ログインまでの待機時間は通常5〜10分です。 サーバーステータスが「稼働中」になっていても、内部でApacheやMySQLの初期化処理が続いている場合があります。ブラウザアクセスで「接続できません」と表示される場合は、3〜5分待ってから再度アクセスしてください。

SSH接続も確認しておきましょう:

ssh root@[サーバーIPアドレス]

接続できたら、以下のコマンドで環境を確認します:

php -v  # PHP 8.2.xが表示されるはず
composer --version  # Composer 2.xが表示されるはず
mysql --version  # MySQL 8.0.xが表示されるはず

これらが正常に表示されれば、環境構築は完了しています。


【手順2】SSH接続とインストール環境の確認方法

ターミナルからXserver VPSにSSH接続

SSH接続は、VPSサーバーをコマンドラインで操作するための必須手順です。

基本的なSSH接続コマンドは以下の通りです:

ssh root@[サーバーIPアドレス]

例えば、サーバーIPアドレスが203.0.113.45の場合、以下のように実行します:

ssh root@203.0.113.45

Windowsでの接続方法(PowerShell/コマンドプロンプト):

  1. PowerShellまたはコマンドプロンプトを起動
  2. 上記のsshコマンドを実行
  3. 初回接続時「Are you sure you want to continue connecting?」と表示されたらyesと入力
  4. rootパスワードを入力(入力中は画面に表示されません)

Mac/Linuxでの接続方法:

  1. ターミナルアプリを起動
  2. 同様にsshコマンドを実行
  3. 認証確認でyes、パスワード入力

初回接続時の認証確認メッセージは、サーバーのフィンガープリント(識別情報)を初めて記録する際に表示されます。「yes」と入力すると、そのサーバー情報がローカルの~/.ssh/known_hostsファイルに保存され、次回以降は表示されなくなります。

接続に成功すると、プロンプトがroot@[サーバー名]:~#のように変わり、VPSサーバー内でコマンドを実行できる状態になります。接続を終了する場合はexitコマンドを実行します。

PHP・Composer・MySQLバージョンの確認コマンド

環境が正しくインストールされているか、バージョン確認コマンドで検証します。

各ソフトウェアのバージョン確認コマンドは以下の通りです:

php -v

このコマンドを実行すると、以下のような出力が表示されます:

PHP 8.2.15 (cli) (built: Jan 16 2025 10:22:31) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.15, Copyright (c) Zend Technologies

PHP 8.2.x系が表示されていればOKです。8.1以下や8.3以上の場合、Laravel 11との互換性問題が発生する可能性があります。

Composerのバージョン確認:

composer --version

出力例:

Composer version 2.6.6 2024-01-05 10:35:16

Composer 2.x系であることを確認します。1.x系の場合、composer self-updateで最新版にアップデートしてください。

MySQLのバージョン確認:

mysql --version

出力例:

mysql  Ver 8.0.35 for Linux on x86_64 (MySQL Community Server - GPL)

MySQL 8.0.x系が表示されればOKです。MySQLが起動しているかも確認しましょう:

sudo systemctl status mysql

「active (running)」と表示されていれば正常に稼働しています。これらのコマンドで全てのバージョンが確認できれば、環境構築は成功しています。

デフォルトLaravel環境の動作確認

自動構築されたデフォルトLaravel環境が正常に動作するか確認します。

ディレクトリ構成の確認は以下のコマンドで行います:

cd /var/www/html/
ls -la

/var/www/html/配下に、Laravelプロジェクトのディレクトリ(通常laravelという名前)が存在することを確認します。このディレクトリ内には、appconfigdatabasepublicなどのLaravelの標準ディレクトリが配置されています。

プロジェクトディレクトリに移動して内容を確認します:

cd /var/www/html/laravel
ls -la

artisanファイル、composer.json.envファイルなどが存在することを確認してください。

ブラウザでの初期画面表示確認:

ブラウザでhttp://[サーバーIPアドレス]にアクセスします。Laravelのウェルカム画面(「Laravel」という大きなロゴと「Documentation」「Laracasts」などのリンク)が表示されれば、Apache、PHP、Laravelが正常に連携しています。

表示されない場合は、以下を確認します:

sudo systemctl status apache2  # Apacheの起動状態確認
tail -n 50 /var/log/apache2/error.log  # エラーログ確認

Apacheが停止している場合はsudo systemctl start apache2で起動します。これでデフォルト環境の動作確認は完了です。


【手順3】ローカルのLaravelプロジェクトをVPSにアップロード

アップロード前のローカル環境準備

ローカルのLaravelプロジェクトをアップロードする前に、不要なファイルを除外します。

必ず除外すべきファイルとディレクトリは以下の2つです:

  1. .envファイル: ローカル環境の設定が含まれており、本番環境では使用できません。データベース接続情報やAPP_KEYなどはサーバー側で再設定します。
  2. vendorディレクトリ: Composerでインストールされた依存パッケージで、サイズが100MB以上になることもあります。サーバー側でcomposer installを実行するため、アップロード不要です。

これらを除外する理由は、転送時間の短縮とセキュリティ保護のためです。.envをアップロードすると、本番環境で誤った設定が適用されたり、機密情報が漏洩するリスクがあります。vendorは環境依存ファイルも含まれるため、サーバー側で再生成するのが安全です。

アップロード前のチェックリスト:

  • [ ] .envファイルが除外対象に含まれているか
  • [ ] vendorディレクトリが除外対象に含まれているか
  • [ ] storage/logs内の不要なログファイルを削除したか
  • [ ] node_modulesディレクトリ(フロントエンド開発で使用した場合)も除外するか
  • [ ] .gitディレクトリを含めるか除外するか決定したか

通常、本番環境では.gitディレクトリも不要なため除外します。Gitでバージョン管理する場合は、サーバー側でgit cloneする方法もあります。

rsyncコマンドによる効率的なファイル転送

rsyncは差分転送機能を持つ高速なファイル転送ツールです。

基本的なrsyncコマンドは以下の通りです:

rsync -avz --exclude='vendor' --exclude='.env' --exclude='node_modules' \
--exclude='.git' ./your-laravel-project/ root@[IPアドレス]:/var/www/html/your-project/

各オプションの意味:

  • -a: アーカイブモード(パーミッションやタイムスタンプを保持)
  • -v: 詳細表示(転送状況を表示)
  • -z: 圧縮転送(ネットワーク帯域を節約)
  • --exclude: 指定したファイル/ディレクトリを除外

実際の使用例:

ローカルのプロジェクトパスが~/Projects/my-laravel-app、サーバーIPが203.0.113.45の場合:

cd ~/Projects
rsync -avz --exclude='vendor' --exclude='.env' \
./my-laravel-app/ root@203.0.113.45:/var/www/html/my-laravel-app/

実行するとパスワード入力を求められ、認証後に転送が開始されます。転送中は各ファイル名と進捗が表示されます。

転送速度を上げるテクニック:

  1. SSH圧縮を有効化: -e "ssh -C"オプションを追加
  2. 同時接続数を増やす: 大量の小ファイルがある場合は-e "ssh -o Compression=no"で圧縮無効化(既に-zで圧縮されているため)
  3. 2回目以降は差分のみ転送: rsyncは変更されたファイルのみを転送するため、2回目以降は高速

rsyncは中断しても途中から再開できるため、大容量プロジェクトでも安心です。

SFTPクライアント(Cyberduck)を使ったアップロード方法

GUIツールのCyberduckを使えば、ドラッグ&ドロップで簡単にアップロードできます。

Cyberduckの設定手順は以下の通りです:

  1. Cyberduck公式サイト(https://cyberduck.io/)からダウンロード・インストール
  2. Cyberduckを起動し、「新規接続」をクリック
  3. 接続設定を入力:
    • プロトコル: SFTP (SSH File Transfer Protocol)
    • サーバー: [サーバーIPアドレス]
    • ポート: 22
    • ユーザー名: root
    • パスワード: rootパスワード
  4. 「接続」をクリック

接続に成功すると、サーバーのディレクトリ一覧が表示されます。/var/www/html/に移動し、ローカルのLaravelプロジェクトフォルダをドラッグ&ドロップでアップロードします。

FileZilla、WinSCPでの代替方法:

  • FileZilla: 設定項目はCyberduckとほぼ同じ。ファイル→サイトマネージャから接続情報を保存可能
  • WinSCP: Windows専用。左側がローカル、右側がサーバーの2画面表示で直感的

大容量ファイル転送時の注意点:

  • storage/app内に大量の画像ファイルがある場合、転送に30分以上かかることも
  • 転送中にPCをスリープさせると接続が切れる可能性があるため、電源設定を確認
  • .envvendorを手動で除外し忘れないよう注意(一部SFTPクライアントには除外機能なし)

SFTPクライアントは視覚的に操作できるため、初心者にはrsyncより使いやすい方法です。

アップロード後のディレクトリ構造確認

アップロードが完了したら、サーバー上で正しくファイルが配置されているか確認します。

SSH接続してディレクトリ構造を確認します:

cd /var/www/html/your-project/
ls -la

以下のディレクトリとファイルが存在することを確認してください:

app/
bootstrap/
config/
database/
public/
resources/
routes/
storage/
tests/
artisan
composer.json
composer.lock
package.json (フロントエンド開発している場合)

特に重要な確認ポイント:

  1. vendorディレクトリが存在しない: 正しく除外されています(後ほどcomposer installで作成)
  2. .envファイルが存在しない: 正しく除外されています(後ほどサーバー側で作成)
  3. storageディレクトリが存在する: Laravelの動作に必須
  4. publicディレクトリが存在する: Webサーバーのドキュメントルートになります

ファイル数を確認するコマンド:

find . -type f | wc -l

通常のLaravelプロジェクトで200〜500ファイル程度です。極端に少ない場合、アップロードが不完全な可能性があります。

ディレクトリサイズを確認:

du -sh

vendornode_modulesを除外した状態で、通常10〜30MB程度です。これでアップロードの確認は完了です。


【手順4】Composer依存関係のインストールと環境設定

composer installの実行と最適化オプション

サーバー上でComposer依存パッケージをインストールします。

実行するコマンドは以下の通りです:

cd /var/www/html/your-project
composer install --optimize-autoloader --no-dev

このコマンドは、composer.jsoncomposer.lockに記載された全依存パッケージをインストールし、vendorディレクトリを作成します。

各オプションの効果:

  • --optimize-autoloader: クラスマップを最適化し、オートロード処理を高速化。本番環境では約20〜30%のパフォーマンス向上
  • --no-dev: 開発環境専用パッケージ(PHPUnit、Debugbarなど)をインストールしない。ディスクサイズとセキュリティリスクを削減

インストールには通常3〜5分かかります。進捗状況が表示され、各パッケージのダウンロードとインストールが順次実行されます。

メモリ不足エラーの対処法:

1GBプランでは、以下のエラーが発生する可能性があります:

Fatal error: Allowed memory size of 536870912 bytes exhausted

この場合、一時的にPHPのメモリ制限を引き上げます:

php -d memory_limit=2G /usr/local/bin/composer install --optimize-autoloader --no-dev

根本的な解決策は、2GB以上のプランにアップグレードすることです。VPSパネルから簡単にプラン変更できます。

インストール完了後、vendorディレクトリが作成され、数千のファイルが配置されていることを確認してください:

ls -la vendor/

.envファイルの本番環境向け設定

本番環境用の.envファイルを作成し、重要な設定を行います。

.envファイルの作成手順:

まず、.env.exampleをコピーして.envを作成します:

cp .env.example .env
nano .env

nanoエディタで.envファイルが開きます(viやvimが使える方はそちらでも可)。

必ず設定すべき項目:

  1. APP_ENV=production
    • ローカル環境のdevelopmentから変更
    • 本番環境モードで動作し、詳細なエラー表示を抑制
  2. APP_DEBUG=false
    • trueのままだと、エラー時にスタックトレースやデータベース情報が表示され、セキュリティリスクに
    • 本番環境では必ずfalseに設定
  3. APP_URL=http://[ドメインまたはIPアドレス]
    • 独自ドメインを設定している場合はhttps://example.comのように記述
    • IPアドレスの場合はhttp://203.0.113.45
  4. APP_KEYは後述のコマンドで自動生成するため、ここでは空のままで構いません

その他の設定項目:

LOG_CHANNEL=daily  # ログを日別ファイルに分割(推奨)
LOG_LEVEL=error  # 本番環境ではerrorレベル以上のみ記録
SESSION_DRIVER=file  # セッション保存方法(小規模アプリはfileで可)
CACHE_DRIVER=file  # キャッシュ保存方法(大規模ならredis推奨)

nanoエディタでの保存方法:

  • Ctrl + O(保存)
  • Enter(ファイル名確認)
  • Ctrl + X(終了)

MySQL接続情報の確認と設定方法

MySQLのデータベース接続情報を.envに設定します。

SSH画面に表示されたDB情報は、以下のコマンドで再確認できます:

cat /root/.my.cnf

または、サーバー設定完了メールに記載された情報を使用します。通常、以下のような情報が表示されます:

[client]
user=laravel_user
password=ランダム生成されたパスワード
database=laravel_database

.envファイルのDB設定を編集します:

nano .env

以下の項目を設定:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_database  # 上記で確認したデータベース名
DB_USERNAME=laravel_user  # 上記で確認したユーザー名
DB_PASSWORD=確認したパスワード

DB_HOSTは必ず127.0.0.1またはlocalhostに設定してください。 外部からのMySQL接続はセキュリティリスクがあるため、同一サーバー内からのみアクセスできるように設定します。

設定が正しいか、MySQLに接続テストを行います:

mysql -u laravel_user -p

パスワード入力後、MySQLプロンプト(mysql>)が表示されれば接続成功です。exitで抜けてください。

接続できない場合は、ユーザー名・パスワード・データベース名を再確認し、MySQLが起動しているか確認します:

sudo systemctl status mysql

アプリケーションキーの生成

Laravelのセキュリティに必須のAPP_KEYを生成します。

APP_KEYは暗号化・セッション管理・CSRF保護に使用される重要な鍵です。 この鍵がないとLaravelは正常に動作せず、セキュリティリスクも高まります。

生成コマンドは以下の通り:

php artisan key:generate

実行すると、以下のように表示されます:

Application key set successfully.

このコマンドは、.envファイルのAPP_KEY項目に自動的に32文字のランダムな鍵を設定します。確認してみましょう:

grep APP_KEY .env

以下のような文字列が表示されます:

APP_KEY=base64:ランダムな64文字の文字列

重要な注意点:

  1. APP_KEYは絶対に公開しない: Gitリポジトリにコミットしない、他人と共有しない
  2. 一度設定したら変更しない: 変更すると既存の暗号化データやセッションが無効になる
  3. 本番環境と開発環境で異なる鍵を使用: セキュリティ強化のため

万が一APP_KEYが漏洩した場合は、全ユーザーにログアウトしてもらい、新しい鍵を再生成する必要があります。

データベースマイグレーションの実行

Laravelのマイグレーション機能でデータベーステーブルを作成します。

マイグレーション実行コマンド:

php artisan migrate

このコマンドは、database/migrationsディレクトリ内の全マイグレーションファイルを実行し、テーブル構造をデータベースに反映します。実行すると以下のような出力が表示されます:

Migration table created successfully.
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (45.23ms)
Migrating: 2019_12_14_000001_create_personal_access_tokens_table
Migrated:  2019_12_14_000001_create_personal_access_tokens_table (67.45ms)
...

全てのマイグレーションが「Migrated」と表示されれば成功です。

マイグレーションエラー時の対処:

よくあるエラー1:

SQLSTATE[HY000] [2002] Connection refused

→ MySQLが起動していない、または.envのDB設定が誤っている

sudo systemctl start mysql

よくあるエラー2:

SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long

→ MySQL 5.7以前で発生。app/Providers/AppServiceProvider.phpに以下を追加:

use Illuminate\Support\Facades\Schema;

public function boot()
{
    Schema::defaultStringLength(191);
}

シーダー実行(必要に応じて):

テストデータを投入する場合:

php artisan db:seed

本番環境では通常実行しませんが、マスタデータがある場合は実行します。これでデータベース構築は完了です。


【手順5】Apache設定とストレージ権限の調整

DocumentRootをLaravel publicディレクトリに変更

ApacheのDocumentRootをLaravelのpublicディレクトリに変更します。

設定変更が必要な理由は、Laravelのセキュリティ構造にあります。 LaravelはpublicディレクトリのみをWeb公開し、アプリケーションコード(appconfigなど)は公開ディレクトリより上位に配置することで、直接アクセスを防いでいます。

Apache設定ファイルを編集します:

sudo nano /etc/apache2/sites-available/000-default.conf

設定ファイル内のDocumentRoot行を以下のように変更:

# 変更前
DocumentRoot /var/www/html

# 変更後
DocumentRoot /var/www/html/your-project/public

また、同じファイル内で<Directory>ディレクティブも追加・変更します:

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html/your-project/public

    <Directory /var/www/html/your-project/public>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

重要な設定項目:

  • AllowOverride All: .htaccessファイルの設定を有効化(Laravelのルーティングに必須)
  • Require all granted: 全てのアクセスを許可

保存して終了(Ctrl + OEnterCtrl + X)。

独自ドメインを設定する場合:

ServerNameを追加します:

ServerName example.com
ServerAlias www.example.com

設定ファイルの構文エラーチェック:

sudo apachectl configtest

「Syntax OK」と表示されれば正常です。

.htaccessとmod_rewriteの有効化確認

Laravelのルーティング機能に必須のmod_rewriteモジュールを有効化します。

mod_rewriteはURLの書き換えを行うApacheモジュールで、Laravelの全てのリクエストをindex.phpにルーティングするために使用されます。 このモジュールが無効だと、トップページ以外のURLで404エラーが発生します。

有効化コマンド:

sudo a2enmod rewrite

実行すると以下のように表示されます:

Enabling module rewrite.
To activate the new configuration, you need to run:
  systemctl reload apache2

既に有効な場合は「Module rewrite already enabled」と表示されます。

.htaccessファイルの確認:

Laravelのpublicディレクトリには、デフォルトで.htaccessファイルが配置されています:

cat /var/www/html/your-project/public/.htaccess

以下のような内容が表示されればOKです:

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

このファイルが存在しない場合、Laravelプロジェクトのアップロードが不完全な可能性があります。ローカル環境から再度アップロードしてください。

mod_rewriteが正しく動作しているか確認:

apache2ctl -M | grep rewrite

「rewrite_module」と表示されれば有効化されています。

storage・bootstrap/cacheディレクトリの権限設定

Laravelがログやキャッシュを書き込めるよう、ディレクトリ権限を設定します。

権限設定が必要な理由は、Apacheの実行ユーザー(www-data)が書き込み可能にする必要があるためです。 権限が不足していると、「Permission denied」エラーが発生し、Laravelが正常に動作しません。

権限設定コマンド:

chmod -R 755 storage bootstrap/cache
chown -R www-data:www-data storage bootstrap/cache

各コマンドの意味:

  • chmod -R 755: ディレクトリとファイルに読み書き実行権限を設定(オーナー:rwx、グループ:r-x、その他:r-x)
  • chown -R www-data:www-data: 所有者をApache実行ユーザーに変更

権限エラーが起きる理由:

ファイルをアップロードしたユーザー(root)が所有者のままだと、Apacheユーザー(www-data)は読み取り専用になります。Laravelはログファイル作成やキャッシュ書き込みで書き込み権限が必要なため、所有者変更が必須です。

755と775の違い:

  • 755: グループに書き込み権限なし(推奨)
  • 775: グループにも書き込み権限あり(セキュリティリスクやや高)

本番環境では755が推奨されます。開発環境で複数ユーザーが編集する場合のみ775を使用します。

権限設定の確認:

ls -la storage/
ls -la bootstrap/cache/

所有者がwww-data www-dataになっていればOKです。

Apache再起動とエラーログ確認

設定変更を反映するためApacheを再起動します。

再起動コマンド:

sudo systemctl restart apache2

再起動には通常2〜3秒かかります。エラーなく完了すれば設定が反映されています。

起動状態の確認:

sudo systemctl status apache2

正常に起動している場合、以下のように表示されます:

● apache2.service - The Apache HTTP Server
   Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2025-01-23 10:15:32 JST; 5s ago

「active (running)」が表示されていれば成功です。

エラーログ確認方法:

Apacheが起動しない場合や、設定エラーがある場合、エラーログを確認します:

sudo tail -n 50 /var/log/apache2/error.log

よくあるエラー:

  1. DocumentRoot doesn’t exist → パスの入力ミス。設定ファイルを再確認
  2. Invalid command ‘RewriteEngine’ → mod_rewriteが無効。sudo a2enmod rewriteを実行
  3. Syntax error on line XX → 設定ファイルの文法エラー。sudo apachectl configtestで確認

Apacheログは問題解決の重要な情報源なので、エラー発生時は必ず確認してください。リアルタイムでログを監視する場合:

sudo tail -f /var/log/apache2/error.log

Ctrl + Cで監視を終了します。


【動作確認】ブラウザでLaravelアプリケーションにアクセス

IPアドレスまたは独自ドメインでのアクセス方法

設定完了後、ブラウザからLaravelアプリにアクセスします。

IPアドレスでのアクセス方法:

ブラウザのアドレスバーに以下を入力:

http://[サーバーIPアドレス]

例: サーバーIPが203.0.113.45の場合

http://203.0.113.45

エックスサーバーVPSでは、サーバー作成時に割り当てられた固定IPアドレスが使用できます。IPアドレスはVPSパネルまたは設定完了メールで確認できます。

独自ドメイン設定済みの場合:

ドメインのDNS設定でAレコードをサーバーIPに向けている場合、以下のようにアクセス:

http://example.com

DNS反映には最大24〜48時間かかることがありますが、通常は数時間で完了します。反映状態を確認するコマンド:

nslookup example.com

サーバーIPアドレスが表示されればDNS反映完了です。

HTTPSでアクセスする場合:

SSL証明書を設定済みなら:

https://example.com

未設定の場合、ブラウザで「この接続ではプライバシーが保護されません」と警告が表示されます。Let’s EncryptでSSL証明書を無料取得できます(後述のセキュリティ対策で解説)。

アクセスできない場合は、ファイアウォール設定、Apache起動状態、DocumentRoot設定を再確認してください。

正常に表示される画面

アクセスが成功すると、以下のいずれかの画面が表示されます。

1. Laravelウェルカム画面(デフォルトプロジェクトの場合):

中央に大きく「Laravel」ロゴが表示され、右上に「Documentation」「Laracasts」などのリンクが並んだシンプルなページです。背景は白またはグラデーションで、モダンなデザインです。

この画面が表示されれば、以下が正常に動作している証拠です:

  • Apache Webサーバー
  • PHP 8.2実行環境
  • Laravelフレームワーク
  • mod_rewrite(URLルーティング)

2. 自作アプリケーションのトップページ:

独自に開発したLaravelアプリをデプロイした場合、設定したルート(routes/web.phpRoute::get('/', ...))に対応するビューが表示されます。

ログイン画面、ダッシュボード、ランディングページなど、プロジェクトによって異なります。

正常動作の確認ポイント:

  • CSSが適用されている(public/cssのスタイルシートが読み込まれている)
  • 画像が表示される(public/imagesのファイルにアクセスできている)
  • リンクが機能する(クリックして他のページに遷移できる)

データベース連携機能(ユーザー登録、記事一覧など)も動作するか確認しましょう。エラーが出る場合は、.envのDB設定やマイグレーション実行状況を再確認してください。

404・500エラーが出た場合の初期診断

エラーが表示される場合、原因を特定して対処します。

404 Not Foundエラー:

トップページ以外のURL(例: /about/users)にアクセスすると404エラーが出る場合、mod_rewriteまたは.htaccessの問題です。

対処法:

  1. mod_rewriteが有効か確認:
apache2ctl -M | grep rewrite
  1. Apache設定でAllowOverride Allになっているか確認:
grep -r "AllowOverride" /etc/apache2/sites-available/
  1. .htaccessファイルが存在するか確認:
ls -la /var/www/html/your-project/public/.htaccess

500 Internal Server Errorエラー:

以下のいずれかが原因です:

原因1: storageディレクトリ権限不足

sudo chown -R www-data:www-data storage bootstrap/cache
sudo chmod -R 755 storage bootstrap/cache

原因2: .envファイルのAPP_KEY未設定

php artisan key:generate

原因3: Composerパッケージ不足

composer install --optimize-autoloader --no-dev

Laravelログファイルの確認:

詳細なエラー情報はLaravelのログに記録されています:

tail -n 100 /var/www/html/your-project/storage/logs/laravel.log

エラースタックトレースから原因を特定できます。.envAPP_DEBUG=trueに一時的に変更すると、ブラウザにも詳細エラーが表示されますが、本番環境では必ずfalseに戻してください(セキュリティリスク)。


【トラブルシューティング】よくあるエラーと解決方法

500 Internal Server Error

500エラーは、サーバー内部で問題が発生していることを示します。

最も多い3つの原因と対処法を解説します。

原因1: storageディレクトリ権限不足

Laravelはログファイルやセッションデータをstorageディレクトリに書き込みますが、Apacheユーザー(www-data)に書き込み権限がないと500エラーになります。

対処法:

cd /var/www/html/your-project
sudo chown -R www-data:www-data storage bootstrap/cache
sudo chmod -R 755 storage bootstrap/cache

確認方法:

ls -la storage/

所有者がwww-data www-dataになっていればOKです。

原因2: .envファイルのAPP_KEY未設定

APP_KEYが空または不正な場合、Laravelの暗号化機能が動作せず500エラーになります。

対処法:

php artisan key:generate

確認方法:

grep APP_KEY .env

APP_KEY=base64:...のように値が設定されていればOKです。

原因3: Composerパッケージ不足

vendorディレクトリが存在しない、または不完全な場合、クラスのオートロードに失敗します。

対処法:

composer install --optimize-autoloader --no-dev

ログファイル確認方法:

詳細なエラー情報は以下で確認:

tail -n 50 storage/logs/laravel.log
tail -n 50 /var/log/apache2/error.log

エラーメッセージから具体的な原因を特定し、該当箇所を修正します。

データベース接続エラー

データベースに接続できない場合、以下のエラーが表示されます。

典型的なエラーメッセージ:

SQLSTATE[HY000] [2002] Connection refused

このエラーは、LaravelがMySQLサーバーに接続できないことを示しています。

原因と対処法:

1. MySQL起動状態の確認

MySQLが停止している可能性があります:

sudo systemctl status mysql

停止している場合:

sudo systemctl start mysql
sudo systemctl enable mysql  # 自動起動を有効化

2. .env内DB_HOST設定ミス

.envファイルのDB_HOST設定を確認:

grep DB_HOST .env

以下のいずれかに設定されているべきです:

DB_HOST=127.0.0.1
# または
DB_HOST=localhost

間違った例:

DB_HOST=mysql  # Docker環境の設定(VPSでは使えない)
DB_HOST=外部IPアドレス  # セキュリティリスク

3. データベース認証情報の確認

.envの設定が正しいか、MySQLに直接接続してテスト:

mysql -u laravel_user -p

パスワードを入力して接続できれば、認証情報は正しいです。接続できない場合、ユーザー名・パスワードが間違っています。

正しい情報は以下で確認:

cat /root/.my.cnf

4. ファイアウォール設定

外部からMySQL接続を試みている場合(非推奨)、ファイアウォールで3306ポートがブロックされている可能性があります。

本番環境では、セキュリティのため外部からのMySQL接続は禁止し、必ず127.0.0.1経由でアクセスしてください。

Composer install時のメモリ不足エラー

Composerでパッケージインストール中にメモリ不足エラーが発生することがあります。

エラーメッセージ例:

Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to allocate 20480 bytes)

これは、PHP実行時のメモリ制限(デフォルト512MB)を超えたことを示します。

対処法1: php.iniのmemory_limit変更

PHP設定ファイルを編集してメモリ制限を引き上げます:

sudo nano /etc/php/8.2/cli/php.ini

以下の行を探して変更:

memory_limit = 512M
↓
memory_limit = 2G

保存後、再度composer installを実行。

対処法2: コマンド実行時に一時的にメモリ制限を変更

php.iniを変更せず、一回限りでメモリを増やす方法:

php -d memory_limit=2G /usr/local/bin/composer install --optimize-autoloader --no-dev

このコマンドは、その実行のみメモリ制限を2GBにします。

対処法3: スワップ領域の追加

1GBプランなど物理メモリが少ない場合、スワップ領域を追加:

sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

永続化(再起動後も有効):

echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

スワップ確認:

free -h

根本的な解決策:

メモリ不足が頻繁に発生する場合、2GB以上のプランにアップグレードすることを推奨します。VPSパネルから簡単にプラン変更でき、データは保持されます。

Apache・PHPバージョン不一致エラー

ApacheとPHPモジュールのバージョンが一致していない場合、エラーが発生します。

症状:

  • ブラウザで真っ白なページが表示される
  • PHPファイルがそのままダウンロードされる
  • Apacheエラーログに「PHP module not loaded」と表示

対処法:

Laravel 11に必要なPHP 8.2モジュールをインストール:

sudo apt update
sudo apt install php8.2 libapache2-mod-php8.2

Apache用のPHP 8.2モジュールを有効化:

sudo a2enmod php8.2

古いPHPバージョンが有効な場合は無効化:

sudo a2dismod php7.4  # PHP 7.4が有効な場合
sudo a2dismod php8.1  # PHP 8.1が有効な場合

Apache再起動:

sudo systemctl restart apache2

有効なPHPモジュールの確認:

apache2ctl -M | grep php

「php8_module」または「php_module (8.2.x)」と表示されればOKです。

PHPバージョンの複数管理:

複数のPHPバージョンを切り替える必要がある場合:

sudo update-alternatives --config php

リストから使用するバージョンを選択します。

CLI(コマンドライン)とApache(Web)で異なるPHPバージョンが使われている場合もあるため、両方確認してください:

  • CLI版: php -v
  • Apache版: <?php phpinfo(); ?>を含むファイルをブラウザで開く

ログファイルでエラー原因を特定する方法

ログファイルは問題解決の最も重要な情報源です。

主要なログファイル2つの確認方法を解説します。

1. Apacheエラーログ:

Apacheレベルのエラー(404、500、設定ミス、PHPエラー)を記録:

tail -f /var/log/apache2/error.log

リアルタイム監視(新しいエラーが即座に表示される)になります。Ctrl + Cで終了。

過去100行を表示:

tail -n 100 /var/log/apache2/error.log

2. Laravelアプリケーションログ:

Laravel内部のエラー(例外、データベースエラー、カスタムログ)を記録:

tail -f storage/logs/laravel.log

日付ごとにファイルが分かれている場合:

ls -la storage/logs/
tail -f storage/logs/laravel-2025-01-23.log

ログの読み方:

エラーログには通常、以下の情報が含まれます:

  1. タイムスタンプ: エラー発生日時
  2. エラーレベル: ERROR、WARNING、NOTICEなど
  3. エラーメッセージ: 具体的な問題内容
  4. スタックトレース: エラーが発生したファイルと行番号

例:

[2025-01-23 10:30:45] production.ERROR: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'laravel_database.users' doesn't exist

このエラーは「usersテーブルが存在しない」ことを示しており、マイグレーション未実行が原因と分かります。

ログファイルサイズの管理:

ログファイルが大きくなりすぎた場合、古いログを削除:

sudo rm /var/log/apache2/error.log.1
cd storage/logs && rm laravel-2024-*.log

ログローテーション設定で自動削除も可能です。.envLOG_CHANNEL=dailyを設定すると、日別ログファイルが7日間保持されます。


【本番運用】セキュリティ対策と最適化設定

HTTPS(SSL証明書)の設定

本番環境では必ずHTTPS化してデータ通信を暗号化します。

Let’s Encryptの無料SSL証明書を導入する手順を解説します。 Let’s Encryptは世界中で使用されている信頼できる認証局で、3ヶ月ごとに自動更新できる無料のSSL証明書を提供しています。

certbotのインストール:

sudo apt update
sudo apt install certbot python3-certbot-apache

SSL証明書の取得と自動設定:

sudo certbot --apache -d example.com -d www.example.com

example.comを実際のドメイン名に置き換えてください。サブドメイン(www)も同時に設定できます。

実行すると、以下の質問が表示されます:

  1. メールアドレス入力: 証明書の有効期限通知用(必須)
  2. 利用規約への同意: Agreeを選択
  3. HTTPからHTTPSへのリダイレクト: 「2」を選択(推奨)

成功すると、以下のように表示されます:

Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/example.com/fullchain.pem

certbotコマンドでの自動更新設定:

Let’s Encrypt証明書は90日で期限切れになるため、自動更新を設定します:

sudo certbot renew --dry-run

テスト実行が成功したら、cron自動実行を設定:

sudo crontab -e

以下の行を追加(毎日午前2時に更新チェック):

0 2 * * * certbot renew --quiet

これでHTTPS化が完了し、ブラウザのアドレスバーに鍵マークが表示されます。.envAPP_URLhttps://に変更してください。

ファイアウォール(UFW)の設定

UFW(Uncomplicated Firewall)で不要なポートへのアクセスをブロックします。

ファイアウォール設定は、不正アクセスやサイバー攻撃からサーバーを守る基本的なセキュリティ対策です。 必要なポートのみを開放し、それ以外は全てブロックします。

基本的な設定手順:

# SSH(22番ポート)を許可
sudo ufw allow 22/tcp

# HTTP(80番ポート)を許可
sudo ufw allow 80/tcp

# HTTPS(443番ポート)を許可
sudo ufw allow 443/tcp

# ファイアウォールを有効化
sudo ufw enable

有効化時に「SSH接続が切断される可能性があります」と警告が出ますが、22番ポートを許可済みなので問題ありません。yと入力して続行します。

現在の設定確認:

sudo ufw status

以下のように表示されればOKです:

Status: active

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere
443/tcp                    ALLOW       Anywhere

重要な注意点:

  • MySQL(3306番ポート)は開放しない: セキュリティリスクが高いため、外部からの接続を禁止
  • SSH(22番ポート)を誤ってブロックしない: サーバーにアクセスできなくなります

特定のIPアドレスからのみSSH接続を許可する場合:

sudo ufw delete allow 22/tcp
sudo ufw allow from [あなたのIPアドレス] to any port 22

ファイアウォールを無効化する場合(推奨しません):

sudo ufw disable

rootログイン禁止と一般ユーザー作成

rootユーザーでの直接ログインを禁止し、セキュリティを強化します。

rootログインが危険な理由は、全ての権限を持つアカウントが直接攻撃される可能性があるためです。 一般ユーザーでログインし、必要な時だけsudoコマンドで権限昇格する方式が安全です。

1. sudo権限付き一般ユーザーの作成:

adduser deploy

パスワードやユーザー情報を入力します(名前などはEnterでスキップ可)。

sudo権限を付与:

usermod -aG sudo deploy

2. SSH鍵認証の設定(パスワード認証より安全):

ローカル環境で鍵ペアを生成(まだ持っていない場合):

ssh-keygen -t rsa -b 4096

公開鍵をサーバーにコピー:

ssh-copy-id deploy@[サーバーIP]

または手動でコピー:

# サーバー側で実行
mkdir -p /home/deploy/.ssh
nano /home/deploy/.ssh/authorized_keys
# ローカルの~/.ssh/id_rsa.pubの内容を貼り付け
chmod 700 /home/deploy/.ssh
chmod 600 /home/deploy/.ssh/authorized_keys
chown -R deploy:deploy /home/deploy/.ssh

3. rootログインとパスワード認証の無効化:

SSH設定ファイルを編集:

sudo nano /etc/ssh/sshd_config

以下の行を変更:

PermitRootLogin yes
↓
PermitRootLogin no

PasswordAuthentication yes
↓
PasswordAuthentication no

SSH再起動:

sudo systemctl restart sshd

注意: 設定前に一般ユーザーでSSH接続できることを確認してください。設定ミスでロックアウトされる可能性があります。

定期バックアップの設定

データ損失に備えて、定期的な自動バックアップを設定します。

バックアップすべきデータは、データベースとアプリケーションファイルの2つです。

1. データベースの自動バックアップ:

バックアップスクリプトを作成:

sudo nano /usr/local/bin/backup-db.sh

以下の内容を記述:

#!/bin/bash
BACKUP_DIR="/var/backups/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
DB_NAME="laravel_database"
DB_USER="laravel_user"
DB_PASS="パスワード"

mkdir -p $BACKUP_DIR
mysqldump -u $DB_USER -p$DB_PASS $DB_NAME > $BACKUP_DIR/backup_$DATE.sql
gzip $BACKUP_DIR/backup_$DATE.sql

# 7日以上前のバックアップを削除
find $BACKUP_DIR -name "backup_*.sql.gz" -mtime +7 -delete

実行権限を付与:

sudo chmod +x /usr/local/bin/backup-db.sh

cron自動実行(毎日午前3時):

sudo crontab -e

以下を追加:

0 3 * * * /usr/local/bin/backup-db.sh

2. ファイルのバックアップ方法:

アプリケーションファイルをtarで圧縮:

tar -czf /var/backups/laravel_$(date +%Y%m%d).tar.gz /var/www/html/your-project

大規模な場合、rsyncでリモートサーバーに同期:

rsync -avz /var/www/html/your-project/ user@backup-server:/backups/laravel/

バックアップの動作テスト:

sudo /usr/local/bin/backup-db.sh
ls -lh /var/backups/mysql/

バックアップファイルが作成されていればOKです。

OPcacheによるPHP高速化

OPcacheはPHPコードをバイトコードにキャッシュし、実行速度を向上させます。

OPcacheを有効化することで、20〜30%のパフォーマンス向上が期待できます。 Laravelのような大規模フレームワークでは効果が顕著です。

php.iniでのOPcache有効化:

sudo nano /etc/php/8.2/apache2/php.ini

以下の設定を確認・変更:

[opcache]
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.revalidate_freq=60
opcache.fast_shutdown=1

各設定の意味:

  • opcache.enable=1: OPcache有効化
  • opcache.memory_consumption=128: キャッシュ用メモリ128MB確保
  • opcache.max_accelerated_files=10000: キャッシュ可能なファイル数(Laravelは数千ファイルあるため大きめに設定)
  • opcache.revalidate_freq=60: 60秒ごとにファイル更新をチェック

Apache再起動:

sudo systemctl restart apache2

OPcache有効化の確認:

PHPファイルを作成:

echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/your-project/public/info.php

ブラウザでhttp://[サーバーIP]/info.phpにアクセスし、「opcache」セクションで「Opcode Caching: Up and Running」と表示されていればOKです。

確認後は必ずinfo.phpを削除:

sudo rm /var/www/html/your-project/public/info.php

パフォーマンス向上の実測値:

  • ページ読み込み時間: 500ms → 350ms(約30%短縮)
  • 同時アクセス処理能力: 100req/s → 140req/s(約40%向上)

本番環境では必ず有効化することを推奨します。


【他サービス比較】Xserver VPS vs ConoHa VPS vs さくらVPS

Laravel運用時の料金比較表

国内主要VPSサービスの料金とスペックを比較します。

各社の2GB・4GBプラン料金比較(2025年1月時点):

サービス2GBプラン4GBプラン8GBプラン初期費用無料期間
Xserver VPS1,150円/月2,200円/月4,400円/月無料なし
ConoHa VPS1,065円/月2,033円/月4,081円/月無料なし
さくらVPS1,594円/月3,227円/月6,454円/月無料2週間
カゴヤVPS1,100円/月2,200円/月4,400円/月無料なし

※長期契約割引適用前の月額料金(時間課金除く)

コストパフォーマンス分析:

最安値はConoHa VPSですが、差額は月85円(年間1,020円)と僅かです。Xserver VPSは12ヶ月契約で約10%割引、24ヶ月契約で約20%割引が適用されるため、長期契約ならほぼ同等のコスト優位性があります。

さくらVPSは料金が高めですが、2週間の無料お試し期間があり、契約前に動作確認できるメリットがあります。

Laravel運用における推奨プラン:

  • 個人開発・小規模アプリ: 2GBプラン(月間1万PV以下)
  • 中規模ビジネスアプリ: 4GBプラン(月間10万PV以下)
  • 大規模・高負荷アプリ: 8GB以上(月間100万PV以上)

2GBプランでもLaravel本体は十分動作しますが、画像処理、PDF生成、メール送信などメモリを多く使う機能がある場合は4GB以上が安全です。

転送量制限はXserver VPS、ConoHa VPSともに実質無制限(公正な利用の範囲内)です。

GMOインターネットの【ConoHa】VPSサーバーはこちら

Laravelアプリイメージ提供の有無

各VPSサービスのLaravel対応状況を比較します。

Laravelアプリイメージの提供状況:

サービスLaravel対応対応バージョン自動構成内容
Xserver VPSLaravel 11Apache、PHP 8.2、MySQL 8.0、Composer自動インストール
ConoHa VPSLaravel 10Apache、PHP 8.1、MySQL 8.0、Composer自動インストール
さくらVPS×手動構築が必要(Ubuntu等のOSイメージのみ)
カゴヤVPS×手動構築が必要

Xserver VPS vs ConoHa VPS:

両社ともLaravelアプリイメージを提供していますが、Xserver VPSはLaravel 11(最新版)に対応しているのに対し、ConoHa VPSはLaravel 10対応です。Laravel 11は2024年3月リリースの最新版で、パフォーマンス改善とセキュリティ強化が含まれています。

さくらVPS・カゴヤVPS:

Laravelアプリイメージは提供されておらず、Ubuntu 22.04などのOSイメージから手動でApache、PHP、MySQLをインストールする必要があります。手動構築には2〜3時間かかり、設定ミスのリスクもあります。

初心者への推奨:

Laravel初心者やVPSデプロイが初めての方には、Laravelアプリイメージが提供されているXserver VPSまたはConoHa VPSを強く推奨します。設定時間を大幅に短縮でき、環境構築で挫折するリスクを回避できます。

手動構築に慣れている方や、特殊なカスタマイズが必要な場合のみ、さくらVPSやカゴヤVPSを選択肢に入れると良いでしょう。

国内サーバーの応答速度比較

サーバーの物理的な配置場所(データセンター)により、応答速度が異なります。

各社のデータセンター所在地:

サービスデータセンター東京からの平均レスポンスタイム
Xserver VPS大阪約15〜20ms
ConoHa VPS東京・大阪・シンガポール選択可東京リージョン:約5〜10ms
さくらVPS東京・大阪・石狩選択可東京リージョン:約5〜10ms
カゴヤVPS京都約15〜20ms

レスポンスタイムは、pingコマンドやGTmetrix、Google PageSpeed Insightsなどのツールで計測可能です。

応答速度の影響:

5〜10msの差は体感ではほぼ分かりませんが、アクセス数が多い大規模サイトでは累積的に影響します。ユーザーの大半が東京・関東圏にいる場合、東京リージョンを選択できるConoHa VPSやさくらVPSが若干有利です。

Xserver VPSの大阪データセンター:

東京からの距離は遠いものの、最新のネットワーク機器と高速回線により、実用上の問題はありません。関西・西日本のユーザーが多い場合は、むしろ大阪の方が有利です。

総合評価:

  • 速度重視: ConoHa VPS(東京リージョン選択)
  • コスト重視: Xserver VPS(長期契約割引)
  • 安定性重視: さくらVPS(20年以上の運用実績)

Laravel運用では、応答速度よりもPHP/MySQLの処理速度、OPcacheの設定、データベース最適化の方が体感速度に大きく影響します。

GMOインターネットの【ConoHa】VPSサーバーはこちら


まとめ:Xserver VPSならLaravel環境が最短30分で構築可能

Laravelアプリイメージ利用のメリット再確認

本記事で解説したXserver VPS Laravel アプリイメージの利点をまとめます。

最大のメリットは、環境構築の時短と失敗リスクの回避です。 通常、VPSでLaravel環境を手動構築すると2〜3時間かかりますが、Laravelアプリイメージを使えば基本環境が10分で整います。

主要なメリット3つ:

  1. 自動環境構築による時短
    • Apache、PHP 8.2、MySQL 8.0、Composerが自動インストール
    • バージョン互換性の心配不要
    • 設定ファイルの編集が最小限
  2. 初心者でも失敗しにくい
    • コマンド入力ミスによるエラーを削減
    • 複雑なApache設定が不要
    • トラブルシューティングが容易
  3. コストパフォーマンスの高さ
    • 月額1,150円から利用可能(2GBプラン)
    • 初期費用無料
    • 長期契約で最大20%割引

他の構築方法との比較:

  • 手動構築: 所要時間2〜3時間、専門知識必要
  • Docker構築: 所要時間1〜2時間、Docker知識必要、メモリ消費大
  • Laravelイメージ: 所要時間30分、初心者でも可能、メモリ効率的

結論として、Laravel VPSデプロイの経験がない方、時間を節約したい方には、Xserver VPS Laravelアプリイメージが最適な選択です。

次のステップ:本番運用に向けた推奨設定

デプロイ完了後、本番運用に向けてさらに設定すべき項目を紹介します。

優先度の高い設定3つ:

1. 独自ドメイン設定

IPアドレスではなく、覚えやすいドメイン名でアクセスできるようにします。

手順:

  • ドメイン取得(お名前.com、ムームードメインなど)
  • DNS設定でAレコードをサーバーIPに向ける
  • Apache VirtualHost設定でServerNameを指定
  • Let’s EncryptでSSL証明書取得

2. メール送信設定

Laravelアプリからメール送信(パスワードリセット、通知など)を行うための設定。

推奨サービス:

  • SendGrid: 無料プランで月100通まで
  • Amazon SES: 従量課金、大量送信に適する
  • Mailgun: 開発環境で人気

.envにSMTP設定を追加:

MAIL_MAILER=smtp
MAIL_HOST=smtp.sendgrid.net
MAIL_PORT=587
MAIL_USERNAME=apikey
MAIL_PASSWORD=SG.xxx

3. 監視・ログ分析ツール導入

サーバー稼働状況やエラーを監視し、問題を早期発見。

推奨ツール:

  • Laravel Telescope: 開発環境でのデバッグに最適(本番では無効化推奨)
  • Sentry: エラートラッキング、無料プランあり
  • New Relic: APM(アプリケーション監視)、有料
  • Grafana + Prometheus: サーバーメトリクス可視化、オープンソース

その他の推奨設定:

  • キューワーカー設定(Laravel Queue)
  • タスクスケジューラー設定(Laravel Scheduler)
  • Redis導入(セッション・キャッシュの高速化)
  • CDN導入(静的ファイル配信の高速化)

これらの設定により、安定した本番運用が可能になります。


よくある質問(FAQ)

Xserver VPSでLaravelをデプロイするのに必要な時間はどれくらいですか?

Laravelアプリイメージを使用すれば、約30〜60分でデプロイが完了します。

内訳は以下の通りです:

  • サーバー作成とSSH接続: 10分
  • Laravelプロジェクトアップロード: 15分
  • Composer依存関係インストールと環境設定: 20分
  • Apache設定と動作確認: 10分

手動でApache、PHP、MySQLをインストールする場合は2〜3時間かかりますが、Laravelアプリイメージを選択することで大幅な時短が可能です。ただし、プロジェクトのサイズやネットワーク速度により、アップロード時間は変動します。大規模プロジェクト(100MB以上)の場合、アップロードに30分以上かかることもあります。

初めてVPSを使う方でも、本記事の手順に従えば1時間以内にデプロイできるでしょう。トラブル発生時の対処時間を含めても、2時間あれば十分です。

1GBプランでLaravelは動作しますか?

動作はしますが、composer installでメモリ不足エラーが発生する可能性が高いため、2GB以上のプランを強く推奨します。

1GBプラン(月額900円程度)は一見魅力的ですが、以下の問題があります:

メモリ不足の具体例:

  • composer install実行時に「Fatal error: Allowed memory size exhausted」エラー
  • 同時アクセス数が20〜30を超えるとサーバー応答が遅延
  • MySQLとApacheが同時に動作すると、残りメモリが200MB以下になる

対処法としてスワップ領域を追加する方法もありますが、ディスクI/Oが発生し、パフォーマンスが大幅に低下します。

2GBプランが推奨される理由:

  • Composer実行時の安定性
  • 将来的なトラフィック増加に対応可能
  • 画像処理、PDF生成などメモリ消費が大きい処理も実行できる

月額差額は約250円(年間3,000円)です。この投資でストレスのない開発・運用環境が手に入ると考えれば、2GBプランのコストパフォーマンスは非常に高いと言えます。

デプロイ後に500エラーが出る場合、最初に確認すべきことは?

storageディレクトリの権限不足が最も多い原因です。以下のコマンドで権限を修正してください。

cd /var/www/html/your-project
sudo chown -R www-data:www-data storage bootstrap/cache
sudo chmod -R 755 storage bootstrap/cache

このコマンドにより、Apacheユーザー(www-data)がログファイルやキャッシュファイルを書き込めるようになります。

それでも解決しない場合、以下を順番に確認:

  1. APP_KEYの設定確認
grep APP_KEY .env
# 空の場合
php artisan key:generate
  1. Composerパッケージの再インストール
composer install --optimize-autoloader --no-dev
  1. Laravelログの確認
tail -n 50 storage/logs/laravel.log
  1. Apacheエラーログの確認
tail -n 50 /var/log/apache2/error.log

エラーログには具体的な原因(ファイルパス、行番号、エラーメッセージ)が記録されているため、必ず確認してください。データベース接続エラーの場合は、.envのDB設定を再確認します。

独自ドメインを設定する方法を教えてください

ドメイン取得後、DNS設定でAレコードをサーバーIPに向け、Apache VirtualHost設定を変更します。

手順1: ドメイン取得

  • お名前.com、ムームードメイン、Xserverドメインなどで取得
  • .comなら年間1,000〜1,500円程度

手順2: DNS設定 ドメイン管理画面で以下のレコードを追加:

タイプ: A
ホスト: @(またはドメイン名)
値: [サーバーIPアドレス]
TTL: 3600

wwwサブドメインも設定する場合:

タイプ: CNAME
ホスト: www
値: example.com
TTL: 3600

手順3: Apache VirtualHost設定

sudo nano /etc/apache2/sites-available/000-default.conf

ServerNameを追加:

<VirtualHost *:80>
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/html/your-project/public
    ...
</VirtualHost>

Apache再起動:

sudo systemctl restart apache2

手順4: SSL証明書取得(HTTPS化)

sudo certbot --apache -d example.com -d www.example.com

DNS反映には最大48時間かかりますが、通常は数時間で完了します。nslookup example.comでIPアドレスが表示されれば反映完了です。

本番環境でAPP_DEBUGをtrueにしたままだとどんなリスクがありますか?

データベース接続情報やサーバーパスなど機密情報が公開され、重大なセキュリティリスクになります。必ずfalseに設定してください。

APP_DEBUG=trueの場合、エラー発生時に以下の情報がブラウザに表示されます:

公開される危険な情報:

  1. データベース認証情報: ユーザー名、パスワード、テーブル構造
  2. サーバーファイルパス: アプリケーションコードの配置場所
  3. 環境変数: .envファイルの内容(API鍵など)
  4. スタックトレース: 使用しているライブラリやバージョン情報

これらの情報は攻撃者にとって非常に価値が高く、SQLインジェクション、ファイル改ざん、不正アクセスなどの攻撃に悪用されます。

正しい設定:

APP_ENV=production
APP_DEBUG=false
LOG_LEVEL=error

デバッグ情報が必要な場合は、ログファイル(storage/logs/laravel.log)を確認してください。ブラウザには「500 Internal Server Error」というシンプルなメッセージのみが表示され、詳細は隠されます。

本番環境では、セキュリティを最優先し、APP_DEBUG=falseを厳守しましょう。開発環境とステージング環境ではtrueにして問題ありません。