首页 > 解决方案 > 用于密钥斗篷的 Nginx 反向代理

问题描述

我已经在 localhost:7070 部署了一个 keycloak 服务器(在 Docker 容器中,它在 8080 上运行),现在我想为它设置一个反向代理。这是我的conf:

server {
    listen       11080 ;

    location /auth/ {
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Server $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-Host   $host;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_pass  http://localhost:7070/auth/;
    }
}

当我访问时http://my-ip:11080/auth,我可以看到欢迎页面。但是当我尝试按照欢迎页面上的链接登录时,它显示错误并且现在的 url 是http://my-ip:auth/admin/,但我希望http://my-ip:11080/auth/admin/使用端口11080

当我手动输入http://my-ip:11080/auth/admin并按 Enter 时,它会重定向到http://my-ip/auth/admin/master/console/,但我希望http://my-ip:11080/auth/admin/master/console/ 使用端口11080

我还尝试了许多我找到的解决方案,但现在没有运气。你能告诉我这里有什么问题吗?

更新: docker-compose.yml

version: "3.7"
services:
  keycloak:
    volumes:
      - keycloak-pgdb:/var/lib/postgresql/data
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "7070:8080"
    environment:
      - KEYCLOAK_USER=admin
      - KEYCLOAK_PASSWORD=password
      - DB_VENDOR=postgres
      - POSTGRES_PASSWORD=root
      - POSTGRES_DB=keycloak
      - DB_ADDR=localhost
      - DB_USER=postgres
      - DB_PASSWORD=root
      - PROXY_ADDRESS_FORWARDING=true
volumes:
  keycloak-pgdb:

码头工人ps:

CONTAINER ID  IMAGE                   COMMAND           CREATED          STATUS          PORTS                               NAMES
30ad65460a0c  pic-keycloak_keycloak   "entrypoint.sh"   38 minutes ago   Up 38 minutes   5432/tcp, 0.0.0.0:7070->8080/tcp    pic-keycloak_keycloak_1

标签: dockernginxkeycloakreverse-proxynginx-reverse-proxy

解决方案


容器中的应用程序不知道您正在转发 port 11080,因此当应用程序呈现响应时,如果它遵循X-Forwarded-xxxxx标头,它将使用X-Forwarded-Poroto来确定应该将重定向发送到哪里。

根据您的应用程序,您有 2 个选项可以处理这种情况:

  1. X-Forwarded-Port可以告诉 识别标头的应用程序重定向到特定端口,例如在这种情况下:
        proxy_set_header X-Forwarded-Port 11080
    
  2. 不遵守标头中提供的规则的遗留应用程序可以通过响应重写传递来处理。这是sub_filter的示例:
    sub_filter     'http:/my-ip/auth'    'http:/my-ip:11080/auth';
    
    要使 sub_filter 工作,应安装并启用该模块--with-http_sub_module

推荐阅读