Load balancing WebSockets with ELB and nginx on EC2

Following this guide will allow you to create an Elastic Load Balancer for a WebSocket application with support for SSL and the ability to read client IP addresses.

 Setup an Elastic Load Balancer

Enable TCP forwarding on port 80. If you want to use SSL, you must also upload a certificate and forward port 443.

 Enable the proxy protocol for your ELB

You can only enable the proxy protocol through the command line SDK.

aws elb create-load-balancer-policy --load-balancer-name my-load-balancer --policy-name EnableProxyProtocol --policy-type-name ProxyProtocolPolicyType --policy-attributes "AttributeName=ProxyProtocol,AttributeValue=true"

 Enable the proxy protocol in nginx

Your nginx.conf should look something like this. By setting the X-Forwarded-For header to $proxy_protocol_addr, the WebSocket application will be able to get the client’s IP.

server {
  listen  80  proxy_protocol;
  real_ip_header  proxy_protocol;

  location /app/ {
    proxy_http_version  1.1;
    proxy_set_header  Connection  $connection_upgrade;
    proxy_set_header  Upgrade  $http_upgrade;
    proxy_set_header  X-Forwarded-For  $proxy_protocol_addr;

Now read this

Migrating to Socket.IO 1.0

There are a few things not covered in the official guide that I had to figure out on my own. Here is an example of the changes required for a mock application using namespaces, rooms, query strings, and a reverse proxy. Client var socket... Continue →