![增加与特定 URL 的 WebSocket 连接的客户端超时时间](https://linux22.com/image/686221/%E5%A2%9E%E5%8A%A0%E4%B8%8E%E7%89%B9%E5%AE%9A%20URL%20%E7%9A%84%20WebSocket%20%E8%BF%9E%E6%8E%A5%E7%9A%84%E5%AE%A2%E6%88%B7%E7%AB%AF%E8%B6%85%E6%97%B6%E6%97%B6%E9%97%B4.png)
在 CentOS 7 Linux 上,我成功地在前面使用了 HAProxy 1.5.14Jetty 9 通过 FastCGI 为 Wordpress 网站提供服务。
它确实运行得很好,但是对于同一网站上的 HTML5/WebSocket 游戏,/ws/
需要更高的客户端和服务器超时来建立与 URL 的 WebSocket 连接。
因此我将文件修改/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
当我设置
timeout client 60m
timeout server 60m
在defaults
部分中,我的 WebSocket 游戏按需要工作,但我不希望通常的 HTTP 连接出现 1 小时的超时。
当我把那部分放进去backend ws-jetty
时,就会打印出警告,超时客户端不是后端选项,因此被忽略。
当我尝试该行时timeout client 60m if websocket_url
,报告了语法错误。
答案1
如果一些长寿命会话与短寿命会话混合在一起(例如:WebSocket 和 HTTP),则值得考虑
timeout tunnel
,它会覆盖timeout client
和timeout server
用于隧道以及timeout client-fin
半关闭连接。http://cbonte.github.io/haproxy-dconv/configuration-1.5.html#4.2-timeout%20client
什么时候timeout tunnel
在连接上处于活动状态 - - 对于 Web 套接字,这会自动发生,因为一旦连接升级为 Web 套接字,HTTP 逻辑就会分离 - - 对于该连接,大多数其他超时不会再触发。
请注意,这是一个空闲计时器,而不是会话计时器。计时器由来自任一方向的流量重置。您可以将其应用于后端或默认部分。它应该只在适当的时候由 HAProxy 实际使用,但将其放在需要它的特定后端可以说是最佳做法。