【发布时间】: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