Ubuntu 22.04でのApache2インストール・設定完全ガイド — AからZまで

Development tutorial - IT technology blog
Development tutorial - IT technology blog

初めて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エラー?エラーログに具体的なエラー行が記録されている——推測で悩む必要はない。

標準的な作業手順のまとめ

  1. Apache2をインストール → サービスを有効化
  2. UFWでファイアウォールを開放(Apache Full
  3. 適切なパーミッションでWebサイトのディレクトリを作成
  4. sites-available.confファイルを作成
  5. a2ensiteでサイトを有効化し、設定を確認してリロード
  6. 必要なモジュールを有効化(rewritesslなど)
  7. CertbotでSSLを設定

Apache2は多くの人が思うほど難しくない。「アクセスできない」ケースのほとんどは、UFWがポートを開放していないか、バーチャルホストが有効化されていないだけだ。まずその2点を確認してから、より複雑な原因の調査に移るといい。

Share: