特定子域的 Apache 反向代理

Posted

技术标签:

【中文标题】特定子域的 Apache 反向代理【英文标题】:Apache Reverse Proxy For Specific Subdomain 【发布时间】:2020-10-01 12:08:50 【问题描述】:

我有一个 Apache HTTP 服务器,它有一个 tomcat 服务器的反向代理。但是,我只希望在客户端使用子域 www 时发生反向代理。这是因为我想使用其他子域来指向其他应用程序,例如电子邮件。

例如www.example.com 将显示 apache tomcat webapp。

我认为这样做的方法是配置我的 DNS,以便我使用的每个子域都指向我的服务器。现在,除了 www,就是 server.example.com 和 posfixadmin.example.com。但是,问题是我所有的子域最终都指向 tomcat。

因此,当我尝试访问 postfixadmin.example.com/setup.php 以通过其 Web 设置设置 postfixadmin 时,它最终将我带到我的 tomcat webapp 的 404。

这是我的虚拟主机配置:

<VirtualHost www.example.com:80>
    ServerName http://www.example.com
    ProxyPass / http://localhost:8080
    ProxyPassReverse / http://localhost:8080
</Virtualhost>

<VirtualHost server.example.com:80>
    ServerName server.example.com
    DocumentRoot /var/www/html/
    RewriteEngine on
    RewriteCond %SERVER_NAME =server.example.com
    RewriteRule ^ https://%SERVER_NAME%REQUEST_URI END,NE,R=permanent
</VirtualHost>

<VirtualHost postfixadmin.example.com:80>
    ServerName postfixadmin.example.com
    DocumentRoot /var/www/postfixadmin/public

    ErrorLog /var/log/httpd/postfixadmin_error.log
    CustomLog /var/log/httpd/postfixadmin_access.log combined

    <Directory />
        Options FollowSymLinks
        AllowOverride All
    </Directory>

    <Directory /var/www/postfixadmin/public>
       Options FollowSymLinks MultiViews
       AllowOverride All
       Order allow,deny
       allow from all
    </Directory>
</VirtualHost>

编辑 看起来代理 conf 文件没有做任何事情(??)。我决定尝试一下并将第一个虚拟主机服务器名称更改为以下内容:

<VirtualHost *:80>
    ServerName abcd.example.com
    ProxyPass / http://localhost:8080
    ProxyPassReverse / http://localhost:8080
</Virtualhost>

然后,我重新启动并重新加载了 Apache...但由于某种原因,访问 www.example.com 仍然将我带到了 tomcat webapp!有谁知道这是什么原因?

【问题讨论】:

【参考方案1】:

关于 DNS:我为每个子域设置了特定的 CNAME 条目,包括 www;所有这些都指向包含我的 example.com 域的服务器的公共 IP(在我的情况下使用 @ - 我认为大多数 DNS 都可能)。在这方面可能有一些不同的策略,但我相信根据你在问题中的建议,你走的是正确的道路。

关于 Apache 配置: 我相信http 协议不需要在ServerName 指令中指定,并且通常域不需要出现在&lt;VirtualHost&gt;...&lt;/VirtualHost&gt; 标签内。

我应该提到我对 Tomcat 相对不熟悉,但我假设它在 localhost 上的 8080 处监听,在这种情况下,这应该会有所帮助。

我不能 100% 确定这就是让您咆哮的全部内容,但请尝试将 ServerName 修剪回来并这样做,包括更改 VirtualHost 打开标签:

<VirtualHost *:80>
    ServerName www.example.com
    ProxyPass / http://localhost:8080
    ProxyPassReverse / http://localhost:8080
</Virtualhost>

您的第二个 &lt;VirtualHost&gt; 可能需要进行类似的更改,尽管您似乎也在指示它为来自网络/网络的请求提供服务来自端口 8080 的请求 -- 我不相信这是你的意图。

我认为你想要的也是从 web/network 监听 port 80,但是如果像这样发送到 server.example.com,请遵循这些指令:

<VirtualHost *:80>
    ServerName server.example.com
    DocumentRoot /var/www/html/
    RewriteEngine on
    RewriteCond %SERVER_NAME =server.example.com
    RewriteRule ^ https://%SERVER_NAME%REQUEST_URI END,NE,R=permanent
</VirtualHost>

最后,与最后一个 &lt;VirtualHost&gt; 标记的类似更改:

<VirtualHost *:80>
    ServerName postfixadmin.example.com
    DocumentRoot /var/www/postfixadmin/public

    ErrorLog /var/log/httpd/postfixadmin_error.log
    CustomLog /var/log/httpd/postfixadmin_access.log combined

    <Directory />
        Options FollowSymLinks
        AllowOverride All
    </Directory>

    <Directory /var/www/postfixadmin/public>
       Options FollowSymLinks MultiViews
       AllowOverride All
       Order allow,deny
       allow from all
    </Directory>
</VirtualHost>

总而言之,这似乎更像您正在寻找的东西:

<VirtualHost *:80>
    ServerName www.example.com
    ProxyPass / http://localhost:8080
    ProxyPassReverse / http://localhost:8080
</Virtualhost>

<VirtualHost *:80>
    ServerName server.example.com
    DocumentRoot /var/www/html/
    RewriteEngine on
    RewriteCond %SERVER_NAME =server.example.com
    RewriteRule ^ https://%SERVER_NAME%REQUEST_URI END,NE,R=permanent
</VirtualHost>

<VirtualHost *:80>
    ServerName postfixadmin.example.com
    DocumentRoot /var/www/postfixadmin/public

    ErrorLog /var/log/httpd/postfixadmin_error.log
    CustomLog /var/log/httpd/postfixadmin_access.log combined

    <Directory />
        Options FollowSymLinks
        AllowOverride All
    </Directory>

    <Directory /var/www/postfixadmin/public>
       Options FollowSymLinks MultiViews
       AllowOverride All
       Order allow,deny
       allow from all
    </Directory>
</VirtualHost>

【讨论】:

感谢您的回复。 8080 是帖子中的错字,但不是我的配置文件中的错字,感谢您指出这一点。但是,这种变化似乎对我没有任何影响。另外,我使用 A 记录而不是 CNAME 记录来指向我的 IP 地址。我的每个子域都指向服务器 IP,但是裸域没有。应该吗? 我无法在下面评论你的自我回答,但很高兴听到你明白了!老实说,我说它是 CNAME 可能是不正确的;我总是颠倒这些,这是我在撰写答案时没有考虑的一件事。但在我的情况下,我的所有人也都指向服务器 IP。 (我的特定安装的配置分布在多个 .conf 文件中,因此我完全可以理解您在那里的困境,因为我在网上看到的大多数说明都指向不完全适合我的安装的解决方案!)【参考方案2】:

我明白了!

原来问题出在 ssl 配置文件中 - :443 端口重叠。

感谢您的帮助!

【讨论】:

以上是关于特定子域的 Apache 反向代理的主要内容,如果未能解决你的问题,请参考以下文章

Angular CLI 支持子域反向代理

反向代理将 url 重定向到子域

nginx反向代理网站镜像

nginx反向代理网站镜像

apache与tomcat 反向代理

如何开启apache虚拟目录反向代理