我在主机上的 localhost:8081 上有一个运行的服务器。
从 VM 开始,我希望能够从运行在 VM 内部的浏览器访问 http://localhost:8081,并将该请求转发到主机上运行的服务器。
主机运行的是 macOS 10.15.7(Catalina),虚拟机运行的是 Ubuntu 18.04。
这可能吗?如果可以,怎么做?
答案1
我希望能够
http://localhost:8081
从我的虚拟机内运行的浏览器进行访问,并将该请求转发到主机上运行的服务器。
您可能会遇到的一个基本问题是浏览器本身会自动映射名称本地主机到环回地址127.0.0.1
,它引用“本地”计算机(即您的 VM,而不是主机 PC)。
绕过此行为的一种可能方法是在 VM 上运行另一个 Web 服务器(例如 Apache)并让它将请求转发localhost
到主机 PC。
例如,在你的虚拟机上使用 Apache 时,你可以启用其代理功能(通过mod_proxy),然后添加虚拟主机类似于以下内容:
<VirtualHost *:8081>
ServerName localhost
# Forward all request for "localhost" to another computer
# Assuming the server on the host PC runs on port 80
ProxyPass / http://1.2.3.4/
ProxyPassReverse / http://1.2.3.4/
# Assuming the server on the host PC runs on port 8081
# ProxyPass / http://1.2.3.4:8081/
# ProxyPassReverse / http://1.2.3.4:8081/
</VirtualHost>
笔记
- 您可能需要在 Ubuntu上更改
Listen 80
为。Listen 8081
/etc/apache2/ports.conf
- 您应该能够在 Ubuntu 上启用
mod_proxy
和任何其他所需的模块(mod_proxy_http
例如mod_proxy_html
)/etc/apache2/mods-available
。 - 在 Ubuntu 下,虚拟主机应该放在 中
/etc/apache2/sites-available
。 - 请注意基于名称的虚拟主机,主机的顺序可能很重要(尽管在您的情况下这似乎不太可能成为问题)。
- 在这种情况下,常见的 Apache 虚拟主机指令
ServerAlias
应该DocumentRoot
是不必要的。 - 上面给出的 IP 地址(即
1.2.3.4
)仅供参考。您应将其替换为您的虚拟机用于与主机 PC 通信的 IP 地址,或您的虚拟机可以解析的其他有效主机名(例如http://some-local-name
)。 /
代理时,需要在上述 IP 地址后面添加一个/
。- 为了简单起见,您应避免在
ProxyPass
和ProxyPassReverse
指令中使用 HTTPS。 - 任何时候对 Apache 进行配置更改,都应重新启动以使这些更改生效。
- 防火墙可能仍然是一个问题。
- 如果您不喜欢 Apache,Nginx 是另一个具有类似选项的 Web 服务器。
有关在 Ubuntu 上设置 Apache 的官方文档(包括启用虚拟主机、模块和重新启动 Apache)可用这里。