【问题标题】:HAPROXY reqirep on Host header not forwarding主机标头上的 HAPROXY reqirep 未转发
【发布时间】:2014-11-25 23:47:07
【问题描述】:

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

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

我在 haproxy 配置中添加了 reqirep 条目:

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 后缀一样。 但是第三条规则:

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

提前致谢。

【问题讨论】:

    标签: reverse-proxy cloud-foundry haproxy


    【解决方案1】:

    您正在运行哪个版本的 HAProxy? 如果是 1.4,请将“选项 http-server-close”添加到默认部分。

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

    在 1.5 中,它应该可以开箱即用。 HAProxy 使用一种新模式“http-keep-alive”,它允许 HAProxy 一直分析所有内容。

    巴蒂斯特

    【讨论】:

    • 嗨。我正在运行:HA-Proxy 版本 1.5-dev19 2013/06/17
    • 所以......它不能开箱即用。还有其他想法吗?
    猜你喜欢
    • 2012-11-18
    • 2021-06-12
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 2022-10-09
    相关资源
    最近更新 更多