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.conf80・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.html03 / 専用サイトへ切り替える
設定を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 -SApache 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.sockApache付属の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.phpPHP 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.phpFPMが稼働した状態で、削除済みファイルと存在しない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は未検証です。
