我有一个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
提前致谢。
答案 0 :(得分:1)
您正在运行哪个版本的HAProxy? 如果是1.4,请添加'选项http-server-close'进入你的默认部分。
默认情况下,1.4处于隧道模式,这使得HAProxy可以分析第一个请求和响应,并将后续请求和响应作为有效负载进行传输。
在1.5中,它应该开箱即用。 HAProxy使用一种新模式" http-keep-alive"这使得HAProxy可以随时分析所有内容。
巴普蒂斯特