docker - NGinx 和多个 docker 容器,但只有一个子域
问题描述
我的目标
我想使用单个 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 网站。我还想有一个管理部分,使用在第二个 docker 容器中运行的 ASP.NET Core 创建。我希望这两个网站共享和使用单个 ASP.NET Core Web Api 项目,在第三个 docker 容器中运行。因此,一个 NodeJS 项目和两个 ASP.NET Core 项目都存在于一个子域中:
- sub.domain.com/
- 服务于主要网站
- sub.domain.com/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”位置处理。我想象我将拥有一个“捕获所有”位置,该位置捕获所有不以 /admin 或 /api 开头的流量。
谢谢!
解决方案
在您的 nginx 配置中,您要添加位置规则,例如
location /admin {
proxy_pass http://admin_container:6000/;
}
location /api {
proxy_pass http://api_container:5500/;
}
这将重定向/admin
到admin_container
port6000
和/api
toapi_container
和 port 5500
。
docker-compose 在它的所有容器之间创建一个网络。这就是为什么http://api_container:5500/
指向名为的容器api_container
和端口5500
。这可用于容器之间的通信。你可以在这里阅读更多关于它的信息https://docs.docker.com/compose/networking/
推荐阅读
- html - Boostrap flexbox 同宽子
- git - 推送到远程存储库(例如 Google 源存储库)时缺少 git 标签
- python - 将 .txt 文件拆分为元素
- python - Python/SQLAlchemy - 如何使用多个 WHERE 子句快速查询数据库?
- chart.js - 图表内的 Chart.js 自定义图例
- python - python中的魔术方法和__str__函数
- node.js - C++ 入口点未显示在 node.js 分析输出中
- ionic-framework - 电子 + 离子 + child_process
- python - 将列从 Pandas 日期对象更改为 python 日期时间
- java - 如何避免在测试期间调用spring AOP方面