nginx 反向代理可访问多个 docker 个容器
Multiple docker containers accessible by nginx reverse proxy
我想 运行 多个 docker 一个主机 VM 上的容器,只能通过一个域访问。我想使用 request url 来区分容器。
为此,我尝试将 nginx 服务器设置为反向代理,并且 运行 它在容器中也侦听端口 80。
假设我在端口 3000 和 4000 上有两个容器 运行ning。
路由如下:
docker-host.example.com/3000 -> this will access container exposing port 3000
docker-host.example.com/4000 -> this will access container exposing port 4000
问题是我目前正在尝试为此类反向代理定义静态规则。
没有任何位置也能正常工作:
upstream application {
server <docker container>:3000;
}
server {
listen 80;
location / {
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_pass http://application/;
}
}
但是当我添加端口位置并尝试使用本地主机访问它时:{nginx 端口}/3000/
upstream application {
server <docker container>:3000;
}
server {
listen 80;
location /3000/ {
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_pass http://application/3000/;
}
}
似乎正确请求了第一个资源 (main html),但缺少任何其他依赖资源(例如此站点所需的 js 或 css)。
如果我检查日志中对这些资源的请求:
09:19:20 [error] 5#5: *1 open() "/etc/nginx/html/public/css/fonts.min.css" failed (2: No such file or directory), client: 172.17.0.1, server: , request: "GET /public/css/fonts.min.css HTTP/1.1", host: "localhost:8455", referrer:"http://localhost:8455/3000/"
所以请求url是http://localhost:8455/public/css/fonts.min.css
而不是http://localhost:8455/3000/public/css/fonts.min.css
请问您有什么建议吗?这种情况可能吗?
您可以 select 每个端口 docker 个容器,您的示例:
不过还有一种方法我比较喜欢,因为我觉得比较清晰,通过域名访问一个docker容器,例如:
无论你选择哪个,github中都有一个项目可以帮助你实现docker多容器反向代理:https://github.com/jwilder/nginx-proxy
我在 http://carlosvin.github.io/posts/reverse-proxy-multidomain-docker/
上使用 docker-compose 编写了一个类似场景的示例
我想 运行 多个 docker 一个主机 VM 上的容器,只能通过一个域访问。我想使用 request url 来区分容器。 为此,我尝试将 nginx 服务器设置为反向代理,并且 运行 它在容器中也侦听端口 80。
假设我在端口 3000 和 4000 上有两个容器 运行ning。 路由如下:
docker-host.example.com/3000 -> this will access container exposing port 3000
docker-host.example.com/4000 -> this will access container exposing port 4000
问题是我目前正在尝试为此类反向代理定义静态规则。 没有任何位置也能正常工作:
upstream application {
server <docker container>:3000;
}
server {
listen 80;
location / {
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_pass http://application/;
}
}
但是当我添加端口位置并尝试使用本地主机访问它时:{nginx 端口}/3000/
upstream application {
server <docker container>:3000;
}
server {
listen 80;
location /3000/ {
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_pass http://application/3000/;
}
}
似乎正确请求了第一个资源 (main html),但缺少任何其他依赖资源(例如此站点所需的 js 或 css)。 如果我检查日志中对这些资源的请求:
09:19:20 [error] 5#5: *1 open() "/etc/nginx/html/public/css/fonts.min.css" failed (2: No such file or directory), client: 172.17.0.1, server: , request: "GET /public/css/fonts.min.css HTTP/1.1", host: "localhost:8455", referrer:"http://localhost:8455/3000/"
所以请求url是http://localhost:8455/public/css/fonts.min.css
而不是http://localhost:8455/3000/public/css/fonts.min.css
请问您有什么建议吗?这种情况可能吗?
您可以 select 每个端口 docker 个容器,您的示例:
不过还有一种方法我比较喜欢,因为我觉得比较清晰,通过域名访问一个docker容器,例如:
无论你选择哪个,github中都有一个项目可以帮助你实现docker多容器反向代理:https://github.com/jwilder/nginx-proxy
我在 http://carlosvin.github.io/posts/reverse-proxy-multidomain-docker/
上使用 docker-compose 编写了一个类似场景的示例