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アドレスにアクセスするとホスト側ページが表示される筈。
ドキュメントルートについて
以下がドキュメントルートになる。
- ホスト側 → podman-proxy.confに記述した「/var/www/html」
- コンテナ側 → コンテナ作成時に指定したホストパス
リバースプロキシが必要な理由
コンテナ作成時、ホストポートとコンテナポートをどちらも「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にはcockpit-podmanというPodman(Dockerの ...