I'm using Haproxy with tornado for websocket. My connection working fine if i directly connect to tornado but if i use HAproxy with below config then connection closed after 50 seconds. My Haproxy config file is below.
global
daemon
maxconn 4032
pidfile /var/run/haproxy.pid
defaults
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
option http-server-close
maxconn 4032
frontend http-in
bind *:80
acl is_websocket hdr_end(host) -i WebSocket
use_backend servers if is_websocket
default_backend servers
option redispatch
option http-server-close
maxconn 2000
contimeout 500000
clitimeout 500000
srvtimeout 500000
contimeout 500000
timeout contimeout 500000
timeout connect 500000
backend servers
server server1 127.0.0.1:8886 maxconn 4032
Now by using above config my websocket connection automatically lost after 50 seconds. I want to do persistent connection so is there is any way to make connection persistent in HAproxy ?
A WebSocket times out if no read or write activity occurs and no Ping messages are received within the configured timeout period. The container enforces a 30-second timeout period as the default.
HAProxy is one such vendor able to handle WebSocket communication in this manner. As forwarding occurs at the transport layer it can only be performed based on the port of the received packet. To perform forwarding based on URL we would need access to the HTTP object at the application layer.
WebSockets are two-way communication channels between a client device (such as a web browser) and a server, allowing the server to send messages to the client at any time without the client having to make a request.
I changed timeout connect 0ms, timeout client 0ms, timeout server 0ms in defaults section then my connection is persistent connection because if i give value 0 then it will be infinite connection timeout value.
You should not do this, because these options apply to usual HTTP traffic, too.
Set timeout connect / client / server to appropriate values and use timeout tunnel
for websockets.
The tunnel timeout applies when a bidirectional connection is established between a client and a server, and the connection remains inactive in both directions. This timeout supersedes both the client and server timeouts once the connection becomes a tunnel.
(See: http://cbonte.github.io/haproxy-dconv/configuration-1.5.html#timeout%20tunnel)
I found answer,
I changed timeout connect 0ms, timeout client 0ms, timeout server 0ms
in defaults
section then my connection is persistent connection because if i give value 0 then it will be infinite connection timeout value.
My final working config is below,
global
daemon
maxconn 4032
pidfile /var/run/haproxy.pid
defaults
mode http
timeout connect 0ms
timeout client 0ms
timeout server 0ms
option http-server-close
maxconn 4032
frontend http-in
bind *:80
acl is_websocket hdr_end(host) -i WebSocket
use_backend servers if is_websocket
default_backend servers
option redispatch
option http-server-close
maxconn 2000
contimeout 500000
clitimeout 500000
srvtimeout 500000
contimeout 500000
timeout contimeout 500000
timeout connect 500000
timeout client 500000
backend servers
server server1 127.0.0.1:8886 maxconn 4032
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With