Dockerコンテナ(Apache)とホストOS(PHP-FPM)のハイブリッド構成によるPHP実行環境の構築
1. アーキテクチャの概要と選定理由
本稿では、Dockerコンテナ内で動作するApache HTTP Server(以下、Apache)と、ホストOS上で直接動作するPHP-FPM(FastCGI Process Manager)を連携させるハイブリッド構成の実装プロセスを詳述します。通常、Docker環境では同一コンテナ内、あるいはサイドカー構成でPHPを動作させることが一般的ですが、本構成ではプレゼンテーション層(Apache)とアプリケーション処理層(PHP)を物理的・論理的に分離します。
1.1 現状の課題
コンテナ化されたApache(コンテナ名: web2)において、静的コンテンツ(HTML)の配信は正常に行われていたものの、PHPファイルの要求に対してパースが行われず、ソースコードがそのまま露出するか、ブラウザがファイルをダウンロードしようとする事象が確認されました。これは、コンテナ内にPHPインタープリタが存在しない、あるいはApacheがPHPリクエストを適切にハンドリングできていないことに起因します。
1.2 採用されたソリューション:ハイブリッド・プロキシ・モデル
以下の2つの選択肢を検討した結果、オプション2を採用しました。
- コンテナの再構築: ApacheとPHPを同梱した新しいイメージを作成する。
- ハイブリッド・プロキシ・モデル: 既存のApacheコンテナとホストOS上のPHP-FPMをネットワークブリッジ経由で接続する。
オプション2の採用により、コンテナイメージの肥大化を防ぎつつ、ホストOSのネイティブなハードウェアリソースをPHP処理に活用することが可能となります。また、PHP拡張モジュールの管理や設定変更をホスト側で完結できるため、運用柔軟性が向上します。
2. ホストOS側の設定:PHP-FPMの構築
ホストOS側で、コンテナからのFastCGIリクエストを受け付けるための環境を整備します。
2.1 パッケージのインストール
ホストOSのパッケージマネージャ(dnf)を使用し、PHP本体および主要なモジュールをインストールします。
dnf install -y php-fpm php-mysqlnd php-opcache php-mbstring
各モジュールの役割は以下の通りです:
- php-fpm: Webサーバーからのリクエストを処理するFastCGIマネージャ。
- php-mysqlnd: データベース接続用ドライバ。
- php-opcache: コンパイル済みバイトコードを共有メモリに保持し、実行速度を向上。
- php-mbstring: マルチバイト文字列(日本語等)の適切な処理に必須。
2.2 PHP-FPM 設定の変更 (www.conf)
デフォルトでは、PHP-FPMはUnixドメインソケットまたは 127.0.0.1:9000 でリスンしており、外部(コンテナ)からのアクセスが拒否されます。これをネットワーク経由で受け付けるように変更します。
vi /etc/php-fpm.d/www.conf
以下の項目を修正します:
; 外部からのリクエストを許可するポート設定
listen = 8080
; アクセスを許可するクライアントの制限(必要に応じて調整)
listen.allowed_clients = 127.0.0.1, 192.168.159.10
設定変更後、サービスを起動・有効化します。
systemctl start php-fpm
systemctl enable php-fpm
3. Dockerコンテナ側の設定:Apache FastCGIプロキシ
次に、Apacheコンテナ(web2)がPHPリクエストをホストOSのポート8080へ転送するように設定します。
3.1 Apache設定ファイルの編集
コンテナのシェルに入り、httpd.conf を編集します。
docker exec -it web2 /bin/bash
vi /usr/local/apache2/conf/httpd.conf
3.1.1 プロキシモジュールの有効化
以下の行のコメントアウトを解除し、FastCGIプロキシ機能を有効にします。
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
3.1.2 ハンドラの設定
ファイルの末尾に、PHPファイルに対するプロキシ設定を追加します。ここではホストOSのIPアドレスを 192.168.159.10 と仮定します。
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://192.168.159.10:8080/var/www/html/$1
この設定により、拡張子が .php のリクエストはすべて指定されたFastCGIエンドポイントへ転送されます。
4. 統合テストと検証
設定完了後、コンテナとホスト間の通信が正常に行われるか検証します。
4.1 検証フロー
- エントリーポイント: コンテナ上の index.php(HTMLフォーム)にアクセス。
- データ送信: フォームから POST メソッドで login.php へデータを送信。
- プロキシ処理: Apacheが login.php へのリクエストを検知し、ホストOSの 192.168.159.10:8080 へ転送。
- PHP実行: ホストOSのPHP-FPMがスクリプトを実行し、結果をApacheに返却。
- レスポンス: ブラウザに実行結果が表示されることを確認。
PHPコードがそのまま表示されず、期待通りにサーバーサイドで処理された結果が返ってくれば、プロキシ連携は成功です。
Operational Notes
- ⚠️ ネットワークの到達性: コンテナからホストOSのIPアドレスに対して、ポート8080が開放されていることをファイアウォール(firewalld等)の設定で確認してください。
- 🛠️ ファイルパスの整合性: Apache側で見ているドキュメントルートと、PHP-FPM側が参照するスクリプトのパスが一致している必要があります。不一致の場合、
File not foundエラーが発生します。 - 💡 パフォーマンス: ネットワーク経由のプロキシとなるため、高トラフィック環境ではUnixドメインソケットと比較してオーバーヘッドが発生する可能性があります。必要に応じて php-opcache のチューニングを検討してください。