主机头上的HAPROXY reqirep不转发

时间:2014-10-01 07:29:27

标签: reverse-proxy cloudfoundry haproxy

我有一个Web服务器(实际上它是一个CF环境,但这并不重要)在haproxy版本1.5-dev19 2013/06/17后面运行,只接受某个内部域的请求,我们称之为:内部地址。 这意味着,只有主机头后缀为 internal-address (例如:Host:login.internal-address)时,HTTP请求才有效。

来自WAN的用户可以通过连接到具有ip转发到内部服务器的外部地址来访问此Web服务器。 但是当用户访问外部地址时,Host头后缀为 external-address ,haproxy后面的Web服务器拒绝该请求。

我将reqirep条目添加到haproxy配置中:

global
    log 127.0.0.1   syslog info
    daemon
    user vcap
    group vcap
    maxconn 64000
    spread-checks 4

defaults
    log global
    timeout connect 30000ms
    timeout client 300000ms
    timeout server 300000ms

frontend http-in
    mode http
    bind :80
    option httplog
    option forwardfor
    reqadd X-Forwarded-Proto:\ http
    default_backend http-routers


frontend https-in
    mode http
    bind :443 ssl crt /var/vcap/jobs/haproxy/config/cert.pem
    option httplog
    option forwardfor
    option http-server-close
    reqadd X-Forwarded-Proto:\ https
    default_backend http-routers

frontend ssl-in
    mode tcp
    bind :4443 ssl crt /var/vcap/jobs/haproxy/config/cert.pem
    default_backend tcp-routers


backend http-routers
    mode http
    balance roundrobin
    reqirep ^Host:\ uaa.external-address       Host:\ uaa.internal-address
    reqirep ^Host:\ api.external-address       Host:\ api.internal-address
    reqirep ^Host:\ external-address:4443      Host:\ loggregator.internal-address:4443



        server node0 172.20.0.1:8888 check inter 1000



backend tcp-routers
    mode tcp
    balance roundrobin
    reqirep ^Host:\ external-address:4443      Host:\ loggregator.internal-address:4443


        server node0 172.20.0.1:8888 check inter 1000

发送到uaa.external-address或api.external-address的每个请求确实已更改,并且haproxy后面的Web服务器收到请求,就像Host头后缀为internal-address一样。 但第3条规则:

reqirep ^Host:\ external-address:4443      Host:\ loggregator.internal-address:4443

不能工作:( Web服务器的访问日志显示Host头是从 external-address:4443 发送的,这意味着haproxy没有正确匹配Host头,然后Web服务器拒绝请求。 客户发出的请求是:

WEBSOCKET REQUEST: [2014-10-01T10:25:07+03:00]
GET /tail/?app=029a1269-67fe-46e2-85f7-e1b0b5d34193 HTTP/1.1
Host: wss://external-address:4443
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: [HIDDEN]
Origin: http://localhost
Authorization: [PRIVATE DATA HIDDEN]

有谁知道该规则有什么问题?

编辑:

我从后端删除了规则并在前端创建了更多通用规则,但它仍然不适用于websockets:

frontend https-in
    mode http
    bind :443 ssl crt /var/vcap/jobs/haproxy/config/cert.pem
    option httplog
    option forwardfor
    option http-server-close
    reqadd X-Forwarded-Proto:\ https
    default_backend http-routers
    reqirep ^Host:\ (.*).external-address(.*)  Host:\ \1.internal-address\2


frontend ssl-in
    mode tcp
    bind :4443 ssl crt /var/vcap/jobs/haproxy/config/cert.pem
    default_backend tcp-routers
    reqirep ^Host:\ (.*).external-address(.*)      Host:\ \1.internal-address\2

提前致谢。

1 个答案:

答案 0 :(得分:1)

您正在运行哪个版本的HAProxy? 如果是1.4,请添加'选项http-server-close'进入你的默认部分。

默认情况下,1.4处于隧道模式,这使得HAProxy可以分析第一个请求和响应,并将后续请求和响应作为有效负载进行传输。

在1.5中,它应该开箱即用。 HAProxy使用一种新模式" http-keep-alive"这使得HAProxy可以随时分析所有内容。

巴普蒂斯特