この記事でわかること

  • 1台のサーバーで複数のアプリをパスごとに公開する設定
  • ProxyPassを書く順番と、管理画面だけを社内のIPに限る書き方
  • 設定を変えるときの、バックアップ・確認・反映・戻し方の順番
  • 403・404・502が出たときの切り分け方

サーバー全体の構築の流れはClaude CodeでAlmaLinuxサーバーを構築・運用する方法で紹介しています。ここではApacheの後ろに複数のアプリを並べる部分だけを扱います。

リバースプロキシで複数のアプリを公開する仕組み

アプリはそれぞれ、サーバーの中の別々のポートで待ち受けます(例: 127.0.0.1の8081番と8082番)。Apacheは外からのリクエストを受け、URLのパスを見て、そのパスを担当するアプリへ渡します。これがリバースプロキシです。

Apache 2.4では、mod_proxyのProxyPassでパスとアプリの対応を書き、ProxyPassReverseでアプリが返すリダイレクトのURLを書き換えます。外からはポートを開けずに、1つのドメインで複数のアプリを見せられます。

STEP 1 変更前に今の設定を読み取りで確かめる

最初に、今どのアプリがどのパスで公開されているかと、使われているポートを確かめます。新しいアプリのポートが、既存のアプリと重ならないようにするためです。

【用途】仮想ホスト・モジュール・待ち受けの確認 /【実行場所】本番へのSSH /【状態変更】なし(読み取り)

sudo apachectl -S
sudo apachectl -M | grep proxy
ss -ltn
grep -rnE "ProxyPass|<Location" /etc/httpd/conf.d/

1行目は仮想ホストの設定、2行目は読み込まれているproxyのモジュールを表示します。proxy_module と proxy_http_module があれば、ProxyPassを使えます。読み取りのコマンドを決めてから実行する方法は、サーバーの状態確認をClaude Codeに読み取り専用で任せる方法で詳しく紹介しています。

STEP 2 ProxyPassとProxyPassReverseを書く

【用途】2つのアプリをパスごとに公開する設定の例 /【実行場所】Apacheの設定ファイル /【状態変更】あり(STEP 4で反映)

ProxyRequests Off

ProxyPass        "/app1/api/" "http://127.0.0.1:8083/"
ProxyPassReverse "/app1/api/" "http://127.0.0.1:8083/"
ProxyPass        "/app1/" "http://127.0.0.1:8081/"
ProxyPassReverse "/app1/" "http://127.0.0.1:8081/"
ProxyPass        "/app2/" "http://127.0.0.1:8082/"
ProxyPassReverse "/app2/" "http://127.0.0.1:8082/"

書くときの決まりは3つです。

  • ProxyPassは書いた順に照合され、最初に一致したものが使われる。/app1/api/ のような長いパスは、/app1/ より前に書く
  • 1つ目のパスが / で終わるなら、2つ目のURLも / で終える。片方だけだと、アプリへ渡すURLのスラッシュがずれる
  • リバースプロキシだけなら ProxyRequests Off のままにする(オンにすると、外部のサイトへの中継に使われるおそれがある)

アプリ側にも、自分が /app1/ の下で公開されていることを設定する必要がある場合があります。

STEP 3 管理画面だけを社内のIPに限る

【用途】本体は公開し、管理画面だけを社内のIPに限る例 /【実行場所】Apacheの設定ファイル /【状態変更】あり(STEP 4で反映)

<Location "/app1/">
    Require all granted
</Location>

<Location "/app1/admin/">
    Require ip 127.0.0.1 192.0.2.0/24
</Location>

/app1/admin/ へのリクエストには、2つの区画の両方が当てはまります。Apacheは <Location> を設定ファイルに書いた順に処理し、誰に許可するかの指定は、既定では後の区画のものに置き換わります。そのため、限定したい区画を後に書きます。逆に書くと、管理画面が誰からでも開ける状態になります。

STEP 2のProxyPassは「長いパスを先」、ここの <Location> は「限定する区画を後」です。照合と認可は別の決まりなので、まとめて覚えないように注意します。

STEP 4 バックアップしてから設定を変える

【用途】設定ファイルのバックアップと変更の確認 /【実行場所】本番へのSSH /【状態変更】あり(設定ファイルを変更)

mkdir -p ~/apache-backup
sudo cp -a /etc/httpd/conf.d/example-app.conf ~/apache-backup/example-app.conf.20261008
sudoedit /etc/httpd/conf.d/example-app.conf
sudo diff ~/apache-backup/example-app.conf.20261008 /etc/httpd/conf.d/example-app.conf

バックアップは設定のフォルダの外に置きます。diff で、足したい行だけが変わり、既存のアプリの行が変わっていないことを確かめます。おかしければ、STEP 8の戻し方でバックアップから戻します。

STEP 5 configtestで確かめてからgracefulで反映する

【用途】構文の確認と反映 /【実行場所】本番へのSSH /【状態変更】あり(Apacheの設定を再読み込み)

sudo apachectl configtest
sudo apachectl graceful

STEP 4のバックアップがあることを確かめてから実行します。1行目が Syntax OK のときだけ、2行目に進みます。gracefulは処理中のリクエストを終わらせてから入れ替えるため、使っている人の接続を途中で切りません。gracefulも反映の前に構文を確かめますが、先にconfigtestを実行して結果を自分の目で見ておくと、エラーの内容をすぐに読めます。問題が出たときの戻し方はSTEP 8です。

STEP 6 HTTPの応答とログを確かめる

【用途】反映した後の応答とエラーの確認 /【実行場所】本番へのSSH /【状態変更】なし(読み取り)

curl -sSI https://example.com/app1/ | head -n 1
curl -sSI https://example.com/app2/ | head -n 1
sudo tail -n 20 /var/log/httpd/error_log

新しいパスだけでなく、既存のアプリも今までどおり応答するかを確かめます。管理画面は、社内のネットワークの外から開いて403になることも確かめます。エラーログの場所は、設定のErrorLogで確かめてください。

STEP 7 つまずきやすい点: 403・404・502の切り分け

  • 403: 許可の指定で拒否されている。<Location> の順番と、許可するIPの範囲を確かめる
  • 404: パスがどのProxyPassにも一致していないか、アプリ側のパスとずれている。長いパスを先に書いたか、末尾の / がそろっているかを確かめる
  • 502・503: アプリへつながっていない。アプリが動いているか、ポートが合っているかを確かめる

アプリが起動していない原因の調べ方や、再起動の後だけ起動しないときの確かめ方は、サーバー障害の切り分けをClaude Codeと進めるで紹介しています。

SELinuxが有効なRHEL系のサーバーでは、Apacheがアプリのポートへの接続を止められて、502や503になることがあります。監査ログ(sudo ausearch -m AVC -ts recent)で拒否の記録を確かめ、公式の手順に沿って必要な設定だけを変えます。SELinuxを無効にして済ませることはしません。

STEP 8 問題があれば戻す

【用途】バックアップから戻して反映し直す /【実行場所】本番へのSSH /【状態変更】あり(設定ファイルを戻し、再読み込み)

sudo cp -a ~/apache-backup/example-app.conf.20261008 /etc/httpd/conf.d/example-app.conf
sudo apachectl configtest
sudo apachectl graceful

戻し方の要点は、ファイルを戻しただけでは動いているApacheに反映されないことです。戻した後もconfigtestとgracefulを実行し、STEP 6と同じ確認で、既存のアプリが元どおり応答することを確かめます。

Claude Codeに任せる範囲の判断

Claude Codeには、STEP 1の読み取りと、設定の差分の案づくりを任せます。sudoで設定を変える・反映する作業は、差分を人が読んでから、人が自分の端末で実行します。

【用途】変更の前に差分を出させる依頼 /【実行場所】Claude Code /【状態変更】なし(提案だけ)

Apacheに新しいアプリ(127.0.0.1:8082)を /app2/ で公開したいです。まだ何も変更しないでください。
1. 今の設定の ProxyPass と <Location> を読み取りで一覧にしてください。
2. 追加する行と、既存の行に影響がないかを、差分の案として書いてください。
3. バックアップ・configtest・graceful・確認・戻し方の手順を書いてください。
案を書いたら止まって、私の確認を待ってください。sudo のコマンドは私が実行します。

このサイトで実際にあったこと

  • 新しいアプリのパスを足したときは、既存のアプリの区画が変わっていないことを diff で確かめてから、configtestとgracefulで反映した
  • 一般ユーザーでconfigtestを実行したら、証明書のファイルがないというエラーが出た。証明書のフォルダが管理者しか読めない設定だったためで、sudoで実行すると Syntax OK だった。設定の不備ではなかった
  • 本体を公開に切り替えたとき、プレビューのパスだけは社内に限るため、その <Location> を本体の区画の後に置いた
  • 使わなくなったアプリの区画を外したときは、変更の前後を控え、外したパスが404になり、ほかのアプリが応答し、エラーログに新しいエラーがないことを確かめた

まとめ

  • ProxyPassは長いパスを先に、<Location> の制限は限定する区画を後に書く
  • 変更はバックアップ → diff → configtest → graceful → 確認の順に進める
  • 問題があればバックアップから戻し、configtestとgracefulで反映し直す
  • 403・404・502は、認可・パスの一致・アプリへの接続の順に切り分ける

Claude Codeでサイトを作るところから始める場合は、Claude CodeでWebサイトを作る方法と公開までの流れも参考にしてください。