答案1
我是否需要运行 DNS 服务器[来执行此操作]?
不。你需要运行反向代理。Apache 或 nginx 都是可以用于此目的的 Web 服务器。
简而言之,您可以为 创建一个虚拟主机(Apache)或服务器块(nginx)app.example.com
,然后将其设置为将对 的请求转发app.example.com
到例如http://192.168.0.13:9177
。
关于 DNS,app.example.com
将指向您的公共 IP(通常是您的路由器,然后将 Web 请求定向到您的反向代理)。
答案2
其他答案都是正确的,但我会稍微详细说明一下,以澄清一些细节。
首先要意识到的是 - 当您http://app.example.com/path/to/resource.jpeg
在浏览器中输入时,浏览器所做的第一件事就是使用 DNS 系统将其转换app.example.com
为您的外部 IP 地址(显然,您需要自行设置)。然后它会尝试连接到该 IP 地址。
由于原始 URL 中未指定端口,因此它将查看协议(http
在本例中)并选择该协议的默认端口号(80
对于http
)。然后它会连接到该 IP 和该端口。
请注意,您无法在 DNS 系统中指定其他端口。如果 URL 中一开始没有自定义端口,则将使用默认端口,就是这样。
现在,由于您的实际 Web 服务器在路由器后面的内部 IP 地址上运行,而外部 IP 地址属于您的路由器,因此您需要在路由器上设置端口转发。这样,当有人连接到路由器时,路由器externalIP:80
将创建另一个连接,192.168.0.13:9177
并在两个连接之间来回转发所有数据(吹毛求疵:实际上有点不同,但您可以这样想)。
只要您只有一个 Web 应用程序,这一切都很好。但是如果您想拥有两个 Web 应用程序,并通过域来区分它们 - 您不能以这种方式进行。您请求的精确域仅在连接已打开后才传输,但路由器需要在连接打开之前做出端口转发决定。它不知道传入请求是针对哪个域的,直到为时已晚。
在这种情况下,您需要反向代理。反向代理就像另一个 Web 应用程序,但它所做的只是接受 HTTP 请求,检查请求的域,根据该域打开另一个连接,然后在它们之间转发所有数据。这比盲目转发二进制数据(路由器为其端口转发所做的操作)要复杂一些,因为反向代理需要理解(并可能修改)HTTP 请求的内容。
反向代理可能安装在路由器上,或安装在 Web 应用程序旁边的家庭服务器上,或安装在单独的机器上。这取决于您。
哦,如果您的 Web 应用程序都使用相同的 Web 服务器(例如 Apache Httpd 或 Nginx),那么它们本身就支持“虚拟主机”,您根本不需要额外的反向代理。
PS 稍微超出范围,但请考虑设置 HTTPS。免费(如啤酒)证书可从让我们加密,这确实是个好主意。您的反向代理也可以处理这部分,这意味着无需对 Web 应用程序进行任何更改。
答案3
一些提供商不允许您修改连接到其服务的路由器以将传入的数据包转发到特定的内部 IP:PORT。
例如,AT&T 在其固定无线网络上就这么做了,而且据我所知,Cox 也做了同样的事情。
如果是,则取决于路由器及其运行的软件。如果它有 DMZ 设置,您应该能够简单地在其中配置源端口为 80(或 443),目的地为您的内部 IP 和端口。
如果使用某种形式的 Linux 发行版作为路由器,那么您可能只需要配置 Firewalld 或 iptables(您必须进行搜索,我已经有一段时间没有这样做了)