Search code examples
tcpwebsocketload-balancingdigital-ocean

Load Balancing Websockets on Digital Ocean


I am trying to configure Digital Ocean native Load Balancer for distributing websockets traffic. I set the rule: enter image description here

While trying to connect over load balancer, I am getting: VM915:1 WebSocket connection to 'ws://{loadbalancerip}:8443/' failed: Connection closed before receiving a handshake response.

Direct connection works just fine.

So how can I configure load balancer for balancing websockets traffic?


Solution

  • As far as it looks like Digital Ocean Load Balancer doesn't support websockets out of the box, I had to purchase a small instance and configure on it Nginx for balancing incoming traffic between 3 local machines.

    Here is possible config for Nginx, which allows you to balance wss traffic forwarded to 8443 port from Cloudflare:

    upstream wss {
    # Clients with the same IP are redirected to the same backend
    # ip_hash;
    # Available backend servers
    server 228.228.228.1:8443 max_fails=3 fail_timeout=30s;
    server 228.228.228.2:8443 max_fails=3 fail_timeout=30s;
    server 228.228.228.3:8443 max_fails=3 fail_timeout=30s;
    }
    
    server {
    listen 8443 ssl default_server;
    listen 443 ssl default_server;
    listen [::]:8443 ssl default_server;
    include snippets/self-signed.conf;
    include snippets/ssl-params.conf;
    underscores_in_headers on;
    
    root /var/www/html;
    
    index index.html index.htm index.nginx-debian.html;
    
    server_name _;
    
    
        location / {
            # switch off logging
            access_log off;
            try_files $uri $uri/ =404;
    
            # redirect all HTTP traffic to wss
            proxy_pass https://wss;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_pass_request_headers      on; 
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header HTTP_CF_IPCOUNTRY $http_cf_ipcountry;
    
            # WebSocket support (nginx 1.4)
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
    
            # Path rewriting
            rewrite /wss/(.*) /$1 break;
            proxy_redirect off;
    
        }
    }