Laravel(ララベル)は、PHPでWebアプリケーションを作るためのフレームワークです。画面の表示、データベースへの保存、メール送信などに使う仕組みが用意されているため、共通処理を一から作る負担を減らせます。
今回は、LinuxサーバーにLaravelをインストールし、MySQLへの接続とメール送信を設定して、ブラウザーで標準のWelcomeページを表示するところまで進めます。
サンプルのホスト名は example.com です。これは説明用の予約ドメインなので、実際の構築では、すべて自分が管理するドメインに置き換えてください。証明書の発行やメール送信も、実際のドメインで行います。
使用するバージョンとサーバー構成
2026年11月9日時点の最新安定メジャー系列は Laravel 13.x です。Laravel公式の対応PHPは 8.3〜8.5。Laravel 13は2026年3月17日に公開され、セキュリティ修正は2028年3月17日までの予定です。
この記事では、次の構成に統一します。
| 項目 | 使用するもの |
|---|---|
| Linux | Ubuntu Server 24.04 LTS |
| フレームワーク | Laravel 13.xの安定版 |
| PHP | PHP 8.3系のUbuntu更新済みパッケージ |
| Webサーバー | Nginx |
| PHPの実行方式 | PHP-FPM |
| パッケージ管理 | Composer 2系 |
| DB製品・種類 | Oracle MySQL Community Server(リレーショナルDB) |
| DBバージョン | MySQL 8.4 LTS系の更新済みパッケージ |
| ストレージエンジン | InnoDB |
| DB文字コード | utf8mb4 |
| DB照合順序 | utf8mb4_unicode_ci |
| メール | 契約済みSMTPサービスへ接続して送信 |
| ホスト名 | example.com |
| アプリの配置場所 | /var/www/example.com |
| Web公開ディレクトリ | /var/www/example.com/public |
MySQL 8.4 LTSはこの記事で採用する系列であり、MySQL全体の最新版という意味ではありません。MariaDBは別の製品なので、本稿の手順では選びません。
utf8mb4 は、日本語に加えて絵文字などの4バイト文字も保存できる文字コードです。照合順序は文字の比較・並べ替えの規則で、本稿ではLaravel側とDB側を utf8mb4_unicode_ci にそろえます。これは大文字・小文字などを同一視する比較なので、将来、厳密な識別が必要な項目には別途設計が必要です。
パッチ番号は更新されるため固定せず、インストール後に実際の番号を確認します。Laravel本体の番号は、ひな形パッケージではなく composer show laravel/framework で確認します。
作業前に用意するもの
- 新規のUbuntu Server 24.04 LTSサーバー。
- SSHでログインできる一般ユーザーと
sudo権限。 - 自分が管理するドメインと、そのDNSを変更できる権限。
- SMTPサービスの接続先、ポート番号、認証情報、送信を許可された差出人アドレス。
- 受信を確認できる自分のメールアドレス。
本稿は、新規サーバー向けです。既存サイトやDBのあるサーバーでは、そのままパッケージやWeb設定を変更せず、バックアップと影響確認を先に行ってください。Rocky Linuxなどでは、パッケージ名・設定場所・SELinuxの設定が異なります。
DNSのAレコードで example.com をサーバーのIPv4アドレスへ向けます。AAAAレコードを登録する場合は、IPv6でも同じサーバーへ到達できるようにします。
クラウド側のファイアウォールではWeb用のTCP 80・443番を許可します。SSHは管理元からのみ許可し、MySQLの3306番は外部公開しません。SMTPの送信先ポートへの外向き通信も必要です。
以後のコマンドは一般ユーザーで実行し、管理権限が必要な操作だけ sudo を付けます。`sudo` は管理者として実行するための命令です。
NginxとPHPをインストールする
sudo apt update
sudo apt upgrade
sudo apt install nginx curl ca-certificates unzip git nano \
php8.3-cli php8.3-fpm php8.3-common php8.3-mysql \
php8.3-mbstring php8.3-xml php8.3-curl php8.3-zip \
php8.3-bcmath php8.3-intl php8.3-sqlite3
sudo systemctl enable --now nginx php8.3-fpm
php -v
php -mapt update はパッケージ一覧の更新、`apt upgrade` は導入済みパッケージの更新です。再起動が必要と案内された場合は、この段階で再起動してSSH接続し直してください。
PHP-FPMは、Nginxから渡されたPHPの処理を実行します。`php8.3-mysql` はMySQL接続、`mbstring` は日本語などの文字列処理、`xml` はDOM/XML処理に使います。SQLiteの拡張は、Laravelのプロジェクト生成時に標準で走るSQLite初期化処理に備えて入れています。後からMySQLへ切り替えます。
php -v が8.3系になっていること、`php -m` に pdo_mysql・`mbstring`・`dom`・`xml`・`curl`・`openssl` などがあることを確認してください。公式の必須拡張一覧は資料[2]で確認できます。
Composerをインストールする
Composerは、Laravelと必要なPHPライブラリをまとめて管理するツールです。公式インストーラーを取得し、SHA-384の照合値で確認してから実行します。
以下はひとまとまりで実行してください。
(
set -eu
workdir=$(mktemp -d)
trap 'rm -rf "$workdir"' EXIT
cd "$workdir"
curl -fsS https://getcomposer.org/installer -o installer.php
curl -fsS https://composer.github.io/installer.sig -o installer.sha384
php -r 'if (hash_file("sha384", "installer.php") !== trim(file_get_contents("installer.sha384"))) { fwrite(STDERR, "Checksum mismatch\n"); exit(1); }'
php installer.php --2 --filename=composer
sudo install -m 0755 composer /usr/local/bin/composer
)
composer --version照合に失敗した場合は、先へ進めず取得元や通信を確認します。以後、Laravelの作成やComposerの操作は sudo composer ... ではなく一般ユーザーで行います。
MySQL Community Server 8.4 LTSを入れる
Ubuntu標準リポジトリの mysql-server をそのまま入れると、この記事で指定する8.4系になるとは限りません。先にOracle公式のMySQL APTリポジトリを設定します。
- MySQL APT Repositoryの公式ページを開きます。
- 現在配布されている
mysql-apt-config_..._all.debを取得し、サーバーのホームディレクトリへ配置します。ダウンロード時にログイン画面が出る場合は、アカウント登録せずダウンロードするリンクを利用できます。 - 次のコマンドのファイル名を、実際に取得した名前に置き換えて実行します。
sudo dpkg -i ./mysql-apt-config_実際のバージョン_all.deb選択画面では「MySQL Server & Cluster」から mysql-8.4-lts に相当する項目を選び、確定します。ほかのLTS系列やInnovation系列が選ばれていたら、8.4へ変更します。画面の表記は配布版によって変わる場合があります。
sudo apt update
apt-cache policy mysql-serverCandidate が8.4系で、OracleのMySQLリポジトリから取得されることを確認してから進めます。署名エラーが出る場合は公式設定パッケージを更新し、署名検証を無効化して回避しないでください。
sudo apt install mysql-server
sudo systemctl enable --now mysql
mysql --versionインストール中にroot用のパスワード設定を求められたら、十分に長いパスワードを設定します。認証方式を選べる場合は、推奨の強い認証を使います。旧式の mysql_native_password に変更する必要はありません。
DB管理者としてログインします。
mysql -u root -prootをソケット認証で設定した場合は、代わりに sudo mysql を使います。どちらを使うかは、インストール時に選んだroot認証方式によります。
次のSQLで、DB・専用ユーザー・権限を作ります。`REPLACE_WITH_STRONG_DB_PASSWORD` は、パスワード管理ツールで作った固有の長い値に置き換えてください。SQLのシングルクォートを含む値はエスケープが必要なので、初心者は英数字中心の十分に長いランダム文字列にすると設定しやすくなります。
SELECT VERSION();
CREATE DATABASE example_app
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
CREATE USER 'example_user'@'localhost'
IDENTIFIED BY 'REPLACE_WITH_STRONG_DB_PASSWORD';
GRANT ALL PRIVILEGES ON example_app.*
TO 'example_user'@'localhost';
SHOW CREATE DATABASE example_app;
EXIT;アプリにはMySQLのrootを使わず、この専用ユーザーを設定します。上記の権限は example_app の中だけに限定され、テーブル作成などのマイグレーションも実行できます。
本稿はWebとDBを同じサーバーへ置き、Unixソケットで接続します。接続確認とソケット位置の確認を行います。
mysql --protocol=SOCKET -u example_user -p example_app \
-e "SELECT VERSION(), @@socket, @@default_storage_engine;"表示されたソケット位置を控えてください。以後は /var/run/mysqld/mysqld.sock の例を使います。異なる場合は実際の値へ置き換えます。エンジンが InnoDB になっていることも確認します。
Laravelのプロジェクトを作る
配置先を作り、現在のログインユーザーが書き込めるようにします。
sudo install -d -m 0755 -o "$(id -un)" -g "$(id -gn)" /var/www/example.com
composer create-project --prefer-dist laravel/laravel /var/www/example.com "^13.0"
cd /var/www/example.com
php artisan --version
composer show laravel/framework
composer check-platform-reqs^13.0 は13系を指定する制約です。通常の安定版設定のまま使い、開発版の dev-main などは指定しません。依存関係の制約を満たす13系の安定版が解決されます。
artisan はLaravelの管理コマンドです。プロジェクト作成時には .env の生成、暗号化キーの生成、SQLiteの初期化が行われます。MySQLへの接続は、このあとの設定とマイグレーションで確認します。
依存関係の実際のバージョンは composer.lock に記録されます。再現できるよう、このファイルもソース管理へ含めます。
.envにアプリとDBの情報を設定する
.env は、そのサーバー固有の設定を保存するファイルです。パスワードを含むため、公開・共有したり、Gitへ登録したりしないでください。
cd /var/www/example.com
nano .env既存の同名項目を書き換え、ない項目だけ追加します。同じキーを重複させないようにします。nanoは Ctrl+O → Enterで保存、`Ctrl+X` で終了できます。
APP_NAME="Example Laravel"
APP_ENV=production
APP_DEBUG=false
APP_URL=https://example.com
APP_LOCALE=ja
APP_FALLBACK_LOCALE=en
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=example_app
DB_USERNAME=example_user
DB_PASSWORD="REPLACE_WITH_STRONG_DB_PASSWORD"
DB_SOCKET=/var/run/mysqld/mysqld.sock
DB_CHARSET=utf8mb4
DB_COLLATION=utf8mb4_unicode_ci
SESSION_DRIVER=database
CACHE_STORE=database
QUEUE_CONNECTION=syncDBパスワードは手順5と同じものにします。`DB_SOCKET` を指定したこの構成では、TCPではなくソケットで接続します。既存の DB_URL が設定されていたら削除し、今回の個別設定と競合させないでください。
APP_DEBUG=false は、エラーの詳細や内部情報を訪問者へ表示しない設定です。`APP_KEY` は生成された値をそのまま残します。空欄の場合だけ、次を一度実行します。
php artisan key:generate運用開始後に不用意にキーを再生成すると、以前のキーで暗号化したデータを読めなくなる場合があります。
SESSION_DRIVER=database と CACHE_STORE=database は、セッション情報とキャッシュをMySQLへ保存する指定です。`QUEUE_CONNECTION=sync` は処理をその場で実行する指定で、この入門では常駐ワーカーを必要としません。
テーブルを作り、DB接続を確認する
php artisan config:clear
php artisan migrate --force
php artisan migrate:statusマイグレーションは、PHPで定義したテーブル構造をDBへ反映する機能です。新規の標準プロジェクトには、ユーザーやセッション、キャッシュなどのテーブルを作成する定義が含まれます。
--force はproduction環境での実行確認を省略する指定です。ここでは新規DBに対して実行します。既存DBでは、変更内容とバックアップを確認してから使ってください。`migrate:fresh` はテーブルを削除するため、本手順では使いません。
migrate:status で各項目が Ran になれば、LaravelからMySQLへ接続し、テーブルを作成できています。DB側でも確認できます。
mysql --protocol=SOCKET -u example_user -p example_appSHOW TABLES;
SELECT TABLE_NAME, ENGINE, TABLE_COLLATION
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'example_app';
EXIT;テーブルのエンジンがInnoDB、照合順序が utf8mb4_unicode_ci になっていることを確認します。
SMTPでメールを送信できるようにする
Laravelの初期設定は、メールをログへ書き出す log になっていることがあります。実際に送信するには、SMTPなどの配送方法へ変更します。
ここでは、465番・暗黙的TLS(SMTPS)に対応した契約済みSMTPサービスを使います。以下の smtp.example.com は説明用です。実際にはサービスから案内された接続先を設定してください。
.env のメール項目を次のように変更します。
MAIL_MAILER=smtp
MAIL_SCHEME=smtps
MAIL_HOST=smtp.example.com
MAIL_PORT=465
MAIL_USERNAME="REPLACE_WITH_SMTP_USERNAME"
MAIL_PASSWORD="REPLACE_WITH_SMTP_PASSWORD"
MAIL_FROM_ADDRESS="no-reply@example.com"
MAIL_FROM_NAME="Example Laravel"Laravel 13の標準 config/mail.php は MAIL_SCHEME を参照します。古い解説にある MAIL_ENCRYPTION=tls だけを設定して済ませないようにします。`MAIL_URL` が設定されている場合は今回の個別指定と競合しないよう削除します。
SMTPサービスが587番・STARTTLSを指定している場合は、その仕様に合わせて MAIL_SCHEME=smtp、`MAIL_PORT=587` へ変更します。これは465番のSMTPSとは接続の始め方が異なります。Symfony Mailerは対応サーバーとOpenSSLがある場合にSTARTTLSへ自動移行します。TLS必須を保証したい場合は、使用中のMailerの require_tls オプションも設定します。証明書検証を無効にして接続エラーを回避しないでください。
差出人の no-reply@example.com は、自分のドメインで送信を許可・認証したアドレスへ置き換えます。SMTPサービスが案内するSPF・DKIMをDNSへ登録し、DMARCも運用方針に合わせて設定します。SMTPへ接続できることと、相手の受信箱へ届くことは別々に確認します。
自分宛てに送信テストをする
php artisan config:clear
php artisan tinkerTinkerはLaravelの処理を対話的に実行するコンソールです。起動した画面で、以下の your-address@example.com を受信確認できる自分のアドレスへ置き換えて実行します。
\Illuminate\Support\Facades\Mail::raw('Laravelからのメール送信テストです。', function ($message) {
$message->to('your-address@example.com')->subject('Laravel SMTP接続テスト');
});終了は exit です。受信箱、迷惑メールフォルダー、SMTPサービス側の配信ログを確認してください。例外が出なかっただけでは、最終的な配達完了とは判断できません。
このテストはSSH上で行うため、送信用のテストURLをインターネットへ公開する必要はありません。標準のWelcomeページを表示しただけでメールが送信されるわけでもありません。
ファイルのアクセス権を整える
NginxとPHP-FPMが使う www-data グループへ読み取り権限を付けます。書き込みが必要な storage と bootstrap/cache のみ、グループ書き込みを許可します。
cd /var/www/example.com
sudo chown -R "$(id -un)":www-data /var/www/example.com
sudo find /var/www/example.com -type d -exec chmod 0750 {} \;
sudo find /var/www/example.com -type f -exec chmod 0640 {} \;
sudo find storage bootstrap/cache -type d -exec chmod 2770 {} \;
sudo find storage bootstrap/cache -type f -exec chmod 0660 {} \;
sudo chmod 0640 .env2770 の先頭の2は、作成したファイルやディレクトリに親のグループを引き継がせるための指定です。全員へ書き込みを許可する chmod 777 は使いません。
この権限設定は新規導入用です。更新作業後にファイルが追加された場合も、同じ方針で所有者と必要な権限を確認します。
NginxからLaravelへアクセスできるようにする
設定ファイルを作ります。
sudo nano /etc/nginx/sites-available/example.com次の内容を保存します。
server {
listen 80;
listen [::]:80;
server_name example.com;
root /var/www/example.com/public;
index index.php;
charset utf-8;
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options SAMEORIGIN;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /index.php {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_hide_header X-Powered-By;
}
location ~ \.php$ {
return 404;
}
location ~ /\.(?!well-known).* {
deny all;
}
}公開するのは必ず public ディレクトリです。`/var/www/example.com` 自体を公開すると、設定や内部ファイルが漏れる原因になります。
try_files は、実在する画像やCSSはそのまま返し、それ以外のURLをLaravelの入口である index.php へ渡します。
設定を有効化します。下記のリンク作成は初回だけ実行します。
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com
sudo nginx -ttest is successful を確認してから反映します。
sudo systemctl reload nginx
curl -I -H 'Host: example.com' http://127.0.0.1/正常ならHTTP 200が返ります。別の画面が出た場合は、同じ server_name の重複設定がないか確認してください。
HTTPSを設定する
実ドメインのDNSがこのサーバーへ向き、外部から80・443番で到達できる状態で、証明書を取得します。`example.com` の文字列のまま証明書を取得することはできません。
新規UbuntuサーバーでCertbotが未導入の場合の例です。
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d example.com --redirect画面の案内に従い、連絡先メールアドレスと利用規約への同意を入力します。成功するとNginxへ証明書設定とHTTPからHTTPSへの転送が反映されます。
sudo nginx -t
sudo certbot renew --dry-run
systemctl status certbot.timer --no-pager更新テストが成功し、自動更新タイマーが有効なことを確認します。同じ証明書を別のACMEクライアントで管理している場合は、Certbotを重ねて導入せず、既存の証明書管理へ統一してください。
設定をキャッシュし、デフォルトページを表示する
cd /var/www/example.com
umask 0007
php artisan config:cache
php artisan view:cache
curl -I https://example.com/設定キャッシュにはDBやSMTPの認証情報も含まれるので、キャッシュファイルも公開しないようにします。`.env` を変更したときは、再び php artisan config:cache を実行してください。
ブラウザーで https://example.com/ を開き、LaravelのWelcomeページが表示されれば、Web公開まで完了です。
標準プロジェクトの routes/web.php では、トップページに対して welcome ビューを返すルートが用意されています。対応する画面ファイルは resources/views/welcome.blade.php です。つまり「デフォルトページを作る」作業は、プロジェクト生成時に済んでいます。
Laravel 13の標準Welcomeテンプレートには、Viteのビルド成果物がない場合に使うスタイルが用意されています。この未変更の初期画面の表示だけであれば、Node.jsや npm run build を先に実行する必要はありません。CSSやJavaScriptを編集して公開するときは、別途Node.js・npmを用意し、ビルドして成果物を配置します。
本番公開にはNginxとPHP-FPMを使います。開発用の php artisan serve を公開用サーバーとして常駐させる必要はありません。
つまずいたときの確認ポイント
| 症状 | 主な確認箇所 |
|---|---|
| 502 Bad Gateway | systemctl status php8.3-fpm、NginxとFPMのソケット位置 |
| 500 Internal Server Error | storage/logs/laravel.log、APP_KEY、DB接続、書き込み権限 |
| Permission denied | storage・`bootstrap/cache` の所有者、グループ、書き込み権限 |
| could not find driver | php8.3-mysql、CLIとFPMのPHPバージョン、FPM再起動 |
| Access denied for user | DBユーザー・パスワード・接続方法・権限 |
| No such file or directory(DB接続時) | DB_SOCKETがMySQLの実際のソケットと一致しているか |
| sessions / cacheテーブルがない | DB切り替え後に php artisan migrate --force を実行したか |
| .envを直しても変わらない | php artisan config:cache で設定を再生成したか |
| WelcomeではなくNginxの画面が出る | DNS、server_name、設定の有効化、重複したホスト設定 |
| メール認証に失敗する | SMTP専用認証情報、差出人の許可、465/587と暗号化方式 |
| 送信できるが届かない | 迷惑メール、SPF・DKIM、SMTP側の配信ログ・制限 |
| HTTPSの発行に失敗する | A/AAAAレコード、80番の到達性、CAAなどのDNS設定 |
ログは次のコマンドで確認できます。
tail -n 100 /var/www/example.com/storage/logs/laravel.log
sudo tail -n 100 /var/log/nginx/error.log
sudo journalctl -u php8.3-fpm -n 100 --no-pager公開サーバーで APP_DEBUG=true にして調べるのではなく、SSH上でログを確認します。ログを人へ渡す場合は、認証情報や個人情報が含まれていないか確認してください。
完了時に確認すること
composer show laravel/frameworkでLaravel 13系の実際の番号を記録した。- PHP 8.3系と必要な拡張が入り、`composer check-platform-reqs` が成功した。
- MySQL 8.4系を使用し、DBとテーブルの文字コード・照合順序を確認した。
migrate:statusでマイグレーションが完了している。- 自分宛てのSMTPテストメールを受信できた。
- HTTPSでWelcomeページを表示できた。
APP_DEBUG=false、公開先はpublic、DBの3306番は外部へ閉じている。- 証明書の自動更新を確認した。
ここまでで、Laravelを使った開発の土台ができました。次はルート・コントローラー・Bladeテンプレートを使い、自分のページを作っていきます。ユーザー登録やログイン画面は、この初期ページとは別に実装する機能です。
参考資料
すべて2026年11月9日に参照。パッケージの細かな番号や配布画面は変わるため、構築時にも公式情報を確認してください。


コメント