Apache 作为多个目标和一个默认目标的反向代理

Apache 作为多个目标和一个默认目标的反向代理

寻求对下一个 Apachereverse-proxy问题的帮助。

  • 在 localhost:80 (aaaa:80) 上有一个 Apache 2.4
  • 有 3 个不同的 Web 应用程序
    • 一个在 localhost:8000 (aaaa:8000) 上运行
    • 另外两个在另一台机器上 - 所以 xxxx:8000 和 yyyy:8000
  • 在基本的 apache:80 上有一些静态内容(一些 html 页面)DocumentRoot

要求

  • appX(在 xxxx:8000 上)应该通过以下方式访问http://aaaa/appX/
  • appY(在 yyyy:8000)作为http://aaaa/appY/
  • 现有的静态页面(来自 apache 的DocumentRoot)应该由 apache 照常提供
  • defapp-其他一切应代理至 aaaa:8000

配置起来很容易,appX如下appY所示:

ProxyPass         /appX/ http://x.x.x.x:8000/
ProxyPassReverse  /appX/ http://x.x.x.x:8000/

ProxyPass         /appY/ http://y.y.y.y:8000/
ProxyPassReverse  /appY/ http://y.y.y.y:8000/

以上操作正常。因此,当尝试访问时,会收到来自http://localhost/appX/的响应。appXx.x.x.x:8000

default destinaton但是for有一个问题everything other。当尝试添加时:

ProxyPass         /   http://127.0.0.1:8000/
ProxyPassReverse  /   http://127.0.0.1:8000/

它没有像我希望的那样发挥作用......

通过上述操作告诉 Apache -除此以外什么都没有/appX/或者/appY/发送给0:8000

不幸的是,这不起作用,defapp运行在 上的程序获得了和0:8000的请求,以及静态页面的请求。appXappY

切换定义的顺序,因此

#define first the "default destination"
ProxyPass         /   http://127.0.0.1:8000/
ProxyPassReverse  /   http://127.0.0.1:8000/

#and after the appX and appY
ProxyPass         /appX/ http://x.x.x.x:8000/
ProxyPassReverse  /appX/ http://x.x.x.x:8000/
ProxyPass         /appY/ http://y.y.y.y:8000/
ProxyPassReverse  /appY/ http://y.y.y.y:8000/

也不起作用。一切都被代理到localhost:8000

因此,问题是:是否可以将 Apache 配置为反向代理来处理上面定义的要求?

答案1

将你的 ProxyPass 引用包装在<VirtualHost>定义中,如下所示:

<VirtualHost *:*>
ProxyPreserveHost On
ProxyPass / http://192.168.111.2/
ProxyPassReverse / http://192.168.111.2/
ServerName hostname.example.com
</VirtualHost>

创建两个单独的服务器名称,并指定您想要的服务器名称,然后再创建另一个不带服务器名称或定义代理选项(仅此而已DocumentRoot)的服务器名称。将这个放在最后。

更多信息这里

答案2

Warren Seine 的答案略有改进(第一个 RewriteRule 中漏掉了“app/”(....127.0.0.1/$1 [P....) )

RewriteRule         ^/app/(.*) http://127.0.0.1/$1 [P,L]

必须是

RewriteRule         ^/app/(.*) http://127.0.0.1/app/$1 [P,L]

因此,总结一下 - 如果您的所有链接都分布在多个主机上(正如您的情况一样),请尝试以下操作:

ProxyPreserveHost   On
RewriteEngine       On

RewriteRule         ^/appX/(.*) http://x.x.x.x:8000/$1 [P,L]
ProxyPassReverse    /appX/      http://x.x.x.x:8000/
RewriteRule         ^/appY/(.*) http://y.y.y.y:8000/$1 [P,L]
ProxyPassReverse    /appY/      http://y.y.y.y:8000/
RewriteRule         ^/(.*)      http://127.0.0.1:8000/$1 [P,L]
ProxyPassReverse    /           http://127.0.0.1:8000

如果你需要在一个主机上传播你的链接(使用不同的端口和 BaseURL)

ProxyPreserveHost   On
RewriteEngine       On

RewriteRule         ^/appX/(.*) http://127.0.0.1:8001/appX/$1 [P,L]
ProxyPassReverse    /appX/      http://127.0.0.1:8001/appX
RewriteRule         ^/appY/(.*) http://127.0.0.1:8002/appY/$1 [P,L]
ProxyPassReverse    /appY/      http://127.0.0.1:8002/appY/
RewriteRule         ^/(.*)      http://127.0.0.1:8000/$1 [P,L]
ProxyPassReverse    /           http://127.0.0.1:8000

答案3

您可以使用P使用标志重写规则

重写规则比 ProxyPass 指令更灵活,您可以使用标志L来停止处理规则集并避免您提到的问题(命中多个后端)。

以下是一个例子:

ProxyPreserveHost   On
RewriteEngine       On

RewriteRule         ^/app/(.*) http://127.0.0.1/$1 [P,L]
ProxyPassReverse    /app/ http://127.0.0.1/app

RewriteRule         ^/blog/(.*) http://127.0.0.1/blog/$1 [P,L]
ProxyPassReverse    /blog/ http://127.0.0.1/blog

RewriteRule         ^/(.*) http://127.0.0.1/$1 [P,L]
ProxyPassReverse    / http://127.0.0.1

相关内容