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 :)