Keycloak高可用部署遇过多重定向及网络响应异常求助
Keycloak高可用部署重定向/网络问题解决方案
核心问题分析
问题根源在于多Keycloak实例会话未同步,以及Nginx反向代理配置未适配Keycloak的会话机制——请求在不同实例间切换时会话不一致,触发重定向循环或网络响应异常;另外服务器2上两个Keycloak实例共用80/443端口属于配置错误,会导致端口冲突。
具体修复步骤
1. 修正Keycloak端口冲突问题
服务器2上的两个Keycloak实例不能同时绑定80或443端口,修改Docker Compose配置,给两个实例分配不同端口,比如:
# 第一个Keycloak实例 services: keycloak1: image: quay.io/keycloak/keycloak:latest ports: - "8080:8080" # 其他配置... # 第二个Keycloak实例 keycloak2: image: quay.io/keycloak/keycloak:latest ports: - "8081:8080" # 其他配置...
2. 配置Keycloak分布式会话共享
Keycloak默认用本地会话存储,多实例必须配置分布式缓存共享会话,基于现有PostgreSQL数据库实现:
给每个Keycloak实例添加以下环境变量:
environment: - KC_CACHE=ispn - KC_CACHE_STACK=postgres - KC_DB=postgres - KC_DB_URL=jdbc:postgresql://postgres:5432/keycloak - KC_DB_USERNAME=keycloak - KC_DB_PASSWORD=你的数据库密码 - KC_HOSTNAME=你的公网域名/IP - KC_HOSTNAME_PORT=443 # 对应Nginx对外端口,HTTP则填80
3. 调整Nginx负载均衡配置
确保Nginx正确传递请求头,同时启用会话粘性减少跨实例切换:
修改nginx.conf的上游和代理配置:
# 上游服务器配置,指向服务器2的两个Keycloak实例 upstream keycloak_cluster { server 服务器2IP:8080; server 服务器2IP:8081; ip_hash; # 基于客户端IP做会话粘性,确保同一用户请求落到同一实例 } server { listen 80; listen 443 ssl; server_name 你的公网域名/IP; location / { proxy_pass http://keycloak_cluster; # 传递必要请求头,让Keycloak识别真实客户端信息 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 修正Cookie路径与属性 proxy_cookie_path / "/; secure; HttpOnly; SameSite=Lax"; } }
4. 验证实例连通性
重启所有服务后,测试Nginx到每个Keycloak实例的连通性:
curl http://服务器2IP:8080/health/live curl http://服务器2IP:8081/health/live
确保返回{"status":"UP"},说明实例正常运行。
验证修复效果
- 访问Keycloak首页,进入管理控制台测试登录流程,确认无重定向错误
- 登录后刷新仪表盘,检查是否还有
network response was not ok提示 - 手动停止其中一个Keycloak实例,验证剩余实例是否能正常提供服务
内容的提问来源于stack exchange,提问作者Insight Habor
相关产品推荐
相关产品推荐

