NGinx和多个docker容器,但一个子域

时间:2019-03-31 18:56:04

标签: docker nginx nginx-location nginx-config

我的目标

我想使用一个NGinx docker容器作为代理。

我希望它响应我的域“ sub.domain.com”上的流量,并侦听端口80和443。

当流量通过 / admin 进入时,我希望它将所有流量定向到一个Docker容器(例如... admin_container:6000 )。

当流量进入 / api 时,我希望它将所有流量定向到另一个Docker容器(例如... api_container:5500 )。

当流量通过任何其他路径 / anything_else )进入时,我希望它将所有流量定向到另一个Docker容器(例如... website_container: 5000 )。

一些有用的上下文

很快,请允许我提供一些背景信息,以帮助您。我有一个在Docker容器中运行的NodeJS网站。我还希望有一个使用ASP.NET Core创建的Admin部分,该部分在第二个Docker容器中运行。我希望这两个网站共享并利用在第三个Docker容器中运行的单个ASP.NET Core Web Api项目。因此,一个NodeJS项目和两个ASP.NET Core项目都生活在一个子域中:

  • sub.domain.com/
    • 为主要网站服务
  • sub.domain.com/admin
    • 为管理网站服务
  • sub.domain.com/api
    • 服务API端点并处理数据库连接

到目前为止我有什么

到目前为止,我已经设置了NGinX反向代理和用于NodeJS应用程序的单个docker容器。当前,:80上的所有流量都重定向到443。443上的所有流量都定向到NodeJS docker容器,该容器在:5000上私下运行。我承认我对NGinx不太满意,并且不完全了解它的工作原理。

NGinx.conf文件

worker_processes 2;

events { worker_connections 1024; }

http {
    sendfile on;
    proxy_buffer_size   128k;
    proxy_buffers   4 256k;
    proxy_busy_buffers_size   256k;

    upstream docker-nodejs {
        server nodejs_prod:5000;
    }

    server {
        listen 80;
        server_name sub.domain.com;
        return 301 https://$host$request_uri;
    }

    server {
        listen 443 ssl;
        server_name sub.domain.com;
        ssl_certificate     /etc/nginx/ssl/combined.crt;
        ssl_certificate_key /etc/nginx/ssl/mysecretkeyfile.key;

        location / {
            proxy_redirect     off;
            proxy_set_header   Host $host;
            proxy_set_header   X-Forwarded-Proto https;
            proxy_set_header   X-Forwarded-Ssl on;
            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 $server_name;
            proxy_pass         http://docker-nodejs;
        }
    }

}

快速说明:在上面的代码中,“ nodejs_prod:5000”是指名称为“ nodejs_prod”且在端口5000上侦听的容器。我不知道它是如何工作的,但是它正在工作。 docker以某种方式在专用网络中创建DNS条目,每个容器名称一个。我实际上正在使用docker-compose。

我的实际问题:当我还有2个网站(每个docker容器)时,此NGinx.conf文件的外观如何。必须将/ admin和/ api发送到正确的docker容器,并且不要由“全部捕获”位置处理。我正在想象我将拥有一个“全部捕获”位置,该位置捕获所有不以/ admin或/ api开始的流量。

谢谢!

1 个答案:

答案 0 :(得分:1)

在您的nginx配置中,您要添加位置规则,例如

Log.i(Tag, "Response code: "+response.code()); и Log.i(getClass().getSimpleName(), "Error: "+t)

这会将I/: Error: java.net.UnknownServiceException: CLEARTEXT communication to www.omdbapi.com not permitted by network security policy 重定向到 location /admin { proxy_pass http://admin_container:6000/; } location /api { proxy_pass http://api_container:5500/; } 端口/admin,并将admin_container重定向到6000和端口/api

docker-compose在所有容器之间创建一个网络。这就是api_container指向名为5500的容器和端口http://api_container:5500/的原因。这可以用于容器之间的通信。您可以在这里https://docs.docker.com/compose/networking/

了解更多信息