使用强制持久设置的haproxy工作配置

时间:2015-03-25 05:31:40

标签: ubuntu-14.04 haproxy

我不确定我是否遗漏了一些关键的配置文件,或者只是从根本上误解了haproxy中强制持久的目的(在Ubuntu 14.04上使用版本1.5.11)。来自文档:

  

“force-persist”语句允许声明各种基于ACL的语句   满足条件时,将导致请求忽略其状态   一台服务器,仍然尝试连接到它。这使得有可能开始   服务器,仍然回复健康检查错误,并专门运行   配置浏览器来测试服务。

这听起来就像我想要的行为,在那里我可以将所有应用服务器置于“维护模式”以进行代码部署,但允许某些IP仍然连接以便测试它,后期推出,然后给予每个人再次访问。这是我设置的配置:

global
  log /dev/log  local0
  log /dev/log  local1 notice
  chroot /var/lib/haproxy
  stats socket /run/haproxy/admin.sock mode 660 level admin
  stats timeout 30s
  user haproxy
  group haproxy
  daemon

  # Default SSL material locations
  ca-base /etc/ssl/certs
  crt-base /etc/ssl/private

  # Default ciphers to use on SSL-enabled listening sockets.
  # For more information, see ciphers(1SSL).
  ssl-default-bind-ciphers kEECDH+aRSA+AES:kRSA+AES:+AES256:RC4-SHA:!kEDH:!LOW:!EXP:!MD5:!aNULL:!eNULL
  ssl-default-bind-options no-sslv3

defaults
  log   global
  mode  http
  option    httplog
  option    dontlognull
  timeout connect 300s
  timeout client  50000
  timeout server  50000
  errorfile 400 /etc/haproxy/errors/400.http
  errorfile 403 /etc/haproxy/errors/403.http
  errorfile 408 /etc/haproxy/errors/408.http
  errorfile 500 /etc/haproxy/errors/500.http
  errorfile 502 /etc/haproxy/errors/502.http
  errorfile 503 /etc/haproxy/errors/503.http
  errorfile 504 /etc/haproxy/errors/504.http

listen mysite
  bind *:80
  bind *:443 ssl crt mysite.pem
  http-request set-header X-Forwarded-Port %[dst_port]
  http-request add-header X-Forwarded-Proto https if { ssl_fc }
  redirect scheme https if !{ ssl_fc }
  balance roundrobin
  option forwardfor
  option httpchk HEAD /haproxy_health_check.php
  acl whitelist src -f /etc/haproxy/whitelist.lst
  force-persist if whitelist
  server app-1 10.1.4.32:80 maxconn 20 check inter 10000

使用此配置,我认为我应该能够发出以下命令:

echo "disable server mysite/app-1" | socat /run/haproxy/admin.sock stdio

让单个应用服务器退出,只要我来自/etc/haproxy/whitelist.lst中列出的IP地址,我仍然可以看到该网站,就好像服务器还在启用。但是,我最终看到的是503错误页面,如果我是普通用户,我通常会发现这一点,但不是来自列入白名单的IP。为了消除我错误地指定IP地址或错误地使用acl命令的可能性,我尝试了一个变体,我只需设置:

force-persist if TRUE

从我对文档的阅读中,我认为无论我来自哪个IP,我都不会禁用服务器。不幸的是,我仍然得到了503。

有一些笨拙的方法,包括传递额外的配置和重新加载haproxy,我可以使用它来使这个工作,但“强制持久”以及通过命令行禁用的方便能力似乎是一个更优雅的方法如果我能让它发挥作用,我肯定更喜欢它。

有没有其他人试图让haproxy以这种方式工作?以这种方式解释“强制坚持”我是错的吗?我是否需要一些额外的配置才能使其正常工作?

1 个答案:

答案 0 :(得分:4)

没有规则指出此配置中要保留的内容。通常,您将使用此结合基于cookie的持久性。例如:

cookie SERVERID insert indirect nocache
server srv1 1.1.1.1:80 cookie s1 check
server srv2 2.2.2.2:80 cookie s2 check
acl from_management_net src 10.0.0.0/8
force-persist if from_management_net

然后在您的客户端上,访问第一台服务器,获取分配的cookie,禁用服务器,然后再次访问它,您将继续前往那里。通常人们会实现一个特定的HTML页面,列出所有服务器及其各自的cookie,只需单击它们即可帮助从客户端选择服务器。