NGinx 和多个 docker 容器,但有一个子域
NGinx and multiple docker containers but one subdomain
我的目标
我想使用单个 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 部分,它是使用 ASP.NET 核心创建的,在第二个 docker 容器中运行。我希望这两个网站共享并使用一个 ASP.NET Core Web Api 项目,运行 在第三个 docker 容器中。因此,一个 NodeJS 项目和两个 ASP.NET 核心项目,它们都位于一个子域中:
- 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" 位置处理,这一点很重要。我想象我会有一个 "catch all" 位置,它捕获所有不以 /admin 或 /api.
开头的流量
谢谢!
在您的 nginx 配置中您要添加位置规则,例如
location /admin {
proxy_pass http://admin_container:6000/;
}
location /api {
proxy_pass http://api_container:5500/;
}
这会将 /admin
重定向到 admin_container
端口 6000
,并将 /api
重定向到 api_container
和端口 5500
。
docker-compose 在它的所有容器之间创建一个网络。这就是 http://api_container:5500/
指向名为 api_container
的容器和端口 5500
的原因。这可以用于容器之间的通信。您可以在此处阅读更多相关信息 https://docs.docker.com/compose/networking/
我的目标
我想使用单个 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 部分,它是使用 ASP.NET 核心创建的,在第二个 docker 容器中运行。我希望这两个网站共享并使用一个 ASP.NET Core Web Api 项目,运行 在第三个 docker 容器中。因此,一个 NodeJS 项目和两个 ASP.NET 核心项目,它们都位于一个子域中:
- 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" 位置处理,这一点很重要。我想象我会有一个 "catch all" 位置,它捕获所有不以 /admin 或 /api.
开头的流量谢谢!
在您的 nginx 配置中您要添加位置规则,例如
location /admin {
proxy_pass http://admin_container:6000/;
}
location /api {
proxy_pass http://api_container:5500/;
}
这会将 /admin
重定向到 admin_container
端口 6000
,并将 /api
重定向到 api_container
和端口 5500
。
docker-compose 在它的所有容器之间创建一个网络。这就是 http://api_container:5500/
指向名为 api_container
的容器和端口 5500
的原因。这可以用于容器之间的通信。您可以在此处阅读更多相关信息 https://docs.docker.com/compose/networking/