我在HA Proxy中配置了以下规则。当我尝试点击http://haproxy_ip/service
时,我找不到404frontend http-in
bind 10.254.23.225:80
acl has_service path_beg /service
use_backend service_server if has_service
backend service_server
balance roundrobin
cookie SERVERID insert
option httpchk HEAD /check.txt HTTP/1.0
option httpclose
option forwardfor
server server1 192.168.2.1:9000 cookie server1 check
答案 0 :(得分:0)
后端本身没有/服务。我使用haproxy在url中创建了虚拟路径。
使用当前配置,/service/test.txt
会触发acl has_service
并将/service/test.txt
发送到您的后端,而不会更改网址。
如果您想更改网址(后端代理/service
到后端的/
),您应该在后端添加以下行:
reqrep ^([^\ ]*)\ /service(.*) \1\ \2
这将从代理请求中删除/service
。
修改强>
HAProxy不会重写html输出:您的资源不会获得前导/service/
,也无法正确投放。
当您代理请求时,更容易保持相同的路径:例如,将/
代理到/
或/myapp/
代理到/myapp/
。如果您将/a
代理到/b/c
,则代理本身需要重写回复:<img src="/a/test.png">
需要更改为<img src="/b/c/test.png">
。或worse,<img src="../c/test.png" />
。在html,js和css中添加相对引用。我不确定它对HAProxy是否可行。
如果您可以更改应用程序并将其部署在/service/
上,则可以避免很多问题。使用其他虚拟主机(例如service.yourdomain.com
)也可以解决此问题。
如果没有,我不确定HAProxy是否是正确的工具,我会尝试使用apache 2.4
mod_proxy_html(但在尝试非常难以在/service/
上部署应用之前)。