如何将子域路由到在我的家庭服务器上特定端口上运行的应用程序?

use*_*003 2 networking dns home-networking subdomain

我的家庭服务器上有一个 Web 应用程序在非标准端口 ( 9177) 上运行。在我的本地网络上,我可以直接以http://192.168.0.13:9177/.

但是,我想公开地向全世界公开。我拥有一个域 ( example.com),我想指向app.example.com我本地运行的应用程序。

在此处输入图片说明

做这个的最好方式是什么?我需要运行 DNS 服务器吗?如果是这样,它在哪里运行以及使用哪些工具来配置它?

你可以假设我的路由器有一个固定的 IP,在这个问题的范围内不会改变。DNS 记录已正确配置为指向我的路由器。

谢谢!

Ana*_*man 10

我是否需要运行 DNS 服务器 [这样做]?

不可以。您需要运行反向代理。Apache 或 nginx 都是可用于此目的的 Web 服务器。

简而言之,您将为 创build一个虚拟主机(Apache)或服务器块(nginx)app.example.com,然后将其设置为转发app.example.com对例如 的请求http://192.168.0.13:9177

关于 DNS,app.example.com将指向您的公共 IP(通常是您的路由器,然后将 Web 请求定向到您的反向代理)。

  • 拥有一个反向代理可能很好,但我没有看到需要一个。一个简单的 DNAT 规则应该正确吗?我在这个场景中缺少什么表明需要更多的东西? (7认同)
  • @user2490003 DNAT == 大多数 SOHO 路由器中的端口转发。几乎没有人称它为 DNAT,即使这是正确的术语。 (5认同)

Vil*_*lx- 7

其他答案都是正确的,但我会详细说明一些更小的细节。

要意识到的第一件事是 - 当您http://app.example.com/path/to/resource.jpeg在浏览器中输入内容时,浏览器所做的第一件事就是使用 DNS 系统将其转换app.example.com为您的外部 IP 地址(显然,您需要自己进行设置)。然后它尝试连接到该 IP 地址。

由于未在原始 URL 中指定端口,它将查看协议(http在本例中)并选择该协议的默认端口号(80for http)。然后它连接到那个 IP 和那个端口。

请注意,您无法在 DNS 系统中指定不同的端口。如果自定义端口不在开始的 URL 中,则将使用默认值,句点。

现在,由于您的实际 Web 服务器在内部 IP 地址上运行在路由器后面,而外部 IP 地址属于您的路由器,因此您需要在路由器上设置端口转发。因此,当有人连接到externalIP:80路由器时,将创建另一个连接192.168.0.13:9177并在两个连接之间来回转发所有数据(吹毛求疵:实际上有点不同,但您可以这样想)。

只要您只有一个 Web 应用程序,这一切都很好。但是,如果您想拥有两个 Web 应用程序,并通过域来区分它们 - 您不能这样做。您请求的精确域仅在连接打开后才传输,但路由器需要在连接打开之前做出端口转发决定。它不知道传入请求是针对哪个域的,直到为时已晚。

在这种情况下,您需要反向代理。反向代理就像另一个 Web 应用程序,但它所做的只是接受 HTTP 请求,检查请求的域,根据该域打开另一个连接,然后在它们之间转发所有数据。它比仅仅盲目转发二进制数据(路由器为其端口转发所做的工作)要复杂一些,因为反向代理需要理解(并可能修改)HTTP 请求的内容。

反向代理可能安装在您的路由器上,或者安装在 Web 应用程序旁边的家庭服务器上,或者安装在单独的机器上。随你(由你决定。

哦,如果您的网络应用程序都使用相同的网络服务器(如 Apache Httpd 或 Nginx),那么它们自己支持“虚拟主机”,您根本不需要额外的反向代理。

PS 稍微超出范围,但也考虑设置 HTTPS。有了Let's Encrypt提供的免费(如啤酒)证书,这真是个好主意。您的反向代理也可以处理这部分,这意味着不需要对 Web 应用程序进行更改。


归档时间:

查看次数:

952 次

最近记录:

4 年,4 月 前