我目前正在使用 haproxy 在我的终端上执行 reverse_proxy。
不幸的是,我无法让它工作!
这是我的配置:
backend twisted
mode http
timeout connect 10s
timeout server 30s
balance roundrobin
server apache1 127.0.0.1:11111 weight 1 maxconn 512
backend cometd
mode http
timeout connect 5s
timeout server 5m
balance roundrobin
server cometd1 127.0.0.1:12345 weight 1 maxconn 10000
frontend http_proxy #arbitrary name for the frontend
bind *:80 #all interfaces at port 80
mode http
option forwardfor
option http-server-close
option http-pretend-keepalive
default_backend twisted #by default forward the requests to apache
acl req_cometd_path path_beg /comet/
use_backend cometd if req_cometd_path
acl req_cometd_host hdr_dom(host) -i comet.okiez.com
use_backend cometd if req_cometd_host
- 如果我尝试访问 localhost/comet/test1/test2,haproxy 会正确转发到 cometd 后端。但是,请求路径仍然是 /comet/test1/test2,其中我的 comet 引擎 (orbited) 不处理 /comet/ 部分。有没有办法告诉 haproxy 删除指向 cometd 后端的请求中的第一个 /comet/?
- 如您所见,我也有 acl req_cometd_host hdr_dom(host) -i comet.okiez.com。这根本不起作用。我不知道访问http://comet.localhost/test1/test2或者 comet.127.0.0.1/test1/test2 完全有意义。我如何将 acl req_cometd_host hdr_dom(host) -i 写入本地主机地址?
答案1
放在
reqrep ^([^\ ]*)\ /comet/(.*) \1\ /\2
进入您的后端定义。这样,Haproxy 就可以使用该路径在前端进行路由决策。在这里,以/comet
开头的请求将与req_cometd_path
acl 匹配,因此将被路由到正确的后端。
在后端本身中,您现在可以调整请求以适合其背后的实际应用服务器。因此,上述规则将从/comet
路径开头删除通过 comet 后端的所有请求。
已编辑(添加以下内容):
关于你的第二个问题,hdr_dom
仅当所述字符串(在你的情况下是 comet.okiez.com)在标题中被孤立或由点分隔时才匹配。你可能想使用以下之一
# matches if 'comet' is somewhere in the host
acl req_cometd_host hdr_dom(host) -i comet
# matches if 'comet' is at the beginning the host
acl req_cometd_host hdr_beg(host) -i comet
# matches if the host is comet.okiez.com
acl req_cometd_host hdr(host) -i comet.okiez.com
欲了解更多详情,请参阅Haproxy配置手册。
答案2
问题 1 的可能答案...
您的代码正在声明要使用哪个后端,但它没有执行任何有关重定向等的操作。
也许以下内容会对您有所帮助...
acl req_cometd_path path_beg /comet/
redirect prefix /test1/test2/ if req_cometd_path
use_backend cometd if req_cometd_path
对于第二个问题,请尝试以下方法 -
acl req_cometd_host hdr_end(host) -i comet.okiez.com
use_backend cometd if req_cometd_host
注意 hdr_end 而不是 hdr_dom。这只是一个建议。希望这对您有所帮助!
答案3
您可以使用请求替换来动态更改 URL。
replace "/comet/" with "/" at the beginning of any request path.
reqrep ^([^\ ]*)\ /comet/(.*) \1\ /\2
我不是 100% 确定操作的顺序。(acl 操作与 use_backend)
然而,我希望如果您将 reqrep 行放在 cometd 后端代码部分,它将在 acl 之后进行处理。
您的主机头检查看起来没问题。您如何测试它?您的 /etc/hosts 或解析为 127.0.0.1 的 DNS 中是否有“comet.okiez.com”?
您还可以将 Host: 标头添加到 wget 请求中。
例如。
wget --header="Host: comet.okiez.com" http://localhost/