初めてWebをデプロイしたときに直面した問題
Linuxサーバーを使い始めたころ、PHPプロジェクトをUbuntuのVPSにデプロイして、IPアドレスにアクセスするとApacheのデフォルトページが表示されるのに、自分のプロジェクトが見当たらないという状況に陥ったことがある。半日近く悩んでようやく気づいた:Apacheをインストールするだけでは不十分で、バーチャルホストの設定、ディレクトリのパーミッション設定、そしてファイアウォールで正しいポートを開放する必要があるということを。
本番環境で約6ヶ月間Apache2を運用してきた——5人の開発チームのWebアプリを含む——その過程で、公式ドキュメントには載っていない「やりがちなミス」をひと通り経験した。この記事は実際に使っているワークフローであり、マニュアルのコピーではない。
なぜApache2は最初からトラブルを引き起こすのか?
Apache自体が複雑なわけではない。Ubuntu 22.04には古いバージョンからの変更点がいくつかあり、多くのチュートリアルがまだ追いついていない:
- UFWはデフォルトでポート80/443をブロック — Apacheをインストールしてもファイアウォールがトラフィックをブロックし続ける。
/etc/apache2/のディレクトリ構造はsites-available/sites-enabledシステムを採用しており、多くの古いドキュメントの記述とは全く異なる。- PHP-FPM vs mod_php — PHP 7.4以降、UbuntuはPHP-FPMを推奨しているが追加設定が必要で、以前のように自動ではない。
この3点を理解すれば、Apacheが「動いているのに動かない」理由の80%が解決できる。
Apache2のインストール
パッケージリストを更新してからインストール:
sudo apt update
sudo apt install apache2 -y
Apacheが起動しているか確認:
sudo systemctl status apache2
active (running)と表示されれば問題なし。failedと表示された場合は、sudo journalctl -xeで具体的な原因を確認する。再起動時の自動起動を有効化:
sudo systemctl enable apache2
UFWで正しくファイアウォールを開放する
これが最も見落とされがちなステップだ。ApacheはUFW用のプロファイルをあらかじめ用意している:
# 利用可能なプロファイルを表示
sudo ufw app list
# HTTPとHTTPSを許可
sudo ufw allow 'Apache Full'
# HTTPのみ必要な場合
sudo ufw allow 'Apache'
# UFWが無効な場合は有効化
sudo ufw enable
sudo ufw status
このステップが完了したら、ブラウザにサーバーのIPアドレスを入力すると「Apache2 Ubuntu Default Page」が表示される——すべてが正常に動作していることの確認だ。
バーチャルホストの設定 — Ubuntuの標準的な方法
/etc/apache2/apache2.confを直接編集する人をよく見かけるが、これは誤った方法だ。Ubuntuでは、各WebサイトはそれぞれのWebサイトが/etc/apache2/sites-available/内に専用の設定ファイルを持つべきだ。
Webサイト用ディレクトリの作成
sudo mkdir -p /var/www/mywebsite.com/public
sudo chown -R $USER:$USER /var/www/mywebsite.com
sudo chmod -R 755 /var/www/mywebsite.com
バーチャルホスト設定ファイルの作成
sudo nano /etc/apache2/sites-available/mywebsite.com.conf
ファイルの内容:
<VirtualHost *:80>
ServerName mywebsite.com
ServerAlias www.mywebsite.com
ServerAdmin [email protected]
DocumentRoot /var/www/mywebsite.com/public
<Directory /var/www/mywebsite.com/public>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/mywebsite.com-error.log
CustomLog ${APACHE_LOG_DIR}/mywebsite.com-access.log combined
</VirtualHost>
サイトの有効化とApacheのリロード
# 新しいサイトを有効化
sudo a2ensite mywebsite.com.conf
# デフォルトサイトが不要な場合は無効化
sudo a2dissite 000-default.conf
# 設定ファイルの構文チェック
sudo apache2ctl configtest
# Apacheをリロード
sudo systemctl reload apache2
apache2ctl configtestは、リロード前に必ず実行するようにしている——設定の構文エラーによってApacheがクラッシュするのを防ぐためだ。
必要なモジュールの有効化
Ubuntu上のApache2は、a2enmodコマンドでモジュールを有効化する。よく使うモジュール:
# WordPress/Laravelで.htaccessを使う場合は必須
sudo a2enmod rewrite
# SSL
sudo a2enmod ssl
# 静的ファイルのgzip圧縮
sudo a2enmod deflate
# ヘッダーセキュリティ
sudo a2enmod headers
sudo systemctl restart apache2
5人の開発チームのプロジェクトでは、この4つのコマンドをサーバーのブートストラップスクリプトにまとめている。一度実行するだけで済み、開発環境と本番環境でモジュールが食い違って丸一日デバッグする、という事態を防げる。
Let’s EncryptでSSLを設定する
ドメインがすでにサーバーに向いているなら、Certbotが最も手軽だ:
sudo apt install certbot python3-certbot-apache -y
sudo certbot --apache -d mywebsite.com -d www.mywebsite.com
Certbotは自動的に.confファイルを編集し、SSLポート443の設定を追加して、HTTPからHTTPSへのリダイレクトを設定する。証明書の有効期限は90日だが、systemdタイマーによる自動更新がすでに設定されている:
# 自動更新タイマーを確認
sudo systemctl status certbot.timer
# 更新のテスト実行
sudo certbot renew --dry-run
1台のVPSで複数のWebサイトを管理する
同じVPS上で複数のプロジェクトを運用した経験から、次のような構造にまとめた:
/var/www/
├── site1.com/
│ └── public/ # DocumentRoot
├── site2.com/
│ └── public/
└── site3.com/
└── public/
/etc/apache2/
├── sites-available/
│ ├── site1.com.conf
│ ├── site2.com.conf
│ └── site3.com.conf
└── sites-enabled/ # シンボリックリンクのみ。ここに直接ファイルを作成しない
原則として、ドメインごとに独立した設定ファイルを持ち、a2ensite/a2dissiteで有効・無効を切り替える——sites-enabledを直接編集することは絶対にしない。
エラー発生時のログ確認
Apacheのエラーに直面したとき、10回中9回は答えがエラーログに書かれている:
# リアルタイムでエラーを確認
sudo tail -f /var/log/apache2/error.log
# ドメイン別ログを確認(カスタムログ設定済みの場合)
sudo tail -f /var/log/apache2/mywebsite.com-error.log
# アクセスログを確認
sudo tail -f /var/log/apache2/mywebsite.com-access.log
403 Forbiddenエラー?たいていはディレクトリのパーミッションが間違っているか、設定ファイルにAllowOverride Allが抜けている。500エラー?エラーログに具体的なエラー行が記録されている——推測で悩む必要はない。
標準的な作業手順のまとめ
- Apache2をインストール → サービスを有効化
- UFWでファイアウォールを開放(
Apache Full) - 適切なパーミッションでWebサイトのディレクトリを作成
sites-availableに.confファイルを作成a2ensiteでサイトを有効化し、設定を確認してリロード- 必要なモジュールを有効化(
rewrite、sslなど) - CertbotでSSLを設定
Apache2は多くの人が思うほど難しくない。「アクセスできない」ケースのほとんどは、UFWがポートを開放していないか、バーチャルホストが有効化されていないだけだ。まずその2点を確認してから、より複雑な原因の調査に移るといい。

