【Apacheチューニング 第3回】拡張編 – マイクロサービス時代の覇者へ。ロードバランシングとSSLオフロードを極めるリバースプロキシ

Apacheは「万能の司令塔」になれる

こんにちは!「リナックス先生」です。
全3回の講座も、いよいよ今回で最終回。
最後は、ApacheをWebサーバーの枠を超えた「アプリケーション・ゲートウェイ(インフラの司令塔)」へと進化させる技術です。

【連載】Apacheカスタマイズ・チューニング講座
コウ君

先生、最近 Python (Flask) と Node.js でアプリを作ってるんです!
でも、これを公開しようとするとポート番号が 8000 とか 3000 になっちゃうし、SSL設定もアプリごとにやるのが難しくて…。
結局、ファイアウォールでポートを開けて、裸のHTTPで公開しちゃってます。

リナックス先生

コウ君、それはセキュリティ的に最悪手よ。
開発用ポートを直接インターネットに晒すなんて、玄関を開けっ放しにするようなもの。
Apacheを前段(フロント)に置いて、後ろのアプリに通信を中継する「リバースプロキシ」構成にするのが、本番運用の鉄則よ。

1. リバースプロキシの役割と構造

なぜ、わざわざApacheを通す必要があるのでしょうか?
直接アクセスさせる場合と比較して、そのメリットは計り知れません。

  • セキュリティの集約: WAF(ModSecurity)やIP制限をApache側で一元管理できます。
  • SSLオフロード: 面倒な証明書管理をApacheに任せ、裏側のアプリはHTTP(平文)で動かすことで、CPU負荷を分散できます。
  • 静的ファイルの高速化: 画像やCSSはApacheが高速に返し、重い動的処理だけをアプリに流すことで全体のレスポンスを向上させます。
  • ポートの隠蔽: ユーザーには常に 80/443 番ポートだけを見せ、内部構造(ポート3000など)を完全に隠蔽できます。

2. 基本設定:ProxyPassの作法

まずは基本形です。Apacheで受けたアクセスを、ローカルで動くアプリ(例:localhost:8000)に流します。

必要なモジュールの確認

RHEL系(AlmaLinuxなど)は標準で有効ですが、Ubuntuの場合は有効化が必要です。

# Ubuntuの場合
a2enmod proxy proxy_http headers
systemctl restart apache2

VirtualHostの設定例

/etc/httpd/conf.d/app.conf などを新規作成します。

<VirtualHost *:80>
    ServerName app.linuxkoubou.com

    # 【重要】プロキシのタイムアウト設定
    # アプリの処理が重い場合、デフォルト(60秒)だとApacheが「504 Gateway Timeout」を返してしまう。
    # AI処理やバッチ処理など、時間がかかるアプリなら長めに設定する。
    ProxyTimeout 300

    # ルートへのアクセスを localhost:8000 に転送
    # ProxyPassReverse は、アプリがリダイレクトした際のURLヘッダーを書き換えるために必須。
    ProxyPass / http://localhost:8000/
    ProxyPassReverse / http://localhost:8000/
</VirtualHost>

3. 【最重要】「X-Forwarded」ヘッダーの制御

初心者が必ずハマる落とし穴がここです。
リバースプロキシを通すと、アプリ側(Node.js/Python)からは、全てのアクセス元IPアドレスが 127.0.0.1 (ApacheのIP) に見えてしまいます。
これではアクセス解析も、荒らしユーザーのIPBANもできません。

Apache側で「本当のアクセス元情報」をヘッダーに付与して渡す設定を追加します。

<VirtualHost *:80>
    ServerName app.linuxkoubou.com

    # 1. 元のHost名(ドメイン)を維持する
    # これがないと、アプリ側で生成するリンクが "localhost:8000" になってしまう場合がある。
    ProxyPreserveHost On

    # 2. クライアントのIPアドレスを X-Forwarded-For に追加
    RequestHeader set X-Forwarded-For "%{REMOTE_ADDR}s"
    
    # 3. プロトコル(http/https)情報を渡す
    RequestHeader set X-Forwarded-Proto "http"
    
    ProxyPass / http://localhost:8000/
    ProxyPassReverse / http://localhost:8000/
</VirtualHost>

アプリ側のコードでは、req.ip ではなく req.headers['x-forwarded-for'] を参照するように修正してください。

4. ロードバランシング(負荷分散)の実装

ここがインフラエンジニアの腕の見せ所です。
もしアプリへのアクセスが急増した場合、裏側でアプリを2つ(ポート8000と8001)起動し、Apacheでアクセスを振り分ければ、処理能力は2倍になります。
さらに、片方が落ちてもサービスが止まらない「冗長化」も実現できます。

mod_proxy_balancer の設定

<Proxy balancer://mycluster>
    # 2つのバックエンドを定義
    # loadfactor は重み付け(1:1なら均等に分散)
    BalancerMember http://localhost:8000 loadfactor=1
    BalancerMember http://localhost:8001 loadfactor=1
    
    # 振り分け方式
    # byrequests: 順番に振り分け(ラウンドロビン)。基本はこれ。
    # bytraffic: 通信量に基づいて振り分け。
    # bybusyness: 現在のアクティブなリクエスト数が少ない方へ。
    ProxySet lbmethod=byrequests
</Proxy>

# 定義したバランサーへ転送
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/

この設定を入れるだけで、Apacheが高機能なロードバランサーに早変わりします。
メンテナンス時も、片方のポートを落として更新し、終わったらもう片方を…という「無停止デプロイ」が可能になります。

5. SSLオフロードとWebSocket対応

最後に、現代のWebアプリに必須のSSLとWebSocketの設定です。

SSLオフロード設定

Apacheで暗号化を解除し、裏側へはHTTPで流します。CPU負荷の高い暗号化処理をApache一箇所に集中させる、非常に効率的な構成です。

<VirtualHost *:443>
    ServerName app.linuxkoubou.com
    
    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/app.../cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/app.../privkey.pem
    
    # アプリ側には「今はhttpsでアクセスされてるよ」と伝える(超重要)
    # これがないと、アプリが http:// へのリダイレクトを返して無限ループすることがある
    RequestHeader set X-Forwarded-Proto "https"
    RequestHeader set X-Forwarded-Port "443"

    ProxyPass / http://localhost:8000/
    ProxyPassReverse / http://localhost:8000/
</VirtualHost>

WebSocket (Socket.io等) への対応

チャットアプリなどで使うWebSocketは、通常のHTTPプロキシでは切断されてしまいます。Upgradeヘッダーを検知してプロトコルを切り替える記述が必要です。

RewriteEngine On
# Upgradeヘッダーが websocket なら、ws:// プロトコルで転送する
RewriteCond %{HTTP:Upgrade} =websocket [NC]
RewriteRule /(.*)           ws://localhost:8000/$1 [P,L]

6. トラブルシュート:503エラーが出たら?

設定は合っているのに、ブラウザでアクセスすると 503 Service Unavailable が出る場合。ログに Permission denied と出ていたら、犯人は SELinux です。

RHEL/AlmaLinuxなどのOSでは、Apacheが「外部(または別のポート)」へ接続することをデフォルトで禁止しています。
以下のコマンドで「Apacheがネットワーク接続すること」を許可してください。

# 設定状況の確認
getsebool -a | grep httpd_can_network_connect

# 許可を与える(-P オプションで再起動後も有効化)
setsebool -P httpd_can_network_connect 1

連載まとめ:Apacheを「使い倒す」ということ

全3回、本当にお疲れ様でした!
これであなたのApache知識は、単なる「設定ファイルがいじれるレベル」を超え、「堅牢で高速なインフラを設計できるレベル」に到達しました。

【Apache完全チューニング講座の成果】

コウ君

Apacheって、ただHTMLを表示するだけのソフトじゃなかったんですね。
リバースプロキシでポート問題を解決して、さらにロードバランサーで負荷分散までできるなんて…。
インフラエンジニアって、こういう設計図を描く仕事なんですね!めちゃくちゃ面白いです!

リナックス先生

その通りよ。
ツールに使われるのではなく、ツールの仕組みを理解して使い倒す。
この連載で得た知識は、ApacheだけでなくNginxやクラウドのロードバランサーを触る時にも必ず役立つわ。
自信を持って、最高のサービスを支えるインフラを作っていってね!

▼モダンなアプリ開発基盤に最適なVPS

今回紹介したような、複数のアプリコンテナを起動し、ロードバランシングを行う構成には、十分なCPUコア数とメモリ、そしてルート権限が必要です。開発者の自由な設計に応える、高性能VPSはこちらです。

【2026年最新】Linuxサーバー構築におすすめのVPS比較3選!現役エンジニアが速度とコスパで厳選
Linuxの勉強、まだ「自分のPC」でやって消耗していませんか?「Linuxを覚えたいけど、環境構築でエラーが出て先に進めない…」「VirtualBoxを入れたらパソコンが重くなった…」これは、Linux学習を始める9割の人がぶつかる壁です...

コメント