尝试按照标题中的说明进行操作:在高负载下保留现有的会话,并为新到达的访客提供503消息。
问题:它可以工作,但是会话持续时间不会超过90秒。
目前的结果让我想知道是否缺少我想要的超时设置。
目的
我正试图让haproxy达到:
- 当前端上的会话总数低于特定阈值时,将对新会话的请求发送到backend-001。
- 当前端上的会话总数超过该阈值时,向新会话提供503错误
- 即使会话数超过阈值,也允许请求现有会话
这样,正在填写多步骤表单的访客就不会对503错误感到惊讶,并且可以告诉新访客“请稍后再回来,因为我们现在很忙”。
设定
设置如下:
{visitors}
↓
[haproxy]
↓
[rails app on unicorn served by nginx] (right now just one
backend: 'backend-001')
目前的方法
为了达到上述目的,我使用以下配置。
这是一个测试,具有非常低的限制(前端有10个连接(fe_conn gt 10)),以使测试更加容易。
为了使服务器承受一定的负载,我使用httperf,如下所示:
httperf --hog --server staging.machine.tld --uri / do_some_things --wsess = 500,10,30 --rate 2
global
daemon
maxconn 10000
defaults
mode http
timeout connect 6s
timeout client 60s
timeout server 60s
balance roundrobin
option http-server-close
frontend http-in
bind [PUBLIC_IP]:80
default_backend backend-001
acl too_many fe_conn gt 10
use_backend b_too_many if too_many
backend backend-001
fullconn 10
appsession _session_id len 128 timeout 7200s
cookie SERVERID insert maxidle 7200s
server Server1 127.0.10.1:80 cookie backend-001 check
backend b_too_many
errorfile 503 /var/www/50x.html
问题
如上所述,问题是:它几乎可以工作,但是会话持续时间不会超过90秒。
如果继续单击,即使有10个会话繁忙,您也可以保持会话状态。
尝试使用其他浏览器实例打开服务器上的页面会收到503错误。
因此,看来我快到了。有谁知道会导致短会话时间的原因吗?
特别是我该如何解决它:)
(编辑:从“服务器”行中删除“权重1 maxconn 10”,不相关,可能会造成混淆)(编辑第二条:将“前端的10个会话”更正为“前端的10个连接”)