いつの時代も入り口は1つでサービスは複数という構成はあるもので、
Keycloakをリバースプロキシの後ろへ配置することがあったのでメモ。
TL;DR
公式ドキュメントが一番w
環境
今回はDockerでリバプロ+Keycloakを用意します。
- Keycloak
- イメージ:quay.io/keycloak/keycloak:20.0.3
- nginx(リバースプロキシ)
- イメージ:nginx:1.23.3
nginxの準備
リバースプロキシとして動作するようにnginxの設定を用意します。
events { worker_connections 120; } http { server { listen 80; location /keycloak { proxy_set_header Host $http_host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-port $server_port; proxy_pass http://keycloak:8080/keycloak; proxy_redirect off; } } }
/keycloak
に来たリクエストをhttp://keycloak:8080/keycloak
に流します。
流すと同時にX-Forwarded-*ヘッダーを付加します。
このヘッダーがあることでKeycloak側でもリバースプロキシの裏にいるんだなと認識してくれます。
大抵のリバースプロキシではこのヘッダーを付与してくれるはずw
(Forwardedヘッダの方が標準的なんでしょうけど。)
docker-compose.ymlの設定
version: "3" services: keycloak: image: quay.io/keycloak/keycloak:20.0.3 container_name: keycloak_app environment: KEYCLOAK_ADMIN: "admin" KEYCLOAK_ADMIN_PASSWORD: "password" KC_PROXY: "edge" KC_HTTP_RELATIVE_PATH: "keycloak" command: start-dev nginx: image: nginx:1.23.3 container_name: keycloak_proxy volumes: - ./nginx/nginx.conf:/etc/nginx/nginx.conf ports: - 80:80
nginxは先ほどの設定を読み込ませているだけです。
Keycloakの設定は実行時引数や設定ファイルでも可能ですが、今回は環境変数で設定を行っています。
ポイントは KC_PROXY
とKC_HTTP_RELATIVE_PATH
の設定です。
KC_PROXY
はKeycloakがリーバスプロキシの裏にいることを設定し、その際の動作モードを設定します。
設定値は以下のようなものがあります。
設定値 | 用途 |
---|---|
none (デフォルト) | リバースプロキシを使わない |
edge | リバースプロキシとの間の通信をHTTPで行う場合。リバースプロキシでTLSを終端してる時など。 |
reencrypt | リバースプロキシとの間の通信をHTTPSで行う場合。 |
passthrough | リバースプロキシがクライアントと行う通信と同じ方式で通信を行う。 |
私が、試した環境ではリバースプロキシ側でTLSを終端していたのでedge
を使用しています。
(上記のnginxにはHTTPSの設定は入ってないですけど...)
KC_HTTP_RELATIVE_PATH
はkeycloakのコンテキストパスを指定するために使用します。
この設定で「http://localhost/keycloak」にアクセスするとkeycloakが表示されます。
私が実際にKeycloakを載せようとしていたのは、AWS CloudFrontの後ろなんですが、
keycloakの動作確認を手軽にローカルでやれるようにコンテナでそれらしい環境を用意して試しました。
こういう時にコンテナは便利ですよね。(今更だろという話ですがw)