我一直在想,是否可以使用一个 IP 地址上的单个端口托管多个应用程序。我的意思是一种类似于 Apache 虚拟主机的方法,您可以在其中将域/子域分配给特定目录,但我想这样做,我可以使用一个端口托管多个应用程序,但有一个子域决定您要连接到哪个应用程序。
在我的脑海里,这个工作原理的一个例子是:
app_server.exe (Instance 1): 111.111.111.111:9999
app_server.exe (Instance 2): 111.111.111.111:9999
然后如果我连接到app1.example.com
它就会连接到Instance 1
,而app2.example.com
会连接到Instance 2
。
我不知道这是否真的可行,但我已经看过了,而且我不知道它应该叫什么,所以这是我最好的选择。
答案1
是的,只要使用的应用程序级协议知道连接到哪个名称,就可以做到这一点。HTTP 知道这一点,因为有标头Host:
。TLS 知道这一点(现在),因为有“服务器名称指示”扩展。我相信 FTP 可以知道这一点,基于某些协议扩展,但如果您仍在使用 FTP,那么您就注定要失败。
如果协议没有有能力指示使用了哪个名称,那么您就无法这样做,因为服务器在建立连接时所知道的只是源和目标 IP/端口。其他一切都需要在更高级别传递。
关于你提议的实施方案,有一点需要注意:你需要有一个单身的监听接收连接的端口的服务,充分解析传入的数据以确定请求的名称,然后(和仅有的那么)它能否将请求路由到应用程序的不同实例进行处理。如果这些实例是单独的进程,那么可以通过某种方式将请求传达给将处理它的后端(例如代理,或者,如果你正在处理真的处理程序通常被称为良好的协议设计、套接字切换),但是如果您在同一个进程中实现各种处理程序(例如,使用配置或动态可加载模块),那么您只需创建一个包含请求的数据结构并将其传递给任何想要处理它的人即可。