我目前在 Docker 的 8090 端口和 Hesk 的 8088 端口上运行 Keycloak,并在主机系统上运行 Nginx 来管理流量路由。我的 Nginx 配置设置为重定向和处理两个子域(auth.example.de 和 support.example.de)的 SSL。这是 Nginx 配置片段:
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
tcp_nopush on;
keepalive_timeout 65;
gzip on;
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
server_name auth.example.de;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name auth.example.de;
ssl_certificate [PATH TO CRT];
ssl_certificate_key [PATH TO KEY];
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://localhost:8090;
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;
}
}
server {
listen 80;
server_name support.example.de;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name support.example.de;
ssl_certificate [PATH TO CRT];
ssl_certificate_key [PATH TO KEY];
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://localhost:8088;
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;
}
}
}
在我的主机文件中,我已覆盖 auth.example.com 和 support.example.com 的 DNS 条目以指向 127.0.0.1。当 Hesk 尝试通过 OIDC 连接到 auth.example.com 进行身份验证但无法访问时,就会出现此问题。我怀疑,由于 DNS 解析返回 127.0.0.1,因此请求不会通过主机系统上的 Nginx 进行路由,导致它从容器内返回索引页面,而不是到达 Keycloak 身份验证页面。
有没有人遇到过类似的问题,或者有没有人对如何通过 Nginx 正确路由这些内部请求以允许通过主机进行容器到容器通信有建议?
编辑:顺便提一下,我在 Windows 11 上使用 WSL 2 和 Ubuntu 作为 Docker 后端
我通过将以下条目添加到 hesk 容器内的 /etc/hosts 来修复它:
// host.docker.internal resolves to: 192.168.65.2
192.168.65.2 auth.example.de
也许在 docker-compose.yml 中添加 extra_hosts 也可以,但我还没有尝试过。