假设我有一个DNS条目:mysite.sample。我正在开发,并有我的网站在本地运行在http://localhost:8080的副本。我希望这个网站可以使用(假的) DNS:http://mysite.sample,联系到,而不强迫记住这个站点正在运行的端口。我可以设置/etc/hosts和nginx来做程序,但是.有更简单的方法吗?
我是否可以使用/etc/hosts和/或dnsmasq设置一个简单的DNS条目,其中还指定了一个非标准端口(与:80/:443不同)?不需要为nginx提供额外的配置
或者用更简单的方式表述:是否可以为/etc/hosts或dnsmasq中的dns条目提供端口映射?
发布于 2018-04-10 06:18:53
DNS与TCP端口无关。DNS是用来将名字(例如mysite.sample)解析成IP地址--有点像电话簿。
所以这是明确的“不”。然而,还有另一个解决方案,我试着解释一下。
当您在浏览器地址栏中输入http://mysite.sample:8080时,您的客户端(例如浏览器)将首先尝试将mysite.sample (通过OS调用)解析为IP地址。这是DNS启动的地方,因为DNS是您的名称解析器。如果发生这种情况,DNS的工作将完成,浏览器将继续运行。
这就是HTTP中的“魔力”发生的地方。浏览器连接到已解析的IP地址,所需端口(默认情况下为http为80,而https为443 )正在等待连接被接受,然后发送以下报头:
GET <resource> HTTP/1.1
Host: mysite.sample:8080现在,服务器读取这些头并相应地执行操作。大多数现代web服务器都有所谓的“虚拟主机”(即Apache)或“站点”(即nginx)。您可以为每个域配置多个vhost/站点。然后,web服务器将提供与请求的主机相匹配的站点(浏览器从地址栏撤回并通过Host header传递给服务器)。这是纯HTTP,与TCP无关。
如果您无法更改原始服务的端口(在您的例子中是8080),您可能需要在您的服务之前设置一个新的web服务器。这也被称为反向代理。我建议您阅读NGINX反向代理文档,但是您也可以使用Apache或任何其他现代web服务器。
对于nginx,只需设置一个新站点并将其重定向到您的服务:
location mysite.example {
proxy_pass http://127.0.0.1:8080;
}发布于 2018-04-11 06:49:42
在DNS中有一种发现服务使用的端口的机制,它被称为服务记录 (SRV),它具有以下形式
_service._proto.name. TTL class SRV priority weight port target.但是,要使用此记录,您需要有一个在调用之前引用该记录的应用程序。正如Dominique所说,这不是HTTP的工作方式。
我编写了一个先前的回答,它解释了这方面的一些背景,以及为什么HTTP不在标准中。(本文讨论WS,但底层讨论建议将其直接添加到HTTP协议中)
编辑后添加-
实际上,有一个IETF文件草稿在探索一种正式的方法来实现这一点,但它从未通过草案阶段。
本文档指定了一个名为http+srv的新URI方案,它使用DNS SRV查找来定位HTTP服务器。
https://stackoverflow.com/questions/49746426
复制相似问题