LAMP Stackとは何か、いつ必要になるのか?
Webバックエンドの学習を始めたばかりの方や、PHPアプリケーションをサーバーにデプロイするタスクを受けたばかりの方なら、LAMP Stackが必要になる可能性が高いです。これはLinux + Apache + MySQL + PHPの4つで構成される組み合わせで、WordPress、Laravel、Drupalをはじめ、数百ものPHPアプリケーションの基盤となっています。Apacheだけで世界のWebサーバー市場の約30%を占めているため、LAMPを構築できるスキルは非常に実用的です。
私は会社のステージング環境(Ubuntu 22.04)でLAMPを使い、本番環境にプッシュする前にconfigをテストしていました。身に染みた教訓:正しい順序でインストールし、最初から正しく設定すること。逆にやると、本来なら時間をかけるべきでないデバッグに午後を丸ごと費やすことになります。
この記事でNginxではなくApacheを選んだのは、多くのレガシーPHPプロジェクトがmod_rewriteと.htaccessモジュールを必要とするからです。Nginxのインストール方法をお探しの方は、ブログに別の記事があります。
各コンポーネントのインストール
1. システムのアップデート
何かをインストールする前に、必ずパッケージリストをアップデートしてください。このステップを省略すると、後でバージョンの競合が発生しやすくなります:
sudo apt update && sudo apt upgrade -y
2. Apacheのインストール
sudo apt install apache2 -y
完了したら、起動と自動起動を有効化します:
sudo systemctl start apache2
sudo systemctl enable apache2
UFWを使用している場合は、ポート80を開きます:
sudo ufw allow 'Apache'
sudo ufw reload
ブラウザでhttp://<IP-server>にアクセスしてください。「Apache2 Ubuntu Default Page」が表示されれば問題ありません。
3. MySQLのインストール
sudo apt install mysql-server -y
セキュリティスクリプトを実行します。これは重要なので、省略しないでください:
sudo mysql_secure_installation
スクリプトがいくつかの質問をしてきます。本番環境では、私は常に以下のように回答しています:
- VALIDATE PASSWORD component: Y(パスワード強度チェックを有効化)
- Remove anonymous users: Y
- Disallow root login remotely: Y
- Remove test database: Y
- Reload privilege tables: Y
MySQLにログインして動作確認します:
sudo mysql -u root -p
4. PHPのインストール
Ubuntu 22.04はデフォルトリポジトリにPHP 8.1が含まれています。よく使うextensionも一緒にインストールしましょう:
sudo apt install php libapache2-mod-php php-mysql php-cli php-curl php-gd php-mbstring php-xml php-zip -y
これらのextensionが必要な理由を簡単にまとめます:
php-mysql— PHPとMySQL/MariaDBの接続php-mbstring— マルチバイト文字列の処理(日本語、ベトナム語などに必要)php-xml— XMLの処理。多くのPHPフレームワークはこれがないと動作しませんphp-zip— WordPressがプラグインのインストールやアップデート時に使用
バージョンを確認します:
php -v
詳細設定
アプリケーション用のVirtual Hostを作成する
デフォルトの/var/www/htmlにコードを置くのは、簡単なテスト時のみ適しています。プロジェクトごとに別々のVirtual Hostを作成するようにしています。こうすることで、同じサーバー上で複数のWebサイトを干渉せずに並行稼働できます。
プロジェクトディレクトリを作成し、権限を設定します:
sudo mkdir -p /var/www/myapp/public
sudo chown -R $USER:$USER /var/www/myapp/public
sudo chmod -R 755 /var/www/myapp
新しいVirtual Hostの設定ファイルを開きます:
sudo nano /etc/apache2/sites-available/myapp.conf
以下の内容を入力します:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName myapp.local
DocumentRoot /var/www/myapp/public
<Directory /var/www/myapp/public>
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/myapp-error.log
CustomLog ${APACHE_LOG_DIR}/myapp-access.log combined
</VirtualHost>
サイトとmod_rewriteモジュールを有効化します。LaravelとWordPressはどちらもこれが必要です:
sudo a2ensite myapp.conf
sudo a2enmod rewrite
sudo systemctl restart apache2
アプリケーション用のデータベースとMySQLユーザーを作成する
アプリケーションからrootで接続するのは絶対に避けてください。最小権限の原則に従って専用ユーザーを作成します:
sudo mysql -u root -p
CREATE DATABASE myapp_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'myapp_user'@'localhost' IDENTIFIED BY 'StrongPassword123!';
GRANT ALL PRIVILEGES ON myapp_db.* TO 'myapp_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;
注意:utf8mb4をutf8の代わりに使用して、絵文字を含む完全なUnicodeをサポートしてください。WordPressには以前、utf8文字セットが3バイトしかサポートしないのに対し絵文字は4バイト必要なため、絵文字の保存に失敗するバグがありました。
本番環境向けのPHP設定を調整する
ApacheのPHP設定ファイルは/etc/php/8.1/apache2/php.iniにあります。インストール後すぐにこれらのパラメータを調整することが多いです:
sudo nano /etc/php/8.1/apache2/php.ini
nanoでCtrl+Wを使って各行をすばやく検索し、以下のように修正します:
; アップロードファイルサイズの制限(必要に応じて調整)
upload_max_filesize = 64M
post_max_size = 64M
; アプリケーションが重い場合はメモリ制限を増やす
memory_limit = 256M
; 最大実行時間(秒)
max_execution_time = 60
; 本番環境ではエラー表示を無効化(開発時は有効化)
display_errors = Off
log_errors = On
error_log = /var/log/php_errors.log
保存後、設定を反映するためにApacheを再起動します:
sudo systemctl restart apache2
テストとモニタリング
PHPの動作テスト
phpinfo.phpファイルを作成して確認します:
sudo nano /var/www/myapp/public/phpinfo.php
<?php
phpinfo();
?>
http://<IP-server>/phpinfo.phpにアクセスすると、PHPの詳細情報ページが表示されます。インストールしたextension(mysql、mbstring、xmlなど)が表示されているか確認してください。
確認後は必ず削除してください — このファイルを公開したままにするのは深刻なセキュリティホールです。攻撃者はこのファイルを見ることでサーバーの全設定を把握できます:
sudo rm /var/www/myapp/public/phpinfo.php
PHP → MySQL接続の確認
データベース接続テストファイルを作成します:
<?php
$conn = new mysqli('localhost', 'myapp_user', 'StrongPassword123!', 'myapp_db');
if ($conn->connect_error) {
die('接続エラー: ' . $conn->connect_error);
}
echo 'MySQL接続成功!サーバーバージョン: ' . $conn->server_info;
$conn->close();
?>
「MySQL接続成功」と表示されれば、LAMP Stackがエンドツーエンドで動作しています。確認後はこのテストファイルを忘れずに削除してください。
ブックマークしておくべき3つのサービス確認コマンド
チームに「デプロイ完了」と報告する前に、いつもこれらをすばやく実行します:
# Apacheの確認
sudo systemctl status apache2
# MySQLの確認
sudo systemctl status mysql
# Apacheログをリアルタイムで確認
sudo tail -f /var/log/apache2/error.log
# MySQLログを確認
sudo tail -f /var/log/mysql/error.log
または、よりシンプルなワンライナーを使います:
for svc in apache2 mysql; do
echo -n "$svc: "
systemctl is-active $svc
done
両方がactiveと表示されれば問題ありません。
リスニングポートの確認
sudo ss -tlnp | grep -E '(:80|:443|:3306)'
Apacheはポート80、MySQLはポート3306です。MySQLは127.0.0.1のみにバインドしていることに注意してください。これはデフォルトの安全な設定で、インターネットへの公開を防いでいます。
よくあるエラーと対処法
- Apacheが起動しない:まず
sudo apachectl configtestを実行してください。最も多い原因は設定のシンタックスエラーです。括弧の不足や、ポート80が別のプロセスに占有されているケースが典型的です。 - PHPのextensionが読み込めない:
/etc/php/8.1/apache2/conf.d/を確認してください。各extensionには個別の.iniファイルがあります。php -m | grep mysqlで素早く確認できます。 - MySQLが接続を拒否する:よくある混乱がここにあります。
'user'@'localhost'と'user'@'127.0.0.1'はMySQLでは別々のユーザーとして扱われます。ユーザー作成時のホスト指定を確認してください。

