将DNS条目映射到特定端口

时间:2018-04-10 06:05:15

标签: nginx dns dnsmasq

假设我有这个DNS条目:mysite.sample。我正在开发,并在http://localhost:8080本地运行我的网站副本。我希望使用(假)DNS可以访问此网站:http://mysite.sample没有被强制记住此网站正在运行的端口。我可以设置/etc/hosts nginx来代理,但是......有更简单的方法吗?

我可以使用/etc/hosts和/或dnsmasq以某种方式设置一个简单的DNS条目,其中还指定了非标准端口(不同于:80 / :443) ?无需为nginx提供额外配置?

或者用更简单的方式表达:是否可以在/etc/hostsdnsmasq中为dns条目提供端口映射?

2 个答案:

答案 0 :(得分:1)

DNS与TCP端口无关。 DNS可以将名称(例如mysite.sample)解析为IP地址 - 有点像电话簿。

所以它是明确的" NO"。但是,还有另一个解决方案,我试着解释一下。

当您在浏览器网址栏中输入http://mysite.sample:8080时,您的客户端(例如浏览器)将首先尝试将mysite.sample(通过操作系统调用)解析为IP地址。这是DNS开始的地方,因为DNS是你的名字解析器。如果发生这种情况,DNS的工作就完成了,浏览器就会继续。

这就是"魔术"在HTTP中发生。浏览器连接到已解析的IP地址和所需的端口(对于http默认为80,对于https默认为443),正在等待接受连接,然后发送以下标头:

GET <resource> HTTP/1.1
Host: mysite.sample:8080

现在服务器读取这些标头并相应地执行操作。大多数现代Web服务器都有称为“虚拟主机”的东西。 (即Apache)或&#34; sites&#34; (即nginx)。您可以配置多个vhosts / sites - 每个域一个。然后,Web服务器将提供与请求的主机匹配的站点(浏览器从URL栏检索该站点并通过Host HTTP头传递给服务器)。这是纯HTTP,与TCP无关。

如果您无法更改原始服务的端口(在您的情况下为8080),则可能需要在服务前设置新的Web服务器。这也称为反向代理。我建议您阅读NGINX Reverse Proxy文档,但也可以使用Apache或任何其他现代Web服务器。

对于nginx,只需设置一个新网站并将其重定向到您的服务:

location mysite.example {
    proxy_pass http://127.0.0.1:8080;
}

答案 1 :(得分:1)

DNS中有一种机制可以发现服务使用的端口,它被称为Service Record(SRV),格式为

_service._proto.name. TTL class SRV priority weight port target.

但是,要使用此记录,您需要有一个应用程序在进行调用之前引用该记录。正如Dominique所说,这不是HTTP的工作方式。

我写了一篇previous answer来解释一些背景知识,以及为什么HTTP不在标准中。 (本文讨论了WS,但基础讨论建议直接将其添加到HTTP协议中)

编辑添加 -

实际上有一个draft IETF document正在探索一种正式的方法来做到这一点,但它从未进入过草案阶段。

  

本文档指定了一个名为http + srv的新URI方案,该方案使用DNS SRV查找来定位HTTP服务器。

有一个特定的答案here指向一个有趣的帖子here