这是关于 IP/端口的 DNS/主机名解析的规范问题
示例 1
我在端口 80 上运行一个 Web 服务器,另一个在端口 87 上运行。我想使用 DNS,以便 www.example.com 转到端口 87。如何仅使用 DNS 来完成此操作?
示例 2
我在我的服务器上的非标准端口上运行服务。如何让客户端自动连接到这个非标准端口?我可以使用 DNS 吗?是否有一些特定于应用程序的支持,其中 DNS 可以指示 IP 和端口?
示例 3
某些应用程序协议是否专门支持主机名感知,并允许根据此信息采取特殊行动?服务器故障上是否还有其他问题可以涵盖其中一些问题?
Commandeering:
这个问题最初是询问在同一台服务器上运行 IIS 和 Apache,但相同的概念可以应用于任何从客户端接收连接的服务器软件。下面的答案描述了使用 DNS 和应用程序协议支持为客户端分配连接的端口号的技术问题和解决方案。
您不能使用 DNS 指向端口(除非客户端支持 SRV 记录,否则大多数不支持)。
带有主机头的网站和协议
您必须使用一些前端方法来执行此操作。通常,您会使用前端 Web 服务器或专用代理软件根据标头中请求的服务器名称将连接从端口 80 转发到端口 !80。一些防火墙也可以基于主机头转发。
SRV 记录
一些客户端支持查找 SRV 记录,这些记录指示指定服务的服务器的主机名和端口号(即用户指定“example.com”,客户端查找 SRV 记录并在端口“255”上获取“server101.example.com” "; 然后连接到那个)。一些客户也会在不需要的地方实现这一点(例如,我的上一部智能手机会在设置新的电子邮件帐户时查找 SRV 记录)。
不幸的是,对 SRV 记录的支持很少见。只有少数显着的协议要求它支持(Jabber/XMPP、Kerberos、LDAP、SIP),而且即使是强制要求,也不是每个客户端都支持它。
当你在浏览器中输入http://www.domain.com时,就知道 HTTP 端口在 80 上。因此,如果你已经有服务,没有直接的方法将 www.domain.com 指向 87 端口在 IIS 中的该端口上运行。
话虽如此,有一些“解决方法”。
Sam 是对的,DNS 在端口方面是不可知的。在该端口上运行的服务会发生任何类型的端口重定向。因此,如果您别无选择,只能将其保留在端口 80 上,则需要对 IIS 做一些事情来实现这一点。
我还通过在 Apache 上使用 mod_proxy 解决了你的情况,不确定是否有办法使用 IIS 来做到这一点。
从技术上讲,您可以使用RFC 2782中定义的 DNS 服务器上的SRV 记录 来告诉浏览器哪些服务器在(子)域的哪些端口上处理 http:
这适用于许多协议/服务,尤其是在协议规范中已经定义了 SRV 记录的使用的情况下。
然而,正如这个“耻辱大厅”所说,大多数网络浏览器/客户端不支持这一点(对于 HTTP)。另请参阅why-do-browsers-not-use-srv-records。
交易基本上是,SRV 不是必须包含在 http 协议中的,因此每个实现它的浏览器解析 URL 的方式都不同于没有实现它的浏览器。
因此,您应该只将其用作一些可选的负载平衡,在内容方面选择哪个服务器无关紧要。“可选”,因为如果只有少数客户端实现它,它不会平衡大部分负载。
恐怕域名只能与IP地址相关联,而不能与端口相关联。
大多数 Web 服务器(例如 Apache、IIS 等)确实允许您将两个域托管在同一个 IP 地址上,因为 Web 请求包含一个标识请求本身中的域的主机头字段。
如果您说您正在使用的 Web 服务器是什么,我相信人们可以将您指向相关文档以根据需要设置您的服务器
DNS 没有重定向到特定端口的能力,所有 DNS 关心的是名称的 IP 地址解析,反之亦然。
一些服务,如动态 IP DNS 提供商,如NO-IP提供的服务可以帮助您执行类似的操作,以绕过家庭 DNS 服务上的 IP 阻塞。
为了在非标准端口上使用任何(TBT) 服务并且不在 URI 中写入端口,每个人都可以使用 RFC 2782 中定义的 SRV 记录。
区域中的所有其他 http 主机仍将在默认端口 80 上提供服务
最简单的方法是使用反向代理并将其设置为您的网络代理。您可以为它配置一个
nginx
或apache
。我过去也遇到过基本相同的问题,并制作了一个工具来以简单的方式实现这种配置。尔格:https ://github.com/cristianoliveira/ergo我一直在使用它,基本上,它就像一个魅力:)
在同一主机上部署两个 Web 服务器的一种方法是让它们都在两个不同 IPv6 地址上的端口 80 上侦听。IPv6 官方指定您可以为一个接口分配两个地址,并且有足够的 IPv6 地址可以做到这一点而不会用完地址。
这是未来的证明,您的两个域都可以有指向不同 IP 地址的 AAAA 记录,因此这些域最终位于不同的 Web 服务器上。
如果您也有一个 IPv4 地址,则可以使用 IPv4 地址上的端口 80 来运行反向代理。这样,仅限 IPv4 的客户端可以访问您的两个 Web 服务器。如果某些 Web 服务器与反向代理位于同一主机上并且某些 Web 服务器位于其他主机上,则反向代理方法甚至可以工作。
在这样的设置
example.org
中,可能有地址192.0.2.1
,2001:db8::1
而example.net
有地址192.0.2.1
和2001:db8::2
.我不知道技术细节,但我如何解决这个问题是通过创建指向指定 HTTP 端口的 CloudFront 分配。
然后使用 Route 53,我指向 CloudFront 分配。
虽然上面提到的内容非常清楚地表明 DNS 记录与端口无关(SRV 记录除外——大多数客户端都没有包含这些记录);有一种可能性:使用大多数 DNS 提供商(例如 easyDNS)提供的URL 转发服务
这将使您更容易为用户:
因此,从您的示例 www.example.com转到端口 87,使用此服务,您可以配置http://www.example.com以访问http://www.example.com:87(基本上只有域,将能够访问您的站点);您还可以使用它来调用常规 http 协议解析为https://www.example.com:87,甚至将某些子页面指向https://www.example.com:87/dologin
@kaperd 的 IPV6 解决方案似乎很完美,但是虽然我能够正确配置服务器,但我确实未能在 Chrome 上打开目标......也许它需要一些 twerking 而我没有花足够的时间。