假设我有这个DNS条目:mysite.sample
。我正在开发,并在http://localhost:8080
本地运行我的网站副本。我希望使用(假)DNS可以访问此网站:http://mysite.sample
,没有被强制记住此网站正在运行的端口。我可以设置/etc/hosts
和 nginx
来代理,但是......有更简单的方法吗?
我可以使用/etc/hosts
和/或dnsmasq
以某种方式设置一个简单的DNS条目,其中还指定了非标准端口(不同于:80
/ :443
) ?无需为nginx
提供额外配置?
或者用更简单的方式表达:是否可以在/etc/hosts
或dnsmasq
中为dns条目提供端口映射?
答案 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服务器。