events { worker_connections 1024; } http { upstream node_app { ip_hash; # Enables session persistence based on client IP server node-app-1:4000; server node-app-2:4000; server node-app-3:4000; } # WebSocket upgrade configuration map $http_upgrade $connection_upgrade { default upgrade; '' close; } server { listen 80; location / { proxy_pass http://node_app; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # WebSocket headers proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_read_timeout 86400; # Keep WebSocket connections alive (24 hours) } # Health check endpoint location /health { proxy_pass http://node_app; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } }