如何在Raspberry Pi上使用apache2将传入的子域请求转发到运行其他应用程序的本地主机端口?

如何在Raspberry Pi上使用apache2将传入的子域请求转发到运行其他应用程序的本地主机端口?,apache,raspberry-pi,reverse-proxy,raspbian,mod-proxy,Apache,Raspberry Pi,Reverse Proxy,Raspbian,Mod Proxy,我是网络和网络开发的新手,我正在尝试创建一个家庭项目,以获得乐趣、学习和一些我希望从家庭服务器获得的功能。到目前为止,我已经拥有了一个域名,并在我的路由器上设置了域名便宜和端口转发的DDN,以便将端口80上的传入请求转发到该端口上的Pi。我可以使用mydomain.com和www.mydomain.com访问基本index.html页面 我还希望将来能够远程访问在我的Pi上运行的一些其他应用程序。我目前正在研究的两个项目是Webmin和Shellinabox。目前,我可以分别访问mydomain

我是网络和网络开发的新手,我正在尝试创建一个家庭项目,以获得乐趣、学习和一些我希望从家庭服务器获得的功能。到目前为止,我已经拥有了一个域名,并在我的路由器上设置了域名便宜和端口转发的DDN,以便将端口80上的传入请求转发到该端口上的Pi。我可以使用mydomain.com和www.mydomain.com访问基本index.html页面

我还希望将来能够远程访问在我的Pi上运行的一些其他应用程序。我目前正在研究的两个项目是Webmin和Shellinabox。目前,我可以分别访问mydomain.com:12321和mydomain.com:4200来完成这项工作。但是,我希望以一种更干净的方式进行设置,这样我可以改为访问webmin.mydomain.com和ssh.mydomain.com。目前,我可以使用虚拟主机和重定向来实现这一点,但这会改变浏览器中的URL

作为一个更高级的解决方案,我正在尝试使用mod_代理,以便浏览器中的URL仍然显示我键入的URL。我做了一些搜索,认为最好的方法是在虚拟主机上使用mod_代理,但我一直无法让它工作

首先,我不认为我完全理解这是如何运作的。我的基本理解是,apache将传入的请求转发给另一台服务器,并将应答转发回原始请求机器。但是,在测试中,我尝试了以下方法:

<VirtualHost *:80>
    ServerName ssh.mydomain.com
    ProxyPreserveHost On
    ProxyRequests Off
    <Proxy *>
            Order allow,deny
            Allow from all
    </Proxy>
    ProxyPass / http://www.google.com
    ProxyPassReverse / http://www.google.com
</VirtualHost>

ServerName ssh.mydomain.com
代理主机
代理请求关闭
命令允许,拒绝
通融
ProxyPass/http://www.google.com
ProxyPassReverse/http://www.google.com
我的理解是,当我导航到ssh.mydomain.com时,谷歌主页会出现,但我会看到一个谷歌错误页面,上面写着:

  • 那是个错误。 在此服务器上找不到请求的URL/。我们只知道这些
  • 显然我误解了这一点。在此测试之前,我将代码块配置为:

    <VirtualHost *:80>
        ServerName ssh.mydomain.com
        ProxyPreserveHost On
        ProxyRequests Off
        <Proxy *>
                Order allow,deny
                Allow from all
        </Proxy>
        ProxyPass / http://localhost:4200
        ProxyPassReverse / http://localhost:4200
    </VirtualHost>
    
    
    ServerName ssh.mydomain.com
    代理主机
    代理请求关闭
    命令允许,拒绝
    通融
    ProxyPass/http://localhost:4200
    ProxyPassReverse/http://localhost:4200
    
    我还尝试了0.0.0.0和127.0.0.1而不是localhost,所以我认为这不是问题所在。当我将其设置为如上所示并导航到该URL时,我会在Safari中看到:

    Safari无法连接到服务器 Safari无法打开页面“”,因为Safari无法连接到服务器“ssh.mydomain.com”


    我不禁想知道https是否引起了一些问题。我没有在浏览器中输入它,但它会显示在它试图连接的页面中。我只是在这一点上不确定。当然,我可以让它发挥作用,但我想学习如何用我在这里尝试的方式来做。如果有其他方法不使用mod_proxy,我愿意接受其他想法,即保留浏览器URL而不是重定向,但从我读到的其他地方来看,这似乎是一种方法。提前感谢您的帮助。

    在这两个示例中,您似乎混合了http和https:1)通过http请求google可能会重定向到https 2)您的VirtualHost运行在端口80(http)上,您使用浏览器查询443(https)-试试我不使用https。实际上,我把你说的话准确地输入了我的浏览器。是否有可能我的浏览器在我显式键入http的情况下自动将其重定向到https?我已经尝试过Mac版Safari和Windows版Chrome。实际上,我做了一些进一步的测试,需要添加更多细节。我在原始评论中列出的错误是我在Mac上从Safari获得的错误。我怀疑Safari可能正在强制连接到HTTPS。如果有人知道如何解决这个问题,那就太好了,甚至我正在做的事情支持HTTPS也会更好。我最终想这样做,但我想先让它在HTTP上工作。也就是说,我在Windows上从Chrome上得到一个不同的错误:ERR\u CONNECTION\u TIMED\u OUT。我仍然可以访问它,尽管通过访问,这是有效的,这对我来说似乎很奇怪,因为我相信代理应该与直接输入相同。无论如何,我使用Postman和GET请求对它进行了测试,得到了一个HTML响应,其中包含一堆注释和两个函数,它们似乎“在必要时重定向到HTTPS”和“从计时器加载shellinabox,因为Konqueror有时无法正确处理封闭的框架集”。在这两个示例中,您似乎混合了http和https:1)通过http请求google可能会重定向到https 2)您的VirtualHost在端口80(http)运行,您使用浏览器查询443(https)-试试我不打算使用https。实际上,我把你说的话准确地输入了我的浏览器。是否有可能我的浏览器在我显式键入http的情况下自动将其重定向到https?我已经尝试过Mac版Safari和Windows版Chrome。实际上,我做了一些进一步的测试,需要添加更多细节。我在原始评论中列出的错误是我在Mac上从Safari获得的错误。我怀疑Safari可能正在强制连接到HTTPS。如果有人知道如何解决这个问题,那就太好了,甚至我正在做的事情支持HTTPS也会更好。我最终想这样做,但我想先让它在HTTP上工作。也就是说,我在Windows上从Chrome上得到一个不同的错误:ERR\u CONNECTION\u TIMED\u OUT。我仍然可以访问它,尽管通过访问,这是有效的,这对我来说似乎很奇怪,因为我相信代理应该与直接输入相同。不管怎样,我使用Postman测试了它,并获得了一个HTML响应,其中包含一堆注释和两个函数,它们似乎“在必要时重定向到HTTPS”和