Proxy reverso de Websocket com nginx: Erro sobre a solicitação no log do servidor, mas funciona no navegador

2

A situação

Estou executando Etherpad , que é intermediado por proxy via nginx. O Etherpad usa Websockets com o Socket.io.

Minha configuração do nginx é mais ou menos este . O bloco de localização para o socket.io é este:

rewrite /CustomSubDir/socket.io/(.*) /socket.io/$1 break;
proxy_pass http://localhost:CustomPort/;
proxy_redirect   / /CustomSubDir/;
proxy_cookie_path / /CustomSubDir/;

# usual proxy header
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;
proxy_set_header X-NginX-Proxy true;

# websocket
proxy_set_header Accept-Encoding "";
proxy_http_version 1.1;
# http://nginx.org/en/docs/http/websocket.html
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Host $host;

proxy_buffers 8 32k;
proxy_buffer_size 64k;

proxy_buffering off;

O que é confuso

Portanto, a boa mensagem é: Tudo está funcionando! Por isso, não estou perguntando como fazer algo funcionar.
A base é: Embora tudo funcione, o nginx sempre me mostra mensagens de erro.

O que há de errado

nginx mostra esses erros no error.log :

2016/05/24 xx:yy:zz [error] 22197#0: *12059 connect() failed (111: Connection refused) while connecting to upstream, client: SOM.IPA.DDR.EES, server: somedomain.example.com, request: "GET /CustomSubDir/socket.io/?EIO=3&transport=polling&t=1464121868147-3&sid=H2GhIY24t2a40etpAACd HTTP/2.0", upstream: "http://[::1]:CustomPort/socket.io/?EIO=3&transport=polling&t=1464121868147-3&sid=H2GhIY24t2a40etpAACd", host: "somedomain.example.com"
2016/05/24 xx:yy:zz [error] 22197#0: *12070 connect() failed (111: Connection refused) while connecting to upstream, client: SOM.IPA.DDR.EES, server: somedomain.example.com, request: "POST /CustomSubDir/socket.io/?EIO=3&transport=polling&t=1464122037998-5&sid=T-pthraR669TF2cKAACe HTTP/2.0", upstream: "http://[::1]:CustomPort/socket.io/?EIO=3&transport=polling&t=1464122037998-5&sid=T-pthraR669TF2cKAACe", host: "somedomain.example.com"

Então eu pude rastrear esses pedidos. Aqui está o porquê: 1. Estas são obviamente requisições Websocket. 2. E estas são - e isso é especial - solicitações POST.

Ao carregar um Etherpad ou reconectar a um após uma conexão perdida, apenas uma solicitação é feita, o que preenche esses requisitos. Eu posso ver claramente no navegador e posso vê-lo aparecendo no log de erros do nginx em tempo real. Esta é a solicitação no meu navegador:

200 POST https://somedomain.example.com/CustomSubDir/socket.io/?EIO=3&transport=polling&t=1464121868143-2&sid=H2GhIY24t2a40etpAACd

E contém (por exemplo) essa carga útil:

164:42["message",{"component":"pad","type":"CLIENT_READY","padId":"CENSORED","sessionID":"null","password":null,"token":"t.qbszmj[...]","protocolVersion":2}]

A resposta do servidor é:

HTTP/2.0 200 OK
Server: nginx
Date: Tue, 24 May 2016 xx:yy:zz GMT
Content-Type: text/html
Content-Length: 2
access-control-allow-origin: *
Set-Cookie: io=H2GhIY24t[...]
X-Firefox-Spdy: h2

ok

Por que posso ter certeza de que esse é o culpado

Tenho certeza de que a solicitação POST causa isso. Não só porque é a única solicitação POST com esta URL ao acessar o pad, eu também posso comparar o comportamento. Porque no mesmo servidor eu também corro Etherdraw , que funciona bem parecido, mas tem uma diferença importante: ele não parece usar Pedidos POST Websocket.
E adivinha? O error.log está vazio.

Minhas perguntas

Então, quais são minhas perguntas:

  1. Como posso ver a solicitação para ter sucesso no meu navegador (com uma resposta correta do servidor!) enquanto o nginx me informa que está com falha no log?
  2. Como posso me livrar dessas mensagens de erro? AFAIK os pedidos não falham ...
por rugk 24.05.2016 / 23:18