Nginx代理配置docker

6
这是问题所在:
主机上有多个Docker应用程序在不同的端口上运行,例如App1 @ 3001,App2 @ 3002...3100等。
现在我想以此格式访问这些应用:http://hostname.com/app1http://hostname.com/app2...
为了实现这一点,我在主机上运行nginx来代理请求到正确的端口,基于子URI。
location = /app1 {
    proxy_redirect http://hostname:3001/;
    include /etc/nginx/proxy_params;
}

location ^~ /app1 {
    proxy_redirect http://hostname:3001/app1;
    include /etc/nginx/proxy_params;
}

但是当网站的子URI更改或网站重定向时,这种方法并不起作用。例如:
If I visit the site at hostname:3001 -> I can see the site
If I visit the site at http://hostname.com/app1 -> I can see the site
If the site page is at hostname:3001/static/index.html then when i access it as http://hostname.com/app1 the page changes to http://hostname.com/static/index.html -> I get 404.

有没有其他方法可以实现这个目标?或者唯一的方法是将DNS设置为app1.hostname.com并进行基于名称的路由?


你的问题与Docker或Nginx无关。这是一个更通用的反向代理问题,因为应用程序路径已更改:你的应用程序期望在“/”处提供服务,而反向代理在“/app1”处提供服务。我相信你可以很容易地找到问题描述和解决方法。 - Alexander Azarov
是的,我很久以前就问过这个问题。我通过为容器运行的主机创建DNS记录,并将容器端口映射到主机端口,然后在nginx中添加一个简单的配置,将app1.abc.com映射到主机:端口的代理传递。它运作良好,而且易于扩展。 - nmd
2个回答

2
在你的server {}块内,你需要添加以下内容:
location /app1 {
    rewrite ^/app1(.*) /$1 break;
    proxy_pass http://hostname:3001/;
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

location /app2 {
    rewrite ^/app2(.*) /$1 break;
    proxy_pass http://hostname:3002/;
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

这里的重写规则将正确的URI传递到端口。

1
你可以让每个应用程序监听不同的端口(例如3000和3001),然后按以下方式配置nginx(将其包含在server {}定义块内):
 location /app1 {
  proxy_pass        http://localhost:3000;
  proxy_set_header  X-Real-IP  $remote_addr;
 }

 location /app2 {
  proxy_pass        http://localhost:3001;
  proxy_set_header  X-Real-IP  $remote_addr;
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接