Nginx 基于域名和端口的代理

Nginx 基于域名和端口的代理,nginx,proxy,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允许我正确访问所有这些站点。接下来,我需

我想我终于掌握了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.bar.com:80
公开限制对
service-a
的访问,以及通过
www.foo.com:5000
公开限制对
service-b
的访问时,麻烦就来了。在阅读了很多之后,我似乎不得不创建一个可怕的人工制品,称为代理,或反向代理,以使事情更加混乱。我不知道我在做什么,所以我首先潜入了nginx——我以前从未使用过nginx——因为有人告诉我它在处理许多小任务和请求方面比Apache好——我不知道如何将Apache变成代理,请注意。总之,nginx听起来非常适合于将请求传递到另一台服务器,因此我开始阅读文档,并生成了以下内容(除了正常工作的vhost):

这在某种程度上是有效的,直到我访问它,它会显示
service-b
。所以,我的问题是:我做错了什么?

nginx
(像Apache)对于给定的ip+端口组合总是有一个默认服务器。您只有一台服务器监听端口5000,因此它是端口5000上服务的默认服务器

因此,
blog.bar.com
(我假定解析为与
www.foo.com
相同的IP地址)将使用端口5000的默认服务器

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

server {
    listen 5000 default_server;
    root /var/empty;
}
可以使用多种技术使服务器不可访问

更多信息,请参阅

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