Kai Sellgren
Kai Sellgren

Reputation: 30312

nginx and proxying WebSockets

I'm trying to proxy WebSocket + HTTP traffic with nginx.

I have read this: http://nginx.org/en/docs/http/websocket.html

My config looks like:

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;

    gzip  on;

    map $http_upgrade $connection_upgrade {
      default upgrade;
      ''      close;
    }

    server {
      listen 80;
      server_name ourapp.com;

      location / {
        proxy_pass http://127.0.0.1:100;
        proxy_http_version 1.1;
        proxy_redirect off;
        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   Upgrade          $http_upgrade;
        proxy_set_header   Connection       $connection_upgrade;
      }
    }
}

I have 2 problems:

1) The connection closes once a minute.

2) I want to run both HTTP and WS on the same port. The application works fine locally, but if I try to put HTTP and WS on the same port and set this nginx proxy, I get this:

WebSocket connection to 'ws://ourapp.com/ws' failed: Unexpected response code: 200

Loading the app (HTTP) seems to work fine, but WebSocket connection fails.

Upvotes: 17

Views: 6932

Answers (1)

Kai Sellgren
Kai Sellgren

Reputation: 30312

Problem 1: As for the connection dying once a minute, I realized that it's nginx timeout variable. I can either make our app to ping once in a while or increase the timeout. I'm not sure if I should set it as 0, I decided to just ping once a minute and set the timeout to 90 seconds. (keepalive_timeout)

Problem 2: Connectivity issues arose when I used CloudFlare CDN. Disabling CloudFlare acceleration solved the problem.

Alternatively I could create a subdomain and set it as "unaccelerated" and use that for WS.

Upvotes: 13

Related Questions