nginx proxy websockets, deve estar faltando alguma coisa

3

Eu tenho um aplicativo de bate-papo básico escrito em node.js usando express e socket.io; funciona bem quando se conecta diretamente ao nó na porta 3000

Mas não funciona quando tento usar o nginx v1.4.2 como proxy.

Eu começo usando o mapa de conexão

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

Em seguida, adicione os locais

location /socket.io/ {
   proxy_pass  http://node;
   proxy_redirect off;
   proxy_http_version 1.1;
   proxy_set_header Host $http_host;
   proxy_set_header X-Forwarded-For $remote_addr;
   proxy_set_header X-Request-Id $txid;
   proxy_set_header X-Session-Id $uid_set+$uid_got;
   proxy_set_header Upgrade $http_upgrade;
   proxy_set_header Connection $connection_upgrade;
   proxy_buffering off;

   proxy_read_timeout 86400;
    keepalive_timeout 90;

    proxy_cache off;

    access_log /var/log/nginx/webservice.access.log;
    error_log /var/log/nginx/webservice.error.log;
}

location /web-service/ {
   proxy_pass  http://node;
   proxy_redirect off;
   proxy_http_version 1.1;
   proxy_set_header Host $http_host;
   proxy_set_header X-Forwarded-For $remote_addr;
   proxy_set_header X-Request-Id $txid;
   proxy_set_header X-Session-Id $uid_set+$uid_got;
   proxy_set_header Upgrade $http_upgrade;
   proxy_set_header Connection $connection_upgrade;
   proxy_buffering off;

   proxy_read_timeout 86400;

    keepalive_timeout 90;

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

   rewrite /web-service/(.*) /$1 break;

   proxy_cache off;
}

Estes são construídos usando todas as dicas para que funcione e que eu possa encontrar. O log de erros não mostra nenhum erro. (exceto quando eu paro o nó para testar o log de erros está funcionando)

Quando através do nginx eu vejo uma conexão websocket nas ferramentas dev, com o status de 101; mas a aba frames sob as resuições está vazia. A única diferença que eu posso ver nos cabeçalhos de resposta é uma diferença de caso - "upgrade" vs "Upgrade" - através do nginx:

Connection:upgrade
Date:Fri, 08 Nov 2013 11:49:25 GMT
Sec-WebSocket-Accept:LGB+iEBb8Ql9zYfqNfuuXzdzjgg=
Server:nginx/1.4.2
Upgrade:websocket

direto do nó

Connection:Upgrade
Sec-WebSocket-Accept:8nwPpvg+4wKMOyQBEvxWXutd8YY=
Upgrade:websocket

saída do nó (quando usada através do nginx)

debug - served static content /socket.io.js
debug - client authorized
info  - handshake authorized iaej2VQlsbLFIhachyb1
debug - setting request GET /socket.io/1/websocket/iaej2VQlsbLFIhachyb1
debug - set heartbeat interval for client iaej2VQlsbLFIhachyb1
debug - client authorized for
debug - websocket writing 1::
debug - websocket writing 5:::{"name":"message","args":[{"message":"welcome to the chat"}]}
debug - clearing poll timeout
debug - jsonppolling writing io.j[0]("8::");
debug - set close timeout for client 7My3F4CuvZC0I4Olhybz
debug - jsonppolling closed due to exceeded duration
debug - clearing poll timeout
debug - jsonppolling writing io.j[0]("8::");
debug - set close timeout for client AkCYl0nWNZAHeyUihyb0
debug - jsonppolling closed due to exceeded duration
debug - setting request GET /socket.io/1/xhr-polling/iaej2VQlsbLFIhachyb1?t=1383911206158
debug - setting poll timeout
debug - discarding transport
debug - cleared heartbeat interval for client iaej2VQlsbLFIhachyb1
debug - setting request GET /socket.io/1/jsonp-polling/iaej2VQlsbLFIhachyb1?t=1383911216160&i=0
debug - setting poll timeout
debug - discarding transport
debug - clearing poll timeout
debug - clearing poll timeout
debug - jsonppolling writing io.j[0]("8::");
debug - set close timeout for client iaej2VQlsbLFIhachyb1
debug - jsonppolling closed due to exceeded duration
debug - setting request GET /socket.io/1/jsonp-polling/iaej2VQlsbLFIhachyb1?t=1383911236429&i=0
debug - setting poll timeout
debug - discarding transport
debug - cleared close timeout for client iaej2VQlsbLFIhachyb1

quando direcionado para o nó, o cliente não inicia a pesquisa.

As saídas normais do nó de material http funcionam bem com o nginx.

Claramente algo que eu não estou vendo, mas estou preso, obrigado :)

    
por CodeMonkey 08.11.2013 / 15:25

2 respostas

1

Você já tentou uma configuração mínima como:

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

Observe também a mudança de $ http_host para $ host, já que seus valores podem ser diferentes em alguns casos: link

    
por 19.11.2013 / 16:38
0

Eu tive o mesmo problema quando introduzi o nginx para a conexão do Socket da Web. O problema é que forcei no nodejs a conexão a ser imediatamente Web Socket. Removendo essa força, primeiro negocie em polling e atualize automaticamente:

No lado do cliente, comentei o transporte:

//transports:['websocket', 'polling'] this was not permiting my connection with nginx

io(this.adress, {query: 'auth_cookie='+this.auth_cookie});

Também removo a configuração de transporte no lado do servidor.

Para completar esta é minha configuração nginx:

server {
  listen 80;

  server_name demo2.example.com;

  location /socket.io {
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header Host $host;
       proxy_pass http://demo2.example.com:3012/socket.io;
       proxy_http_version 1.1;
       proxy_set_header Upgrade $http_upgrade;
       proxy_set_header Connection "Upgrade";
  }

  location / {
       proxy_pass http://demo2.example.com:81;

  }
}

Espero que isso ajude

    
por 13.02.2015 / 09:10