【问题标题】:Configure reverse-proxy for Keycloak docker with custom base URL使用自定义基本 URL 为 Keycloak docker 配置反向代理
【发布时间】:2017-11-21 07:58:32
【问题描述】:

如何将docker keycloak base url 设置为参数?

我有以下nginx反向代理配置:

server {
    listen 80;
    server_name example.com;

    location /keycloak {
        proxy_pass http://example.com:8087/;
    }
}

当我尝试访问 http://example.com/keycloak/ 时,我得到一个 keycloak http 重定向到 http://example.com/auth/ 而不是 http://example.com/keycloak/auth/

有什么想法吗?

【问题讨论】:

  • FrancoisMaturel 建议:location /keycloak { proxy_pass http://example.com:8087/keycloak;}@FrançoisMaturel 我尝试了您的建议,但没有成功

标签: nginx docker keycloak


【解决方案1】:

刚刚测试了@home,实际上需要添加多个配置:

1/ 按照文档中的说明,使用 env -e PROXY_ADDRESS_FORWARDING=true 运行 keycloak 容器,这是访问 keycloak 的代理方式所必需的:

docker run -it --rm -p 8087:8080 --name keycloak -e PROXY_ADDRESS_FORWARDING=true jboss/keycloak:latest

在这个SO question也有解释

2/ 更改keycloak配置文件中的web-context $JBOSS_HOME/standalone/configuration/standalone.xml

默认keycloak配置指向auth

<web-context>auth</web-context>

那你可以改成keycloak/auth

<web-context>keycloak/auth</web-context>

如果您需要为 docker 自动执行此操作,只需创建一个新的 keycloak 映像:

FROM jboss/keycloak:latest

USER jboss

RUN sed -i -e 's/<web-context>auth<\/web-context>/<web-context>keycloak\/auth<\/web-context>/' $JBOSS_HOME/standalone/configuration/standalone.xml

3/在nginx配置中添加一些代理信息(多用于http/https处理)

location /keycloak {
    proxy_pass http://example.com:8087;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

如果您将来自 nginx 的请求代理到同一服务器上的 keycloak,我建议使用proxy_pass http://localhost:8087;,如果不尝试使用专用网络来避免通过外部 Web 请求进行代理。

希望对你有帮助

【讨论】:

  • 这些是依赖步骤吗?或者有 3 种方法来解决这个问题?
  • @nurgasemetey,解决此问题需要所有这些步骤
  • 似乎这种方法会导致细微的语义错误 - 请参阅 issues.jboss.org/browse/KEYCLOAK-11529 以获取当前打击我的示例 ...
  • @col.panic 这似乎与最新版本的 keycloak 有关,如果您找到可行的解决方案,请更新我
  • @FrançoisMaturel 请参阅回复。 jboss 票 - 我找到了解决方法/解决方案
【解决方案2】:

基于@Francois Maturel 的回复:对于最新的 Keycloak(当前为 4.8.x),我还必须添加一行来替换 standalone-ha.xml 中的 web-context

FROM jboss/keycloak:latest
USER jboss
RUN sed -i -e 's/<web-context>auth<\/web-context>/<web-context>keycloak\/auth<\/web-context>/' /opt/jboss/keycloak/standalone/configuration/standalone.xml
RUN sed -i -e 's/<web-context>auth<\/web-context>/<web-context>keycloak\/auth<\/web-context>/' /opt/jboss/keycloak/standalone/configuration/standalone-ha.xml

原因是docker-entrypoint.sh 启动脚本除了standalone.xml 之外还会使用standalone-ha.xml 配置,除非-c 标志被传递。见这里:https://github.com/jboss-dockerfiles/keycloak/blob/master/server/tools/docker-entrypoint.sh

【讨论】:

    【解决方案3】:

    从“/keycloak”到“/keycloak/auth”的重定向不起作用。 index.html 和 Base-URL 中的 Redirekt 路由缺少“/keycloak”部分。 我不得不添加这个:

    FROM jboss/keycloak:latest
    
    USER jboss
    
    RUN sed -i -e 's/<web-context>auth<\/web-context>/<web-context>keycloak\/auth<\/web-context>/' $JBOSS_HOME/standalone/configuration/standalone.xml
    RUN sed -i -e 's/<web-context>auth<\/web-context>/<web-context>keycloak\/auth<\/web-context>/' $JBOSS_HOME/standalone/configuration/standalone-ha.xml
    RUN sed -i -e 's/name="\/"/name="\/keycloak\/"/' $JBOSS_HOME/standalone/configuration/standalone.xml
    RUN sed -i -e 's/name="\/"/name="\/keycloak\/"/' $JBOSS_HOME/standalone/configuration/standalone-ha.xml
    RUN sed -i -e 's/\/auth/\/keycloak\/auth"/' $JBOSS_HOME/welcome-content/index.html
    

    【讨论】:

    • 遗憾的是,这对 Keycloak v11.0.2 没有帮助 - 可能还有更多实例需要同时更换?
    • @pat-s 有一些新文件:RUN sed -i -e 's/&lt;web-context&gt;auth&lt;\/web-context&gt;/&lt;web-context&gt;keycloak\/auth&lt;\/web-context&gt;/' $JBOSS_HOME/domain/configuration/domain.xml
    【解决方案4】:

    我还可以确认,使用 docker image keycloak 6.0.1 时,standalone-ha.xml 文件也需要使用 sed 命令更改...

    RUN sed -i -e 's/<web-context>auth<\/web-context>/<web-context>keycloak\/auth<\/web-context>/' /opt/jboss/keycloak/standalone/configuration/standalone.xml
    RUN sed -i -e 's/<web-context>auth<\/web-context>/<web-context>keycloak\/auth<\/web-context>/' /opt/jboss/keycloak/standalone/configuration/standalone-ha.xml
    
    

    【讨论】:

      【解决方案5】:

      就我而言,我在 Docker 上有一个现有的 Keycloak (v8.0.1),所以我也必须更新数据库。

      1. 使用以下环境变量启动 Keycloak Docker 容器:

        PROXY_ADDRESS_FORWARDING:'真'

      2. 更新数据库。我正在使用 Postgres。

        psql -U keycloak -d keycloak

        更新领域集 ssl_required='NONE';

      3. 重启 Keycloak

      Example for Postgres DB, by Sairam Krish

      【讨论】:

        猜你喜欢
        • 2019-07-05
        • 2017-03-16
        • 2017-12-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-30
        • 2021-03-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多