Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何临时将名称解析为本地主机端口?_Linux_Dns_Localhost_Resolve - Fatal编程技术网

Linux 如何临时将名称解析为本地主机端口?

Linux 如何临时将名称解析为本地主机端口?,linux,dns,localhost,resolve,Linux,Dns,Localhost,Resolve,我用rails开发网站,我正在寻找一种简单的方法为我的应用程序设置动态名称解析。我需要的最后一个产品是:每次启动rails应用程序(通过在应用程序文件夹中键入rails server,我希望在随机端口上运行它,如果我在浏览器上键入应用程序名称(如myapp.dev或其他),它将解析为正确端口上的本地主机 获取应用程序名称和生成随机端口的部分不是问题。问题是如何将名称解析为本地端口。linux上有没有简单的工具允许我这样做 现在,我能想到的最好办法是启动一个守护进程,跟踪rails应用程序的启动时

我用rails开发网站,我正在寻找一种简单的方法为我的应用程序设置动态名称解析。我需要的最后一个产品是:每次启动rails应用程序(通过在应用程序文件夹中键入rails server,我希望在随机端口上运行它,如果我在浏览器上键入应用程序名称(如myapp.dev或其他),它将解析为正确端口上的本地主机

获取应用程序名称和生成随机端口的部分不是问题。问题是如何将名称解析为本地端口。linux上有没有简单的工具允许我这样做

现在,我能想到的最好办法是启动一个守护进程,跟踪rails应用程序的启动时间,注释端口,并在
/etc/host
中添加一个带有应用程序名称的条目。然后,每当它收到请求时,它都会根据名称转发到正确的应用程序


我不相信这是最好的方法,因此非常感谢您的想法。

我不确定我是否正确理解您的问题,但DNS不是关于端口的。通过使用DNS,您可以将名称解析为IP而不是端口或从IP解析为名称(RevDNS)。在您的情况下,您要做的是在随机端口上启动应用程序时,转发另一个始终相同的端口

例如:

通过iptables将端口80转发到应用程序的随机端口。然后您将始终通过端口80访问应用程序

编辑:我无法将它粘贴到评论中,因为它太长了,所以我在这里给你答案:

您可以创建许多iptables规则,第一个应用程序将位于端口80、下一个81等。在浏览器中,您必须键入:apps.test.com(第一个应用程序)、apps.test.com:81(第二个应用程序)。。 另一种解决方案:如果您想拥有不同的域(而不是在冒号后键入端口),可以使用代理服务器, 并使用VirtualHost重定向到特定的应用程序。在代理配置中,您可以定义app1.test.com转到端口,例如8888,app2.test.com转到端口8889,然后在启动应用程序期间,您可以创建iptables规则或ssh tunel,将整个流量从端口8888重定向到您的随机端口 ruby应用程序。为了不让它变得更复杂,最好使用这些端口 您在代理中配置的,不被您的ruby应用程序使用 “字符串匹配”选项;匹配HTTP请求的主机字段,然后在启动应用程序时进行类似匹配, 创建iptables规则,该规则将通过指定主机字段重定向到端口80的所有内容 您的ruby应用程序端口。最后一个选项是使用SRV dns记录,但在您的 但无论如何,你可以选择所有这些选项,并选择一个最适合你的
你。

谢谢你的评论。但这样我只能让一个应用程序同时运行,因为所有应用程序都使用端口80,对吗?既然你说DNS与端口无关,我想除非像我建议的那样使用deamon,否则就没有其他方法了,因为浏览器必须对端口80执行所有请求。对吗?