基于域名和端口的代理

时间:2016-03-09 17:24:44

标签: nginx proxy

我想我终于掌握了Docker的工作方式,所以我为下一步做好了准备:将一大堆不相关的应用程序塞进一个单一的服务器中,只需一个公共IP。比如说,我有许多基于Apache2-VHost的遗留网站,所以我能想到的最好的办法是运行一个LAMP容器来复制当前的情况,并在以后进行改进。为了论证,这里是我在172.17.0.2:80有一个容器

http://www.foo.com
http://blog.foo.com
http://www.bar.com

非常简单:发布端口80让我可以正确访问所有这些网站。接下来,我需要运行两个服务,所以我构建了两个容器

service-a -> 172.17.0.3:3000
service-b -> 172.17.0.4:5000

一切都很好,我可以私下从我的docker主机访问这些服务。如果我想仅通过service-a公开限制对service-a.bar.com:80的访问权限,而仅通过service-b公开限制对www.foo.com:5000的访问权限,则会出现问题。很多阅读之后,似乎我必须创建一个可怕的人工制品,称为代理或反向代理,以使事情更加混乱。我不知道我在做什么,所以我首先进入nginx - 这是我之前从未使用过的 - 因为有人告诉我它在处理许多小任务和请求时比Apache更好 - 不是我请注意,我知道如何将Apache变成代理。无论如何,nginx听起来非常适合需要将请求传递到另一台服务器的东西,所以我开始阅读文档并且我生成了以下内容(除了正确工作的虚拟主机):

upstream service-a-bar-com-80 {
        server 172.17.0.3:3000;
}

server {
        server_name service-a.bar.com;
        listen 80;

        location / {
                proxy_pass http://service-a-bar-com-80;
                proxy_redirect off;
        }
}

upstream www-foo-com-5000 {
        server 172.17.0.4:5000;
}

server {
        server_name www.foo.com;
        listen 5000;

        location / {
                proxy_pass http://www-foo-com-5000;
                proxy_redirect off;
        }
}

这有点奏效,直到我访问http://blog.bar.com:5000,然后显示service-b。所以,我的问题是:我做错了什么?

1 个答案:

答案 0 :(得分:0)

nginx(与Apache一样)总是有一个给定ip +端口组合的默认服务器。您只有一台服务器在端口5000上侦听,因此它是端口5000上服务的事实默认服务器。

所以blog.bar.com(我认为它解析为与www.foo.com相同的IP地址)将使用端口5000的默认服务器。

如果要阻止该服务器块作为端口5000的默认服务器,请使用相同的端口设置另一个服务器块,并使用default_server关键字对其进行标记,如下所示:

server {
    listen 5000 default_server;
    root /var/empty;
}

您可以使用多种技术来呈现服务器无法访问。

有关详情,请参阅this document