Laravelを構築する
LARAVEL 01 / 03

Laravel用のPHPとComposer

Laravel 13に対応するPHPとComposerを準備し、既存のPHP環境への影響を確認します。

01 / LaravelとPHPの対応を確認する

Ubuntu Server 22.04の物理マシン・仮想マシン共通の手順です。Laravel 13はPHP 8.3以降を必要とし、Ubuntu 22.04標準のPHP 8.1では実行できません。古いLaravelへ下げるのではなく、対応するPHPを用意します。最新の条件はLaravel公式の実行要件を確認してください。

このページではPHP 8.3とComposerを準備し、次のページで新規Laravelアプリを作成します。既存のWordPressやほかのアプリを上書き・移行する手順ではありません。管理者とSSH、OS更新とバックアップを済ませ、sudoとコンソール復旧手段を確保します。特記以外、サーバーの一般管理者で操作してください。

追加リポジトリを使います。

PHP 8.3はOndřej Surýのppa:ondrej/phpを使用します。Ubuntu公式アーカイブとは提供元が異なります。追加の信頼先・保守方針を確認し、既存サーバーはバックアップと影響評価を先に行います。新規の本番構築では、PHP 8.3を標準提供する新しいUbuntuの採用も検討してください。

02 / PHP 8.3を準備する

現在のCLIとFPM、APTの状態を記録します。PHPが未導入なら該当コマンドが見つからない場合があります。既存アプリがどの版を使うか確認してから進めます。

php -v
update-alternatives --query php
systemctl is-active php8.1-fpm
ls -l /run/php/
apt-cache policy php8.1-cli php8.3-cli

APT設定を退避し、取得と署名鍵の確認に使うツールを用意します。以降では追加した鍵をこのリポジトリだけに限定し、システム全体の信頼鍵として追加しません。

BACKUP="$(sudo mktemp -d /root/server-guide-laravel-apt.XXXXXX)" &&
sudo cp -a /etc/apt "$BACKUP/"
printf '保存先: %s\n' "$BACKUP"
sudo apt-get update && sudo apt-get install ca-certificates curl gnupg acl

PPAの公式ページとLaunchpad APIのsigning_key_fingerprintを確認します。2026年11月1日に確認した値はB8DC7E53946656EFBCE4C1DD71DAEAAB4AD4CAB6です。これは今回の記録で、将来も同じ鍵と決めつけません。公式情報と異なる場合は取得・登録を中断し、変更の理由を確認してください。

WORKDIR="$(mktemp -d)"
curl --fail --show-error --location --output "$WORKDIR/ppa.json" \
  'https://api.launchpad.net/1.0/~ondrej/+archive/ubuntu/php'
python3 -c 'import json,sys; print(json.load(open(sys.argv[1]))["signing_key_fingerprint"])' "$WORKDIR/ppa.json"

以下の指紋は上の値と公式情報が一致した場合の例です。HTTPSで取得した公開鍵の主鍵指紋も照合します。指紋表示だけで所有者を独立に認証したことにはならないため、入手元を公式情報と照合する手順も省きません。

EXPECTED_FPR='B8DC7E53946656EFBCE4C1DD71DAEAAB4AD4CAB6'
curl --fail --show-error --location --output "$WORKDIR/ondrej-php.key" \
  "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x${EXPECTED_FPR}"
gpg --show-keys --with-fingerprint "$WORKDIR/ondrej-php.key"
ACTUAL_FPR="$(gpg --show-keys --with-colons "$WORKDIR/ondrej-php.key" | awk -F: '$1=="fpr" {print $10; exit}')"
test -n "$EXPECTED_FPR" && test "$ACTUAL_FPR" = "$EXPECTED_FPR"

照合が終了コード0で成功し、同名ファイルがまだない場合だけ登録します。既存の鍵・APTソース・Pin設定がある場合は上書きせず、管理者と用途を確認します。以下のソースはUbuntu 22.04のjammy用です。

sudo test ! -e /usr/share/keyrings/ondrej-php-archive-keyring.gpg &&
sudo test ! -e /etc/apt/sources.list.d/ondrej-php.list &&
sudo test ! -e /etc/apt/preferences.d/ondrej-php-laravel &&
sudo gpg --dearmor --output /usr/share/keyrings/ondrej-php-archive-keyring.gpg "$WORKDIR/ondrej-php.key" &&
sudo chmod 644 /usr/share/keyrings/ondrej-php-archive-keyring.gpg &&
printf '%s\n' 'deb [signed-by=/usr/share/keyrings/ondrej-php-archive-keyring.gpg] https://ppa.launchpadcontent.net/ondrej/php/ubuntu jammy main' | sudo tee /etc/apt/sources.list.d/ondrej-php.list >/dev/null &&
printf '%s\n' 'Package: *' 'Pin: release o=LP-PPA-ondrej-php' 'Pin-Priority: 100' | sudo tee /etc/apt/preferences.d/ondrej-php-laravel >/dev/null

このPinは、通常のUbuntu提供候補を優先するためのものです。リポジトリの完全な隔離や、既存環境への無影響を保証しません。署名・TLSエラーが出たら中断し、検証を無効にして続けないでください。まずシミュレーションで新規導入・更新・削除予定と依存関係を確認します。

sudo apt-get update
apt-cache policy php-common php8.1-cli php8.3-cli php8.3-fpm
sudo apt-get -s install php8.3-cli php8.3-fpm php8.3-curl php8.3-mbstring php8.3-xml php8.3-sqlite3 php8.3-zip php8.3-mysql php8.3-intl php8.3-bcmath

予定する変更と既存アプリへの影響を確認できた場合だけ、削除を許可しない指定で導入します。--no-removeでもパッケージ更新や既定値変更は起こり得ます。依存解決できない場合は、Pinを無条件に外すのではなく、候補と要件を調べてください。

sudo apt-get --no-remove install php8.3-cli php8.3-fpm php8.3-curl php8.3-mbstring php8.3-xml php8.3-sqlite3 php8.3-zip php8.3-mysql php8.3-intl php8.3-bcmath
sudo systemctl enable --now php8.3-fpm

CLIのphp既定値は、導入前後のupdate-alternatives --query phpを比較します。既存のcron・スクリプトへ影響する場合は、記録した元の実行ファイルを管理者が選び直してください。既存PHP 8.1のFPM設定やソケットを8.3用へ置き換えません。このガイドは以後すべてphp8.3を明示します。

php8.3 -v
php8.3 -m
apt-cache policy php8.3-cli php8.3-fpm
systemctl is-active php8.3-fpm
systemctl is-enabled php8.3-fpm
sudo ls -l /run/php/php8.3-fpm.sock
update-alternatives --query php

PHP 8.3の表示、必要な拡張、FPMのactive・enabled、実際のソケット名と所有権を確認します。起動失敗はsudo journalctl -u php8.3-fpm -b --no-pagerで調べます。PHPの上流保守期間、PPAの更新提供、アプリの対応版をそれぞれ確認してください。

以前設定したUbuntu向けのunattended-upgradesが、このPPAも自動更新するとは限りません。対象の配布元と適用方針を確認し、PPA側の更新を取り込む保守手順を決めてください。この例ではPPAを自動更新対象へ追加する検証はしていません。

03 / Composerのインストーラーを検証する

ComposerはPHPの依存管理ツールです。アプリ作成や依存インストールをrootで実行しません。一般管理者のホームに導入します。同名のComposerが既にある場合は、版と管理方針を確認し、無条件に上書きしないでください。

Composer公式の導入案内に従い、インストーラーのSHA-384を公式チェックサムと照合します。ダウンロードしただけでは実行しません。

WORKDIR="$(mktemp -d)"
curl --fail --show-error --location --output "$WORKDIR/composer-setup.php" https://getcomposer.org/installer
curl --fail --show-error --location --output "$WORKDIR/installer.sig" https://composer.github.io/installer.sig
php8.3 -r '$expected = trim(file_get_contents($argv[1])); $actual = hash_file("sha384", $argv[2]); if (!hash_equals($expected, $actual)) { fwrite(STDERR, "Installer checksum mismatch\n"); exit(1); } echo "Installer checksum matched\n";' "$WORKDIR/installer.sig" "$WORKDIR/composer-setup.php"

終了コード0で一致を確認できた場合だけ、次のチェックと導入へ進みます。不一致なら実行せず削除し、公式案内と取得元を確認して再取得してください。これはSHA-384の整合性照合で、独立したGPG署名検証ではありません。

php8.3 "$WORKDIR/composer-setup.php" --check
install -d -m 755 "$HOME/.local/bin"
test ! -e "$HOME/.local/bin/composer" &&
php8.3 "$WORKDIR/composer-setup.php" --install-dir="$HOME/.local/bin" --filename=composer
php8.3 "$HOME/.local/bin/composer" --version

以後はphp8.3 "$HOME/.local/bin/composer"で実行します。既定のphpやPATHの設定に依存させず、Composer自身も対応PHPで動かします。失敗を--ignore-platform-reqs等で回避しません。

04 / 準備完了を判断する

確認先へ進める状態
PHPLaravelの対応する8.3系、必要拡張が導入されている
FPMphp8.3-fpmが起動・自動起動し、8.3専用ソケットがある
Composer公式インストーラーのSHA-384が一致し、一般管理者で実行できる
既存環境既定CLIと既存FPMへの影響を確認し、復旧用の記録がある

準備ができたらLaravelアプリの作成へ進みます。まだ開発用サーバーやWeb公開の設定は行いません。

参考:実行結果と撮影条件

Ubuntu Server 22.04.5の実VMでPHP 8.3.36とComposer 2.11.1を導入しました。PPAの主鍵指紋をLaunchpad APIと照合し、専用signed-by鍵・優先度100の設定でAPT導入が終了コード0でした。Composerインストーラーは公開されたSHA-384ダイジェストとの一致を確認し、一般ユーザーで実行しました。PHP 8.1-FPMと8.3-FPMの起動を確認し、検証では既存CLIの選択を明示的に8.1へ戻して、Laravelのコマンドをphp8.3で実行しています。パッケージ導入が既存環境へ無影響という保証ではありません。

Laravel用PHPとComposerの実行確認画面
Ubuntu Serverの検証用VMで取得した実画面を掲載します。

05 / 問題時の対処と変更を戻す範囲

APTで問題が出たら、追加したソース・鍵・パッケージの提供元とエラーを調べます。リポジトリ設定を戻すだけでは、導入済みのPHPや共有パッケージまで元に戻りません。既存アプリに影響した場合はバックアップ・パッケージ履歴と構成を照合し、保守時間に復旧してください。使用中のPHPを一括削除しません。

Composerだけを戻す場合は、この手順で作ったユーザー用ファイルであることを確認して退避します。プロジェクトの依存はcomposer.lockで管理するため、Composerを消しただけでアプリや依存が元に戻るわけではありません。秘密情報を含む設定・鍵はGitや公開領域へ入れないでください。