希望你们能帮助我解决我遇到的代理问题。
我已经拥有的
我已经设置了一个 apache http 反向代理,将请求从 *.proxy.domain 代理到 *.intern.domain。apache 是从外部网络访问我的内部 Web 应用程序的唯一方法。
例子:
app.proxy.domain -> app.intern.domain
mail.proxy.domain -> mail.intern.domain
这一切都很顺利,但我遇到了以下问题。
问题
我想要代理以下请求:
app.proxy.domain -> app.internal.domain
app-dev.proxy.domain -> app-dev.internal.domain
这没问题,但不幸的是,app-dev 服务器运行的是应用服务器 web 应用程序的精确副本,并且该 web 应用程序仅响应其主机名(app.intern.domain)
所以我需要做的是代理以下内容
app.proxy.domain -> app.internal.domain (10.0.1.1)
app-dev.proxy.domain -> app.internal.domain (10.0.1.2)
我可以做第二件事,通过在 /etc/hosts 中添加“10.0.1.2 app.internal.domain”,但这也意味着 app.proxy.domain 将登陆开发服务器。
我正在寻找一个选项,仅在 app-dev.proxy.domain 的 vhost 配置文件中设置 /etc/hosts 条目,以便每个其他 vhost 配置都只使用 app.intern.domain 的 DNS。
想法……
有没有办法告诉 apache 配置
ProxyPass / http://10.0.1.2/
但发送 app.intern.domain 作为主机名?
编辑 dev-servers web 应用程序来监听 app-dev 是不可能的,因为它应该是一个精确的副本(不是我的决定......)
谢谢!
答案1
或许你可以将 mod_headers 与 mod_proxy 结合使用。不过我还没有测试过。
因此,对于您的 app-dev vhost,您可以拥有:
RequestHeader set Host "app.internal.domain"
然后你可以添加:
ProxyPreserveHost On
答案2
不太好的解决方法是使用(或者说滥用)/etc/hosts 将 app.internal.domain 指向 localhost,然后配置 Apache 监听另外两个端口,分别用于您的应用和 app-dev。因此反向代理两次:
Listen 80
Listen 127.0.0.1:8001
Listen 127.0.0.1:8001
<VirtualHost *:80>
ServerName app.proxy.domain
ProxyPass / http://app.internal.domain:8001
</VirtualHost>
<VirtualHost *:80>
ServerName app-dev.proxy.domain
ProxyPass / http://app.internal.domain:8002
</VirtualHost>
<VirtualHost 127.0.0.1:8001>
ServerName app.internal.domain
ProxyPreserveHost On
ProxyPass / http://10.0.1.1/
</VirtualHost>
<VirtualHost 127.0.0.1:8002>
ServerName app.internal.domain
ProxyPreserveHost On
ProxyPass / http://10.0.1.2/
</VirtualHost>
答案3
添加到反向代理的配置(针对 app-dev.proxy..):
RequestHeader edit Host ^app-dev.proxy.domain app.proxy.domain
您必须事先启用 mod_headers:
a2enmod headers
内部服务器 10.0.1.2 应该有
ServerName app.proxy.domain