勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

Podmanで作成したApache用コンテナにドメインを割り当て、ポート指定なしでアクセス可能にする方法

  サーバー

先日PodmanでWebサーバ用コンテナを作成したが、ブラウザからアクセスする際は8080ポートを指定する必要があった。これをポート指定なしでアクセスできるようにしたい。また、ドメインを割り当てた上、ドメインへのアクセスはコンテナ側、IPアドレスの場合はホスト(VPS)側のページを表示させたい。以下に対応方法をメモ。

 

やりたいこと

  • 「test.com」「www.test.com」にアクセスした場合はコンテナ側ページを表示
  • 「サーバIPアドレス」にアクセスした場合はホスト側ページを表示
  • いずれもブラウザからはポート指定なしで表示

 

環境について

VPS

今回はKAGOYA CLOUD VPSのCPU1コア / メモリ1GBプランで作業した。SSH接続は公式案内の通り以下でログインできる。

  • 接続ポート -> 22
  • ユーザ名 -> root
  • パスワード or 秘密鍵 -> インスタンス作成時に選択したもの

ホスト(VPS)側 AlmaLinux / Apache

詳細なバージョンは以下の通り。

# AlmaLinuxのバージョン確認
cat /etc/redhat-release

# 実行結果
AlmaLinux release 8.10 (Cerulean Leopard)

# Apacheのバージョン確認
httpd -v

# 実行結果
Server version: Apache/2.4.37 (AlmaLinux)

 

対応方法

各種設定

サーバにSSH接続し、以下コマンドでリバースプロキシに必要なモジュールが読み込まれているかチェックする。

httpd -M | grep proxy

「proxy_module」及び「proxy_http_module」が表示されれば良い。私の環境では以下が表示され、どちらのモジュールも読み込まれている点が確認できた。

proxy_module (shared)
proxy_ajp_module (shared)
proxy_balancer_module (shared)
proxy_connect_module (shared)
proxy_express_module (shared)
proxy_fcgi_module (shared)
proxy_fdpass_module (shared)
proxy_ftp_module (shared)
proxy_http_module (shared)
proxy_hcheck_module (shared)
proxy_scgi_module (shared)
proxy_uwsgi_module (shared)
proxy_wstunnel_module (shared)
proxy_http2_module (shared)

以下で設定ファイルを編集(ファイルが無い場合は作成)する。

vi /etc/httpd/conf.d/podman-proxy.conf

以下内容を記述もしくは追記し「:wq」で保存する。DocumentRootとServerNameは適宜変更すること。

# --------------------------------------------------
# ホスト(VPS)側設定
# --------------------------------------------------
<VirtualHost *:80>
    DocumentRoot /var/www/html
    
    <Directory /var/www/html>
        # .htaccessを使った上書きを許可
        AllowOverride All
        
        # すべてのアクセスを許可
        Require all granted
    </Directory>

    ErrorLog logs/host-error.log

    # リファラとユーザーエージェントと追加したアクセスログを出力
    CustomLog logs/host-access.log combined
</VirtualHost>

# --------------------------------------------------
# コンテナ側設定
# --------------------------------------------------
<VirtualHost *:80>
    # test.comにアクセスがあった場合
    ServerName test.com

    # www付でアクセスがあった場合(www付を使わない場合は不要)
    ServerAlias www.test.com

    # リバースプロキシをONにし8080ポートに転送
    ProxyPreserveHost On
    ProxyPass / http://127.0.0.1:8080/
    ProxyPassReverse / http://127.0.0.1:8080/

    ErrorLog logs/container-error.log
    CustomLog logs/container-access.log combined
</VirtualHost>

設定ファイルの構文チェックを行い、問題無ければApacheを再起動する。

# 構文チェック
httpd -t

# 以下が表示さればOK
Syntax OK

# Apacheの再起動
systemctl restart httpd

この時点でtest.com / www.test.comにアクセスするとコンテナ側ページ、サーバIPアドレスにアクセスするとホスト側ページが表示される筈。

ドキュメントルートについて

以下がドキュメントルートになる。

リバースプロキシが必要な理由

コンテナ作成時、ホストポートとコンテナポートをどちらも「80」に指定することで、ブラウザからポート指定なしで表示できるようになるが、その場合ホスト側へアクセスできなくなる(1つのポートを占有できるプロセスは1つまでのため)。

リバースプロキシ経由だとホスト側、コンテナ側どちらもアクセスできる上、将来的に新しいコンテナを作成した際、そちらへもアクセス可能な設定を行える。

アクセス・エラーログの場所

Apache関連のログは通常通り以下ディレクトリに保存される。またカスタムログで指定した通りホスト・コンテナ側で別々のアクセスログも保存される。

/var/log/httpd

IPアドレスでのアクセスを禁止する場合

実運用の際にIPアドレスでのアクセスを禁止することになると思うが、その場合はpodman-proxy.confのホスト側設定を以下の通り書き換える。

<VirtualHost *:80>
    <Location />
        Require all denied
    </Location>

    ErrorLog logs/host-error.log
    CustomLog logs/host-access.log combined
</VirtualHost>

ブラウザから8080ポート指定でのアクセスを禁止する場合

ブラウザから「http://(www.)test.com:8080」のようなポート指定でのアクセスを拒否したい場合、コンテナ作成時にポートマッピングのIPアドレスに「127.0.0.1」を指定する。

すると「http://(www.)test.com:8080」のようなポート指定でのアクセスは拒否され、「http://(www.)test.com」のようなポート指定なしのアクセスは(ローカルホストを経由しているため)許可される。

尚、実運用の際は8080ポート指定でのアクセスは禁止し、前述のIPアドレスでのアクセスも禁止するのが安全かと思われる。

 - サーバー

  関連記事

CockpitとPodmanでWebサーバ用コンテナを作成しHello Worldページを表示する方法
CockpitとPodmanでWebサーバ用コンテナを作成しHello Worldページを表示する方法

Cockpitにはcockpit-podmanというPodman(Dockerの ...