Apache Docker反向代理

Apache Docker反向代理,apache,docker,docker-compose,reverse-proxy,virtualhost,Apache,Docker,Docker Compose,Reverse Proxy,Virtualhost,我有一个web应用程序集合,每个应用程序都在自己的Docker容器中运行。我可以通过http://localhost:9001,例如。我想通过https://site.example.com,而不是。我有一个通配符让我们为example.com加密证书 我知道我需要Apache来完成从FQDN到端口的直接通信。因此,我设置了一个VirtualHost(如下)。正常的网络活动似乎运作良好。我可以正常浏览网站 但是,当我尝试使用OAuth(例如,BitBucket)登录时,会出现URI重定向不匹配错

我有一个web应用程序集合,每个应用程序都在自己的Docker容器中运行。我可以通过
http://localhost:9001
,例如。我想通过
https://site.example.com
,而不是。我有一个通配符让我们为
example.com
加密证书

我知道我需要Apache来完成从FQDN到端口的直接通信。因此,我设置了一个
VirtualHost
(如下)。正常的网络活动似乎运作良好。我可以正常浏览网站

但是,当我尝试使用OAuth(例如,BitBucket)登录时,会出现URI重定向不匹配错误。当我在容器外运行时,不会发生这种情况。我认为我的代理设置有问题。有人能建议如何纠正吗

<VirtualHost *:443>
    ServerAdmin admin@example.com
    ServerName site.example.com
    ServerSignature Off                                                                                                                        

    ProxyRequests Off                                                                                                                          
    ProxyPreserveHost On
    ProxyPass / http://127.0.0.1:9001/
    ProxyPassReverse / http://127.0.0.1:9001/

    <IfModule mod_headers.c>
        Header always set Strict-Transport-Security "max-age=15768000; includeSubDomains; preload"
    </IfModule>

    SSLEngine On
    SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/example.com/fullchain.pem

    AllowEncodedSlashes NoDecode
</VirtualHost>

服务器管理员admin@example.com
ServerName site.example.com
服务器签名关闭
代理请求关闭
代理主机
ProxyPass/http://127.0.0.1:9001/
ProxyPassReverse/http://127.0.0.1:9001/
标头始终设置严格的传输安全性“最大年龄=15768000;包括子域;预加载”
斯伦金安
SSLCertificateFile/etc/letsencrypt/live/example.com/cert.pem
SSLCertificateKeyFile/etc/letsencrypt/live/example.com/privkey.pem
SSLCertificateChainFile/etc/letsencrypt/live/example.com/fullchain.pem
AllowEncodeDSL节点代码
对于这种用例,是一种非常适合的工具。再加上,您可以在同一台主机上设置多个docker容器,每个容器都有自己的端点。要远程访问它们,您只需将远程主机的IP地址绑定到您的所有端点(或使用公共DNS为您执行此操作)

下面是一个使用Traefik的
docker compose.yml
示例

version: "3"

services:
  traefik:
    image: traefik:latest
    command: --api --docker --logLevel=DEBUG
    ports:
      - "80:80"
      - "443:443"
      - "8082:8080"
    volumes:
      # So that Traefik can listen to the Docker events
      - /var/run/docker.sock:/var/run/docker.sock
    labels:
      - "traefik.enable=false"

  your_first_container:
    image: <YOUR_IMAGE>
    labels:
      - "traefik.frontend.rule=Host:site.example.com"
      - "traefik.port=9001"
版本:“3”
服务:
特拉菲克:
图片:traefik:最新
命令:--api--docker--logLevel=DEBUG
端口:
- "80:80"
- "443:443"
- "8082:8080"
卷数:
#这样Traefik就可以监听Docker事件了
-/var/run/docker.sock:/var/run/docker.sock
标签:
-“traefik.enable=false”
您的第一个容器:
图片:
标签:
-“traefik.frontend.rule=Host:site.example.com”
-“traefik.port=9001”

感谢您的回复,但您能否解释一下这是如何解决问题的,对不起?Traefik为您创建了容器端口/FQDN绑定的抽象,我认为这是您问题的根源(但可能我错了)。您能准确地描述一下从OAuth系统得到的错误吗?