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

问题描述 投票:1回答:1

我的目标

我想使用一个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网站。我还想要一个Admin部分,使用在第二个docker容器中运行的ASP.NET Core创建。我希望这两个网站能够共享和使用在第三个docker容器中运行的单个ASP.NET Core Web Api项目。所以,一个NodeJS项目和两个ASP.NET核心项目都存在于一个子域中:

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

我到目前为止所拥有的

到目前为止,我已经为NodeJS应用程序设置了NGinX反向代理和一个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容器非常重要,而不是由“catch all”位置处理。我想象的是,我将拥有一个“全部捕获”的位置,捕获所有未启动的流量/管理员或/ api。

谢谢!

docker nginx nginx-location nginx-config
1个回答
1
投票

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

  location /admin {
    proxy_pass http://admin_container:6000/;
  }

  location /api {
    proxy_pass http://api_container:5500/;
  }

这将/admin重定向到admin_container端口6000,并将/api重定向到api_container5500端口。

docker-compose在它的所有容器之间创建一个网络。这就是为什么http://api_container:5500/指向名为api_container5500港口的集装箱。这可以用于容器之间的通信。你可以在这里阅读更多相关信息https://docs.docker.com/compose/networking/

© www.soinside.com 2019 - 2024. All rights reserved.