Ubuntu 22.04 Server / Apache・PHP・MariaDBをインストールする方法
Ubuntu 22.04 Serverでは、Apache、PHP用Apacheモジュール、MariaDB、PHPのデータベース拡張をインストールすると、基本的なWeb実行環境を構築できます。導入後はMariaDBの管理者アカウントとWebアプリのアカウントを分け、PHPからデータベースの値を読み出せることを確認します。
対象構成とパッケージの準備
この記事では、Ubuntu 22.04の標準リポジトリを使う新しいサーバー1台でApacheとMariaDBを動かします。sudo権限とパッケージ取得用のインターネット接続が必要です。既存サーバーではWeb設定とデータベースを先にバックアップし、例と同名のファイル・アカウント・データベースがないか確認してください。すでにPHP-FPMを使っている場合は、このApacheモジュール方式を混在させないでください。
- パッケージ一覧を更新し、必要な構成要素をインストールします。
libapache2-mod-phpがApache内でPHPを処理し、php-mysqlがMariaDB接続用の拡張を提供します。コマンドラインでの確認に使うphp-cliも導入します。構成方法はUbuntuのPHPインストール文書で確認できます。
sudo apt update
sudo apt install apache2 mariadb-server php php-cli libapache2-mod-php php-mysql
- サービスを起動し、OS起動時の自動実行を有効にします。Apacheの設定検査で
Syntax OKと表示されることを確認してから、Apacheを再起動してPHPモジュールを反映します。
sudo systemctl enable --now apache2 mariadb
sudo apache2ctl configtest
sudo systemctl restart apache2
systemctl is-active apache2 mariadb
最後のコマンドは、稼働中のサービスごとにactiveを表示します。導入済みのバージョンはapache2 -v、php -v、mariadb --versionで確認できます。追加リポジトリを使うサーバーでは、標準とは異なるPHPバージョンが入る場合があります。
MariaDB管理者の認証を確認する
Ubuntu標準のMariaDBパッケージでは、通常、ローカル管理者にUnixソケット認証を使います。これはOSのユーザー識別情報を確認する方式であり、rootのパスワードが空なら誰でも接続できるという意味ではありません。次のコマンドで管理者セッションを開き、現在のアカウントと設定を確認します。
sudo mariadb --protocol=socket
SELECT VERSION(), CURRENT_USER();
SHOW CREATE USER 'root'@'localhost';
EXIT;
rootの認証方式は既存の設定によって異なります。この例では、MariaDB 10.4以降の認証に関する説明を踏まえ、ソケット認証を維持しながら別のアプリアカウントを作成します。mysql.userのplugin値を直接UPDATEしたり、Webアプリにrootアカウントを設定したりしません。
初期導入時のセキュリティ項目は、次のツールで点検できます。質問の文言や順序はバージョンと現在の設定によって変わるため、すべてに機械的にYを入力しないでください。
sudo mariadb-secure-installation
- すでにソケット認証で管理している場合は、その方式を維持できます。MariaDB公式ツールの説明によれば、この構成では通常、rootのパスワードを新たに設定する必要はありません。
- 新しいサーバーでは、匿名ユーザーと不要なtestデータベースの削除、リモートrootログインの制限が適切です。既存サービスがある場合は利用状況を確認してから判断し、権限テーブルの再読み込みを尋ねられたら変更を反映します。
アプリ専用のデータベースとアカウントを作成する
再びsudo mariadb --protocol=socketで接続し、次のSQLを実行します。lampdemoとlamp_appは、この実習で新規作成する名前です。すでに存在する場合は上書きや削除をせず、別の名前を決めて以降の例でも統一してください。パスワードの仮の値を長く固有のパスワードに置き換え、PHP設定にも同じ値を使います。シングルクォートを含む場合は、SQLとPHPそれぞれの文字列エスケープ規則に従ってください。
CREATE DATABASE lampdemo CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'lamp_app'@'localhost' IDENTIFIED BY 'REPLACE_WITH_A_LONG_UNIQUE_PASSWORD';
GRANT SELECT, INSERT, UPDATE, DELETE ON lampdemo.* TO 'lamp_app'@'localhost';
CREATE TABLE lampdemo.health_check (
id INT PRIMARY KEY,
message VARCHAR(100) NOT NULL
);
INSERT INTO lampdemo.health_check (id, message) VALUES (1, 'database-ok');
EXIT;
テーブルは管理者が作成し、アプリにはこのデータベースの参照・追加・更新・削除権限のみを付与します。アプリのインストーラーがテーブル作成権限を要求する場合は、必要な権限を別途検討します。GRANTで付与した後に、別途FLUSH PRIVILEGESを実行する必要はありません。
ターミナルからアプリアカウントで問い合わせ、database-okが表示されるか確認します。-pの直後にパスワードを書かず、入力を求められたときに入力します。
mariadb --protocol=socket -u lamp_app -p lampdemo -e "SELECT message FROM health_check WHERE id=1;"
PHP連携用のサンプルファイルを作成する
Ubuntu Apacheの標準サイトの公開ディレクトリは通常/var/www/htmlです。既存の仮想ホストではsudo apache2ctl -Sと対象サイトのDocumentRootを確認し、Webファイルのパスを合わせてください。以下のファイルが存在する場合は別名にします。パスワードを含む設定ファイルは公開ディレクトリの外に保存します。
- 設定用ディレクトリを作り、エディターを開きます。以下の権限は、ApacheがUbuntu標準のユーザー・グループ
www-dataで動作する構成を前提としています。
sudo install -d -o root -g www-data -m 0750 /etc/lamp-demo
sudoedit /etc/lamp-demo/database.php
/etc/lamp-demo/database.phpに次の内容をすべて保存します。passwordは先ほど設定したアプリ用パスワードに置き換えます。PHPのPDO_MYSQL接続の説明のとおり、Unixではhost=localhostがソケット接続を使います。127.0.0.1に変えるとTCP接続となり、アカウントの照合や接続条件が変わる場合があります。
<?php
return [
'dsn' => 'mysql:host=localhost;dbname=lampdemo;charset=utf8mb4',
'user' => 'lamp_app',
'password' => 'REPLACE_WITH_A_LONG_UNIQUE_PASSWORD',
];
- 設定ファイルはroot所有とし、所有者とApacheグループだけが読めるようにします。続いてWeb確認ファイルを開きます。
sudo chown root:www-data /etc/lamp-demo/database.php
sudo chmod 0640 /etc/lamp-demo/database.php
sudoedit /var/www/html/lamp-check.php
/var/www/html/lamp-check.phpに次の内容をすべて保存します。PDO(PHP Data Objects)はPHPからデータベースにアクセスするためのインターフェースです。このコードは実際のテーブル値を確認してから成功メッセージを出力します。失敗時はHTTP 500と一般的なエラー文を返し、詳細をサーバーログに記録します。
<?php
declare(strict_types=1);
header('Content-Type: text/plain; charset=UTF-8');
try {
$config = require '/etc/lamp-demo/database.php';
$pdo = new PDO($config['dsn'], $config['user'], $config['password'], [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
]);
$message = $pdo->query('SELECT message FROM health_check WHERE id = 1')->fetchColumn();
if ($message !== 'database-ok') {
throw new RuntimeException('Unexpected database result');
}
echo "PHP OK\nDatabase OK\n";
} catch (Throwable $e) {
http_response_code(500);
error_log('lamp-check failed: ' . $e->getMessage());
echo "Check failed; review server logs.\n";
}
- Web確認ファイルを読み取り可能にし、両ファイルのPHP構文を検査します。
No syntax errors detectedは構文検査の結果であり、データベース接続の成功を示すものではありません。
sudo chown root:root /var/www/html/lamp-check.php
sudo chmod 0644 /var/www/html/lamp-check.php
sudo php -l /etc/lamp-demo/database.php
php -l /var/www/html/lamp-check.php
設定ファイルは一般ユーザーでは読めない場合があるため、その構文検査はsudoで実行します。Webディレクトリ全体に書き込み権限を与えたり、chmod 777を適用したりする必要はありません。
HTTP応答とデータベース接続を確認する
サーバー自身から次のURLを要求します。curlがない場合はsudo apt install curlで導入します。HTTPステータスが200で、本文に次の2行が出れば、ApacheがPHPを実行し、PHPがMariaDBのサンプル行を読み出せています。
curl -i http://127.0.0.1/lamp-check.php
PHP OK
Database OK
別のパソコンでは、ブラウザーにhttp://SERVER-IP/lamp-check.phpを入力します。仮想ホストでは設定済みのホスト名を使ってください。標準の歓迎ページが表示されるだけ、またはphp -vを実行するだけでは、この連携を確認できません。
サーバー内では接続できるのに外から接続できない場合は、sudo ufw status verbose、クラウドのセキュリティグループ、ルーティングを確認します。UFWがすでに有効なプライベート実習ネットワークなら、以下のように対象サブネットからのHTTP 80番だけを許可できます。192.168.10.0/24は自分の信頼できるサブネットに置き換えます。このテストのためにファイアウォールを無効化したり、リモートSSHを許可せず新たに有効化したりしないでください。
sudo ufw allow from 192.168.10.0/24 to any port 80 proto tcp
PHPとMariaDBは同一サーバーのソケットで通信するので、3306番ポートを外部に公開する必要はありません。HTTPの実習は信頼できる環境で行い、本番でログイン情報などを送受信する前に、ドメイン・仮想ホスト・HTTPS証明書を別途構成してください。
エラーの調査とテストの後片付け
接続失敗は、サービス状態、PHPモジュール、アカウント、ファイル権限の順に絞り込みます。次のコマンドでApacheの設定・モジュールと両サービスの最近のログを確認します。ログには運用情報が含まれる場合があるため、そのまま公開しないでください。
sudo apache2ctl configtest
sudo apache2ctl -M
sudo tail -n 50 /var/log/apache2/error.log
sudo journalctl -u apache2 -u mariadb -n 50 --no-pager
- PHPソースが表示・ダウンロードされる場合:公開アクセスを止め、ApacheのPHPモジュールが有効か、再起動済みかを確認します。
libapache2-mod-php導入後も直らない場合は、既存のPHP-FPMや仮想ホスト設定も調べます。 - could not find driver:Apacheが使用するPHPバージョンに合った
php-mysql拡張が導入・有効化されているか確認し、Apacheを再起動します。CLIのPHPとApacheのPHPは設定が異なる場合があります。 - Access denied:アプリのパスワード、
'lamp_app'@'localhost'アカウント、権限を確認します。root認証の変更やグローバル権限の付与で回避しないでください。ソケットが見つからない場合は、MariaDBのSHOW VARIABLES LIKE 'socket';の結果とPHPのソケット設定を比較します。 - Permission deniedまたは404:Apacheユーザーが設定ファイルを読めるか、Webファイルが要求先サイトのDocumentRootにあるか確認します。
/etc/lamp-demoのディレクトリアクセス権限も確認してください。
確認後は、次のコマンドでこの記事で作成したWebテストファイルだけを削除し、同じURLで成功メッセージが返らないことを確かめます。既存のphpinfo.phpなど環境情報を公開するファイルも残さないでください。実際のアプリで設定ファイルを使う場合は、公開ディレクトリ外で制限された権限を維持します。
sudo rm -- /var/www/html/lamp-check.php
実習データも削除する場合は、他のサービスが使っていないことを確認してから管理者セッションで次のSQLを実行します。データベースの削除は取り消せないため、必要なデータは先にバックアップします。この実習で新規作成した名前だけを対象にしてください。
DROP DATABASE lampdemo;
DROP USER 'lamp_app'@'localhost';
同一サーバー構成ではMariaDBのローカルバインド設定を維持します。別途リモート接続が必要でも、bind-addressを無条件に削除せず、待ち受けアドレス、許可する接続元、専用アカウント、暗号化接続をまとめて設計してください。



