Dockerized反向代理

时间:2019-02-20 23:57:49

标签: docker ssl nginx reverse-proxy

我正计划在一个主机上托管三个网站,我们称其为raspi-dev:

home.redacted.ca,brew.redacted.ca,www.redacted.ca(或redacted.ca)

要启用此功能,我正在使用一个在端口80上接受传入连接的容器。这是反向代理配置的一个片段:

server {
    server_name brew.redacted.ca;
    listen 80;
    location / {
        proxy_pass http://brewweb;
    }
}

brewweb是一个名为brewweb的容器。到目前为止,通讯正常。导航到http://brew.redacted.ca时,我得到的正是我所期望的:

"GET / HTTP/1.1" 301 169 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:60.0) Gecko/20100101 Firefox/60.0" "-"

重点是将流量重定向到https。这是来自其他Web服务器的代码:

server {
    listen 80;
    server_name brew.redacted.ca;
    return 301 https://brew.redacted.ca$request_uri;
}


server {
    server_name brew.redacted.ca;
    root /var/www/brew;
    listen 443 ssl;
    location / {
        try_files $uri $uri/ /index.html =404;
    }

    ssl_certificate /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/privkey.pem;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:!aNULL:!MD5;
}

因此它可以按预期工作。您转到http://brew.redacted.ca,它告诉您返回端口443。但是,在浏览器中,我看到一个无效的链接:“无法连接”。我现在的假设是,这是因为我的反向代理(它是在主机网络上侦听的唯一容器)无法接收然后在将来的443请求中转发。我对如何处理这个有点不知所措..我是否获得反向代理证书???我什至会怎么做,因为它本身甚至都没有提供任何内容。

我愿意接受所有建议。

1 个答案:

答案 0 :(得分:0)

需要与客户端(而不是托管应用程序)进行安全对话的是您的代理。我在内部网络上执行此操作。我有一个docker主机,在单个Nginx反向代理后面运行着几个不同的开发人员工具。

所有SSL / TLS由代理服务器处理。实际为应用程序提供服务的Web服务器位于docker容器中,仅对Nginx代理容器可见。他们通过http而不是https与代理进行通信。

我正在使用为我的主服务器* .app.co颁发的通配符证书,其中具有www.app.co,utility.app.co和another.app.co的SA条目

Nginx代理服务器配置实际上最终看起来像这样:

ssl_certificate     redacted.pem
ssl_certificate_key redacted.key
ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers         HIGH:!aNULL:!MD5;
ssl_session_cache   shared:SSL:10m;
ssl_session_timeout 10m;

server {
  listen 80 default_server;
  server_name _;
  return 301 https://$host$request_uri;
}

server {
  listen 443;
  server_name www.app.co;
  proxy_pass http://www-container
  ...
}

server {
  listen 443 default_server;
  server_name www.app.co;
  proxy_pass http://www-container
  ...
}

server {
  listen 443;
  server_name another.app.co;
  proxy_pass http://another-container
  ...
}