Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Node.js Socket.io WebSocket Nginx Configuration?

I am using Citrix load balancer.

Behind that , there is 4 virtual Nginx server. ip's like 172.16.10.40, 172.16.10.41, 172.16.10.42, 172.16.10.43

And 1 test server 172.16.10.50.

Nodejs installed on test server located on 172.16.10.50.

I've created a subdomain for nodejs like sub.example.com.

My nodejs app is working on 8070 port.

I want to use Websocket not xhr-pooling. With my codes and configs below, In Chrome Console i saw that

Status Code:101 Switching Protocols

But Nothing appers on Frames. No push.

If i change socketURL to

var socketURL   = http://172.16.10.50:8070

Websocket working without anyproblem in test platform (172.16.10.50).

But, In real Platform I have to use 'http://sub.example.com:8070';

If i set socket.io : 'transports', ['xhr-polling'] ; xhr-polling is working. But I want to use WebSocket.

 nginx version: nginx/1.4.1 
 node v0.8.8 
 socket.io v0.9.16

What i should do?

Thank you.

app.js

var app =
  server = require('http').createServer(app)
  , io = require('socket.io').listen(server,{ log: false })
  , url = require('url')
  , http= require('http')
  ,redis   = require("redis");

//io.set('transports', ['xhr-polling']); 

var livefeed        = redis.createClient();
server.listen(8070);

livefeed.on("message", function(channel, message){
    console.log("%s, the message : %s", channel, message);  
    io.sockets.in(channel).emit(channel,message);
});

io.sockets.on('connection', function (socket) {
    console.log("["+socket.id+"] connected"); 
    socket.on('subscribe', function (data) {
        //console.log("joining : %s",data.channel);
        socket.join(data.channel);
      });
    socket.on('unsubscribe', function(room) {  
        //console.log('leaving room', room);
        socket.leave(room); 
    });
    socket.on('disconnect', function (socket) {
        connected_socket--;
        console.log("Client disconnected");     
        SocketCount();
    });

});

example.js

var socketURL   =   'http://sub.example.com:8070';
var socket      = false;

var BKSocket = {
   connectSocket : function(){
        if(socket === false){
            try{
                socket = io.connect(socketURL,{'connect timeout': 1000});
            }catch(e){
                socket = false;
            }
        }
    },
    livefeeds:function(){
        this.connectSocket();

        if(socket !== false){
            socket.on('connect', function(data){                
                socket.emit('subscribe', {channel:'livefeed'});
            });             
            socket.on('livefeed', function (data) {
                console.log(data);
            });
        }       
    }
}

nginx Config

upstream backend {
    server 127.0.0.1:8070;
}

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

server {
    listen 80;
    server_name sub.example.com;

    #server_name _;
    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;

        proxy_pass http://backend/;
        proxy_redirect off;

        #proxy_http_version 1.1;
        #proxy_set_header Upgrade $http_upgrade;
        #proxy_set_header Connection $connection_upgrade;

        access_log off;
        error_log   /var/log/nginx/sub.example.com.error.log;

    }
}

error.log

2013/11/25 09:40:08 [error] 29812#0: *25900 upstream prematurely closed connection while reading response header from upstream, client: 172.16.10.10, server: v2.bitenekadar.com, request: "GET /socket.io/1/websocket/NPXo9XDAKbAapgpyLqCd HTTP/1.1", upstream: "http://172.16.10.50:8070/socket.io/1/websocket/NPXo9XDAKbAapgpyLqCd", host: "v2.bitenekadar.com"
2013/11/25 09:41:36 [error] 29812#0: *26046 upstream prematurely closed connection while reading response header from upstream, client: 172.16.10.10, server: v2.bitenekadar.com, request: "GET /socket.io/1/websocket/RxBjIryz50FjUs1RLqCe HTTP/1.1", upstream: "http://172.16.10.50:8070/socket.io/1/websocket/RxBjIryz50FjUs1RLqCe", host: "v2.bitenekadar.com"
2013/11/25 09:42:10 [error] 29812#0: *26046 upstream prematurely closed connection while reading response header from upstream, client: 172.16.10.10, server: v2.bitenekadar.com, request: "GET /socket.io/1/websocket/ZMuHPZgFcOGmULNdNStr HTTP/1.1", upstream: "http://172.16.10.50:8070/socket.io/1/websocket/ZMuHPZgFcOGmULNdNStr", host: "v2.bitenekadar.com"
2013/11/25 09:43:17 [error] 29812#0: *26063 upstream prematurely closed connection while reading response header from upstream, client: 172.16.10.10, server: v2.bitenekadar.com, request: "GET /socket.io/1/websocket/J3qPn40WioPviZZMNSts HTTP/1.1", upstream: "http://172.16.10.50:8070/socket.io/1/websocket/J3qPn40WioPviZZMNSts", host: "v2.bitenekadar.com"
2013/11/25 09:45:23 [error] 29812#0: *26181 upstream prematurely closed connection while reading response header from upstream, client: 172.16.10.10, server: v2.bitenekadar.com, request: "GET /socket.io/1/websocket/CtOaZ65Dq7dAX6jEOAap HTTP/1.1", upstream: "http://172.16.10.50:8070/socket.io/1/websocket/CtOaZ65Dq7dAX6jEOAap", host: "v2.bitenekadar.com"
like image 636
orhan bengisu Avatar asked Feb 16 '23 16:02

orhan bengisu


2 Answers

What version of nginx are you using? We ran into similar problems despite doing everything according to the docs. Turns out that our version (1.2.x) of nginx was (waaay) too old and didn't work properly, despite accepting the config without problems.

Updated to 1.4.4 and it worked fine!

By the way here's the config that we're using at the moment:

upstream devserver_pc {
    server localhost:9003;
}

server {
    listen 80;

    root /vagrant/pc/static;
    index index.html index.htm;

    access_log /var/log/nginx/pc.access.log;
    error_log  /var/log/nginx/pc.error.log;

    server_name pc.bvb-infotainment.vm;

    client_max_body_size 20M;
    location /static {
        alias /vagrant/pc/static;
    }

    location /socket.io/websocket {
        proxy_pass http://devserver_pc;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

    location / {
        proxy_http_version 1.1;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_set_header   X-NginX-Proxy    true;
        proxy_set_header   Host             $http_host;
        proxy_set_header   Upgrade          $http_upgrade;
        proxy_redirect     off;
        proxy_pass         http://devserver_pc;
    }
}
like image 61
Dave Vogt Avatar answered Feb 18 '23 04:02

Dave Vogt


Try to use the proxy_set_header:

server {
  listen   80;
  server_name  app.local;
  root  /home/app/public;
  passenger_enabled on;
  rails_env development;

  location /any_location {
     proxy_pass http://localhost:3001/realtime_page;
     proxy_http_version 1.1;
     proxy_set_header Upgrade $http_upgrade;
     proxy_set_header Connection "upgrade";
  }
}

http://blog.joshsoftware.com/2013/05/28/websocket-over-nginx/

What is the server responding (header) ? How does the request header looks like?

like image 36
Michael Avatar answered Feb 18 '23 05:02

Michael