如何设置 Apache 双反向代理?

如何设置 Apache 双反向代理?

只是为了让生活变得困难-我正在尝试设置双反向代理:

WWW > Router > Apache Reverse Proxy #1 (443) > Apache Reverse Proxy (443) #2 > Docker Container (Which runs on same machine as #2)

两个反向代理都有 FQDN。我正在尝试使用虚拟主机,但显然不明白如何设置代理。

主域名是example.com(托管在 Apache #1 上),子域名是office.example.com(托管在 Apache #2 上)。

在 Apache #1 上,我必须设置虚拟主机(example.comoffice.example.com)。虚拟主机文件office.example.com如下所示:

<VirtualHost *:443>
    ServerName office.example.com
    UseCanonicalName off
    DirectoryIndex index.html index.htm /index.php index.php
    DocumentRoot /usr/local/www/office

    ....
    ....

    # keep the host
    ProxyPreserveHost On
    ProxyPass / https://office.example.com
    ProxyPassReverse / https://office.example.com

    ....
    ....
</VirtualHost>

我的 DNS 记录在 Cloudflare,并且office.example.comexample.com解析到同一个外部 IP 地址。但是,pfSense 路由器有一个 DNS 覆盖,将 office.example.com 重新分配给内部 LAN 地址

在 Apache #2 上,我的虚拟主机文件显示如下:

<VirtualHost *:443>
    ServerName office.example.com
    DocumentRoot "/var/www/office.example.com/html"
    DirectoryIndex index.html index.htm /index.php index.php

    ...
    ...

    ProxyPreserveHost On

    # static html, js, images, etc. served from loolwsd
    # loleaflet is the client part of LibreOffice Online
    ProxyPass /loleaflet http://127.0.0.1:9980/loleaflet retry=0
    ProxyPassReverse /loleaflet http://127.0.0.1:9980/loleaflet

    ...
    ...
</VirtualHost>

我省略了 SSL 加密项,因为涉及从 Web 到 Apache #1 的 SSL 传输以及从 Apache #1 到 Apache #2 的 SSL 加密。SSL 终止于第二个代理。

从外部我可以到达,https://office.example.com它正确显示index.html位于 Apache #2 上的文档根目录的文件。

但是我无法解析任何其他链接。如果我尝试:https://office.example.com/data或,我会收到 500 错误https://office.example.com/loleaflet

我认为我遗漏了反向代理请求的一些内容。

答案1

按照上面的建议,我部分找到了这个问题的答案。对于 HTTP/HTTPS 链接,您需要在 URL 后面添加 /。所以:

ProxyPass / https://office.example.com
    ProxyPassReverse / https://office.example.com

需要写成

ProxyPass / https://office.example.com/
    ProxyPassReverse / https://office.example.com/

这解决了一个问题,我可以接受,但是不幸的是,如果您需要 ProxyPass ws/wss 链接,这将不起作用。我仍在寻找该问题的解决方案。

相关内容