Haproxy 初学者问题!

Haproxy 初学者问题!

我目前正在使用 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
  1. 如果我尝试访问 localhost/comet/test1/test2,haproxy 会正确转发到 cometd 后端。但是,请求路径仍然是 /comet/test1/test2,其中我的 comet 引擎 (orbited) 不处理 /comet/ 部分。有没有办法告诉 haproxy 删除指向 cometd 后端的请求中的第一个 /comet/?
  2. 如您所见,我也有 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_pathacl 匹配,因此将被路由到正确的后端。

在后端本身中,您现在可以调整请求以适合其背后的实际应用服务器。因此,上述规则将从/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。

HAProxy 文档

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/

相关内容