繁体   English   中英

Apache 特定子域的反向代理

[英]Apache Reverse Proxy For Specific Subdomain

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

例如 www.example.com 将 go 显示 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? 有谁知道是什么驱动了这个?

至于 DNS:我已经为每个子域设置了特定的 CNAME 条目,包括 www; 所有这些都指向我的服务器的公共 IP,该服务器包含我的 example.com 域(在我的例子中使用 @ - 我认为大多数 DNS 可能)。 对此可能有一些不同的策略,但我相信根据您在问题中提出的建议,您走在正确的道路上。

至于 Apache 的配置:我认为http协议不需要在ServerName指令中指定,并且一般来说,域不需要出现在<VirtualHost> ... </VirtualHost>标签内。

我应该提一下,我对 Tomcat 相对不熟悉,但我假设它正在本地主机上的 8080 监听,在这种情况下这应该有所帮助。

我不是 100% 确定这就是让你咆哮的全部,但尝试修剪那个ServerName并这样做,包括对VirtualHost开放标记的更改:

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

您的第二个<VirtualHost>可能需要进行类似的更改,尽管您似乎还指示它为来自端口 8080的 web.network 的请求提供服务——我认为这不是您的意图。

我想你想要的是也从 web.network 监听端口 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>

最后,对最后一个开头的<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>

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

<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>

我知道了!

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

谢谢您的帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM