Webサーバーを選ぶ
WEB SERVER / APACHE

ApacheでWebページとPHPを配信する

Apacheを選ぶ場合の手順です。専用サイトのHTTP表示と、PHP-FPMの実行を確認します。

01 / 構成と競合を確認する

Ubuntu Server 22.04へ、Apacheを新規導入する手順です。物理機・仮想機で操作は共通です。管理接続、ファイアウォール、更新とバックアップを済ませ、sudoと復旧コンソールを確保します。

Nginx・Apache・Caddyは、この構成では同時に80・443番を使う選択肢ではありません。Apacheだけを使う新規の専用サーバーを前提にします。既存のWebサイト、リバースプロキシ、コンテナーがある場合は作業を中断し、移行・ポート分担・保守時間を先に設計してください。既存サービスを無条件に停止するコマンドは掲載していません。

sudo ss -ltnp
sudo ufw status verbose
sudo test ! -e /var/www/apache-guide
sudo test ! -e /etc/apache2/sites-available/server-guide.conf

80・443番が使われていないことと、新規サイト名が既存データと衝突しないことを確認します。以降はサーバーの一般管理者で実行します。SERVER_IPは別端末から到達できるサーバーのアドレス、CLIENT_IPはサーバーから見える確認用端末の送信元IPへ置き換えてください。

到達点はHTTPの静的ページとPHP実行です。認証情報を扱うアプリをインターネット上のHTTPで公開しません。実ドメインを使ったApacheのHTTPS化は、このページの動作確認には含めません。Caddyも別の選択肢として比較できます。

02 / Apacheとサイト用ファイルを用意する

sudo apt-get update && sudo apt-get install apache2 curl
sudo systemctl enable --now apache2
systemctl is-active apache2
systemctl is-enabled apache2
sudo apache2ctl -M

署名・取得エラーを無視せず、サービスがactive・enabledであることを確認します。今回のPHP連携はevent MPMとPHP-FPMを使います。mpm_event_moduleが読み込まれているか確認してください。既存のlibapache2-mod-phpやprefork MPMからの切り替えは対象外なので、異なる構成ならここで止めて調査します。

配信ファイルはroot所有にし、Webプロセスへコードの書き込み権限を渡しません。既存パスがあって検査に失敗したら、そのまま続けないでください。

sudo test ! -e /var/www/apache-guide &&
sudo install -d -o root -g root -m 755 /var/www/apache-guide/public
sudo test ! -e /var/www/apache-guide/public/index.html &&
printf '%s\n' '<!doctype html><html lang="ja"><meta charset="utf-8"><title>Apache Guide</title><h1>Apache is ready</h1></html>' | sudo tee /var/www/apache-guide/public/index.html >/dev/null
sudo chown root:root /var/www/apache-guide/public/index.html
sudo chmod 644 /var/www/apache-guide/public/index.html

03 / 専用サイトへ切り替える

設定をWeb公開領域の外へ退避し、保存先を控えます。

BACKUP="$(sudo mktemp -d /root/server-guide-apache.XXXXXX)" &&
sudo cp -a /etc/apache2 "$BACKUP/"
printf '保存先: %s\n' "$BACKUP"

以下のapache-guide.testはHTTP確認用の名前です。この記述だけでDNSが作られるわけではありません。ほかのサイトを無効にした専用構成では、IPアドレス宛のアクセスもこのVirtualHostで扱います。本番でドメインを使う場合は、所有する実際の名前とDNSへ合わせます。

sudo test ! -e /etc/apache2/sites-available/server-guide.conf &&
sudo tee /etc/apache2/sites-available/server-guide.conf >/dev/null <<'EOF'
<VirtualHost *:80>
    ServerName apache-guide.test
    DocumentRoot /var/www/apache-guide/public
    DirectoryIndex index.php index.html

    <Directory /var/www/apache-guide/public>
        Options -Indexes -FollowSymLinks
        AllowOverride None
        Require all granted
    </Directory>

    <LocationMatch "(^|/)\.">
        Require all denied
    </LocationMatch>

    ErrorLog ${APACHE_LOG_DIR}/server-guide-error.log
    CustomLog ${APACHE_LOG_DIR}/server-guide-access.log combined
</VirtualHost>
EOF
sudo a2dissite 000-default &&
sudo a2ensite server-guide &&
sudo apache2ctl configtest && sudo systemctl reload apache2

ここで無効にするのはUbuntu標準の000-defaultだけです。ほかのサイトをまとめて無効にしません。Syntax OKを確認してから再読み込みします。グローバルのServerNameが未設定の場合、AH00558のFQDN警告が出ることがあります。これは構文エラーとは別ですが、ほかの警告や応答結果も読み、名前の設定を運用方針に合わせて確認してください。エラーがあれば反映せず修正してください。sudo apache2ctl -Sで、専用のVirtualHostと対象ファイルを確認できます。

curl --fail --show-error http://127.0.0.1/
sudo apache2ctl -S

Apache is readyを含むHTMLが返ることを確認します。Indexesを無効にしているため、ディレクトリーのファイル一覧を公開しません。AllowOverride Noneでは.htaccessによる上書きを許可しない構成です。CMS等で別の設定が必要になっても、無条件にAllowOverride Allへ変更しません。

04 / PHP-FPMと連携する

静的ページが表示できたら、Ubuntu 22.04公式リポジトリのPHP 8.1を導入します。PHP 8.1の上流保守は終了しており、Ubuntu提供の更新とアプリの対応範囲を別々に確認する必要があります。最新版PHPを導入する手順ではありません。

sudo apt-get update && sudo apt-get install php8.1-fpm php8.1-cli
sudo systemctl enable --now php8.1-fpm
sudo a2enmod proxy_fcgi setenvif &&
sudo a2enconf php8.1-fpm &&
sudo apache2ctl configtest && sudo systemctl reload apache2
systemctl is-active php8.1-fpm
sudo ls -l /run/php/php8.1-fpm.sock

Apache付属のPHP-FPM設定がUnixソケットへ処理を渡します。libapache2-mod-phpは追加しません。FPMの9000番ポートを外部へ開く必要もありません。Apacheの構文検査とFPM起動に成功してから、短い一時ファイルを作成します。phpinfo()は使いません。

sudo test ! -e /var/www/apache-guide/public/health.php &&
sudo tee /var/www/apache-guide/public/health.php >/dev/null <<'PHP'
<?php
header('Content-Type: text/plain; charset=UTF-8');
echo 'PHP ' . PHP_VERSION . "\n";
PHP
sudo chown root:root /var/www/apache-guide/public/health.php
sudo chmod 644 /var/www/apache-guide/public/health.php
curl --fail --show-error http://127.0.0.1/health.php

PHP 8.1...が返り、<?phpから始まるソースやファイルのダウンロードにならないことを確認します。ソースが見えたら公開を止め、読み込まれたモジュール・FPM用conf・対象サイトを調べます。確認用端末のHTTP許可を次節に従って用意し、別端末でもhttp://SERVER_IP/health.phpで同じ実行結果を確認してから削除します。確認後はファイルを残しません。

sudo rm /var/www/apache-guide/public/health.php
curl -sS -o /dev/null -w '%{http_code}\n' http://127.0.0.1/health.php
curl -sS -o /dev/null -w '%{http_code}\n' http://127.0.0.1/server-guide-missing.php

FPMが稼働した状態で、削除済みファイルと存在しないPHPが404になることを確認します。CLIのphp -vだけでApache経由の実行成功とは判断しません。既存のPHPページはNginx用です。Nginxのfastcgi_passやlocationをApacheへ貼り付けないでください。

05 / 別端末から確認し、ログと戻し方を把握する

UFWが有効なら、SSHの許可を保持したまま、確認用端末だけのHTTP受信を許可します。クラウド側FW・ルーター・NAT/仮想ネットワークも確認してください。

sudo ufw allow from CLIENT_IP to any port 80 proto tcp
sudo ufw status numbered

別端末でhttp://SERVER_IP/を開き、同じ静的ページを確認します。PHPも別端末で確認する場合は、一時ファイルがある間にhttp://SERVER_IP/health.phpを試し、必ず削除後の404まで確認してください。次のcurlは別端末で実行します。

curl --fail --show-error http://SERVER_IP/

接続できなければ、サーバー内HTTP、待受・サービス、サーバーFW、外側の経路の順に調べます。PHP側のエラーはFPM状態、ソケット、モジュール・confを確認します。ソケットやサイト全体を777にして解決しません。

sudo apache2ctl configtest
sudo apache2ctl -M
sudo journalctl -u apache2 -u php8.1-fpm -b --no-pager
sudo tail -n 50 /var/log/apache2/server-guide-error.log

この新規サイトだけを戻す場合は、先に確認用PHPを削除し、追加したサイトを無効にします。変更前の有効サイトと設定をバックアップに照合して戻し、sudo apache2ctl configtest && sudo systemctl reload apache2を実行します。Apacheを使わなくなる場合も、他の運用サイトがないことを確認してから停止・無効化を判断します。FWは自分で追加したHTTP許可だけを戻し、SSH許可を消しません。

インターネット公開にはドメイン・HTTPSと運用設計が必要です。ApacheのTLSはmod_ssl等の構成で、CertbotもApache用プラグインが別途必要です。既存のHTTPSページはNginx用なので、--nginxやNginxの証明書設定を流用しません。参考:ApacheのVirtualHost、mod_proxy_fcgi、ApacheのTLS。

参考:動作確認と撮影条件

Ubuntu Server 22.04.5の実VMでApache 2.4.52・PHP 8.1.2-1ubuntu2.28を使用しました。構文検査、active・enabled、event MPMとproxy_fcgi、サーバー内と別クライアントからのHTTP 200・PHP実行を確認しました。FPM停止時は503でソース非露出、復旧後は実行再開、隠しPHPパスは403でした。確認用PHPの削除後と存在しないPHPは404、Apache再起動後も静的ページを確認しています。接続はQEMU NAT転送経由で、公開インターネット・IPv6・Apacheの公開TLSは未検証です。

ApacheとPHP-FPMの動作確認画面
Ubuntu Server 22.04の実VMで撮影した画面を掲載します。実ドメインの公開HTTPSとIPv6の到達性は、この手順の確認範囲に含みません。