haproxy:如何在不启动应用程序会话的情况下准备服务器维护?

Chr*_*uet 16 maintenance cookies haproxy

问题

我正在使用 haproxy 对 Web 服务器进行负载平衡。我将会话持久性与附加 cookie 一起使用,因为某些应用程序使用会话文件,而这些文件在服务器之间不同步。

我想禁用服务器进行维护,但不中断会话。所以我想允许现有客户继续他们的应用程序会话,但不接受新客户。

快乐的行为

  • 我将服务器设置为“去维护”
  • 如果客户端设置了 cookie,即使标记为“进入维护”,也要使用服务器
  • 如果一个新客户端(没有 cookie)来了,它被定向到另一个服务器
  • 在所有客户端结束他们的应用程序会话之后,没有更多的客户端会将 cookie 设置到这个特定的服务器,我最好在没有用户中断的情况下关闭它。

您认为通过某些 haproxy 配置可以实现吗?或者有什么聪明的方法来做到这一点?

其他方法

满足此需求的其他方法的非详尽列表:

  • 在服务器之间同步会话文件(需要一种在多个服务器之间同步文件的方法,或者一个通用的单个挂载点)
  • 使用数据库存储会话信息(需要改变应用行为)

更多细节

我使用这种配置:

frontend https-in
   bind xxx.xxx.xxx.xxx:443 ssl crt /etc/haproxy/ssl/_default.pem crt /etc/haproxy/ssl
   reqadd X-Forwarded-Proto:\ https

   acl APP1 hdr(host) -i APP1.atac.local
   use_backend APP1 if APP1

   default_backend _default

backend APP1
   redirect scheme https if !{ ssl_fc }
   mode http
   balance roundrobin
   cookie HAPROXY_SESSION insert indirect
   option httpchk HEAD /haproxy_test_page.php HTTP/1.0\nUser-Agent:\ HAProxy
   server SRV1 SRV1_IP:PORT cookie SRV1 check
   server SRV2 SRV2_IP:PORT cookie SRV2 check
Run Code Online (Sandbox Code Playgroud)

如果我只是禁用 SRV1(使用 haproxy cli 命令),我认为在 SRV1 上打开的所有应用程序会话都会在当前 HTTP“会话”结束后中断。那正确吗?

小智 15

如果您使用socat与您的 haproxy 配置进行通信,您可以通过以下方式将服务器置于耗尽状态:

echo "set server backend/serv state drain" | sudo socat stdio /etc/haproxy/haproxysock

更多命令在这里!要在 Ubuntu 中安装 socat,请转到此答案

我用 haproxy 1.6.3 版本测试过:)


aus*_*ian 6

使用 Web 管理界面将服务器置于排放模式。这提供了您正在寻找的确切功能。

Web 管理界面的详细信息 - https://github.com/Aidaho12/haproxy-wi

  • 如果您将其设置为 Maint,它将停止向其发送 *任何* 流量,如 [此处](http://cbonte.github.io/haproxy-dconv/configuration-1.5.html#9.2-set%20server )。相反,他希望将其置于 Drain 模式,并使用带有过期时间的“stick-table”来提供持久性。 (3认同)
  • 如何更改网络界面中的模式?它看起来只是提供信息。 (2认同)