增加到特定 URL 的 WebSocket 连接的客户端超时

Ale*_*ber 3 timeout haproxy websocket

在 CentOS 7 Linux 上,我在通过 FastCGI 为 Wordpress 站点提供服务Jetty 9前面成功使用了 HAProxy 1.5.14 。

它工作得非常好,但是对于同一网站上的 HTML5/WebSocket 游戏,WebSocket 连接到/ws/URL 的客户端和服务器超时需要更高的时间。

所以我将/etc/haproxy/haproxy.cfg文件修改为以下内容:

global
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon
    tune.ssl.default-dh-param 2048

defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m    # HOW TO INCREASE FOR /ws/ ?
    timeout server          1m    # HOW TO INCREASE FOR /ws/ ?
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000

frontend public
    bind 144.76.184.151:80
    bind 144.76.184.151:443 ssl crt /etc/pki/tls/certs/slova.de.pem

    acl websocket_url path_end /ws/
    #timeout client 60m if websocket_url   # SYNTAX ERROR
    use_backend ws-jetty if websocket_url
    default_backend jetty

backend jetty
    server domain 127.0.0.1:8080 send-proxy

backend ws-jetty
    timeout client 60m    # IS IGNORED HERE
    timeout server 60m
    server domain 127.0.0.1:8080 send-proxy
Run Code Online (Sandbox Code Playgroud)

当我设置

    timeout client 60m
    timeout server 60m
Run Code Online (Sandbox Code Playgroud)

defaults部分中,我的 WebSocket 游戏可以根据需要运行,但我不希望通常的 HTTP 连接超时 1 小时。

当我将该部分放入backend ws-jetty然后打印警告时,该超时客户端不是后端选项,因此被忽略。

当我尝试该行时,timeout client 60m if websocket_url会报告语法错误。

Mic*_*bot 5

如果一些长期存在的会话与短期存在的会话混合在一​​起(例如:WebSocket 和 HTTP),则值得考虑timeout tunnel,它会覆盖timeout clienttimeout server隧道,以及timeout client-fin半封闭连接。

http://cbonte.github.io/haproxy-dconv/configuration-1.5.html#4.2-timeout%20client

timeout tunnel在连接上处于活动状态时——这对于 Web 套接字会自动发生,因为一旦连接升级到 Web 套接字,HTTP 逻辑就会分离——大多数其他超时不再为该连接触发。

请注意,这是一个空闲计时器,而不是会话计时器。计时器由来自任一方向的流量重置。您可以将其应用于后端或默认部分。它应该只在适当的时候由 HAProxy 实际使用,但是将它放在需要它的特定后端可以说是最佳实践。