Apache 反向代理 - 如何设置单个域到多个 IP

Apache 反向代理 - 如何设置单个域到多个 IP

将 Debian 10 与 Apache 2.4 结合使用

我有一台运行一些虚拟机的服务器。我想让它们可以从网络上访问,但我只想使用一个域名和一个免费的 SSL 证书(不是昂贵的通配符证书),并使用 URL 字符串的右半部分(“.com”)来区分它应该映射到哪个 IP。

据我了解,反向代理能够实现这一点。但是,当我尝试设置它时,它失败了,当我转到https://mydomain.com/nextcloud或者https://mydomain.com/rocketchat

如果我转到根级别(https://mydomain.com)我从 /var/www/html/ 获取索引页。所以反向代理没有任何作用。

所以,我的问题是:如何对default-ssl.conf文件进行编码才能使其工作?

我尝试过这样的事情:

ProxyPreserveHost On
ProxyPass         /rocketchat/         http://192.168.1.33:3000/
ProxyPassReverse  /rocketchat/         http://192.168.1.33:3000/

ProxyPass         /nextcloud/     http://192.168.1.16/nextcloud/
ProxyPassReverse  /nextcloud/     http://192.168.1.16/nextcloud/

我想要发生的事情的一个例子:

如果我去https://mydomain.com/nextcloud然后它将我连接到 192.168.1.16。

如果我去https://mydomain.com/rocketchat然后它将我连接到 192.168.1.33:3000


我试图找出我的问题。希望这张图能帮助巩固我想要的东西:

图表


编辑:Apache 错误日志(v61.local 机器是 rocketchat 机器):

[Tue Apr 27 17:23:44.975875 2021] [ssl:error] [pid 22473] [remote 192.168.1.16:443] AH01961: SSL Proxy requested for v61.local:443 but not enabled [Hint: SSLProxyEngine]
[Tue Apr 27 17:23:44.976000 2021] [proxy:error] [pid 22473] AH00961: HTTPS: failed to enable ssl support for 192.168.1.16:443 (192.168.1.16)
[Tue Apr 27 17:27:16.346092 2021] [mpm_prefork:notice] [pid 22340] AH00169: caught SIGTERM, shutting down
[Tue Apr 27 17:27:16.488467 2021] [ssl:warn] [pid 22634] AH01909: v61.local:443:0 server certificate does NOT include an ID which matches the server name
[Tue Apr 27 17:27:16.577206 2021] [ssl:warn] [pid 22636] AH01909: v61.local:443:0 server certificate does NOT include an ID which matches the server name
[Tue Apr 27 17:27:16.587100 2021] [mpm_prefork:notice] [pid 22636] AH00163: Apache/2.4.38 (Debian) OpenSSL/1.1.1d configured -- resuming normal operations
[Tue Apr 27 17:27:16.587260 2021] [core:notice] [pid 22636] AH00094: Command line: '/usr/sbin/apache2'
[Tue Apr 27 17:27:39.035976 2021] [mpm_prefork:notice] [pid 22636] AH00169: caught SIGTERM, shutting down
[Tue Apr 27 17:27:39.165342 2021] [ssl:warn] [pid 22653] AH01909: v61.local:443:0 server certificate does NOT include an ID which matches the server name
[Tue Apr 27 17:27:39.269657 2021] [ssl:warn] [pid 22655] AH01909: v61.local:443:0 server certificate does NOT include an ID which matches the server name
[Tue Apr 27 17:27:39.286080 2021] [mpm_prefork:notice] [pid 22655] AH00163: Apache/2.4.38 (Debian) OpenSSL/1.1.1d configured -- resuming normal operations
[Tue Apr 27 17:27:39.286292 2021] [core:notice] [pid 22655] AH00094: Command line: '/usr/sbin/apache2'
[Tue Apr 27 17:27:44.967985 2021] [ssl:error] [pid 22656] [remote 192.168.1.16:443] AH01961: SSL Proxy requested for v61.local:443 but not enabled [Hint: SSLProxyEngine]
[Tue Apr 27 17:27:44.968100 2021] [proxy:error] [pid 22656] AH00961: HTTPS: failed to enable ssl support for 192.168.1.16:443 (192.168.1.16)
[Tue Apr 27 17:27:47.329941 2021] [ssl:error] [pid 22657] [remote 192.168.1.16:443] AH01961: SSL Proxy requested for v61.local:443 but not enabled [Hint: SSLProxyEngine]

答案1

你快到了。你正在测试https://mydomain.com/nextcloud但你需要测试https://mydomain.com/nextcloud/(注意末尾的斜杠)。

原因是因为没有/var/www/html/nextcloud目录,所以不会触发自动“让我们附加一个尾部斜杠来处理目录”代码,而是得到 404。

一旦你有了https://mydomain.com/nextcloud/工作,你需要一个规则来重定向https://mydomain.com/nextcloudhttps://mydomain.com/nextcloud/(创建目录nextcloud或使用Redirect;这并不重要,除非这Redirect可能是更干净的解决方案)。

答案2

Apache 的配置高度依赖于被代理的 Web 应用程序。如果 web 应用程序使用,您可能需要额外的指令websockets,例如,现在很常见的事情。此外,许多 Web 应用程序不支持从 HTTP 主机内的目录路径运行,并隐式地假设它们/自己拥有整个根路径。例如,从路径运行这样的应用程序/webapp需要深入了解 Web 应用程序的内部结构以及一些精心设计的 Apache 重写规则。

然而,我碰巧知道 nextcloud 确实支持这样的设置。虽然你确实需要相应地配置 nextcloud 本身。关于 Rocketchat 我不能说什么。没有适用于任何 Web 应用程序的通用配置。恐怕您必须查找每个网络应用程序的文档。即使如此,如果应用程序设计为部署在整个(子)域中,您也可能会遇到一些意外的行为。

话虽这么说,我觉得我应该强烈阻止您从同一(子)域内的路径运行复杂的应用程序,例如 nextcloud 和 Rocketchat。由于默认情况下同源策略,这些应用程序最终可能会访问彼此的资源,包括(可能)身份验证 cookie,这是一个很大的安全问题。

通配符证书并不“昂贵”。事实上,Let's Encrypt 是完全免费的(DNS-01 挑战),前提是您拥有自己的域并可以控制您的 DNS 记录。

相关内容