Socket.io com Sails.js / Node.js e NGINX no SSL: gateway inválido

1

Eu comecei a me aventurar no NGINX e no SSL.

Usando o Ubuntu 16.04.

Estou executando um servidor Sails na porta 1337 padrão e configuro o NGINX com SSL (usando o comando letsencrypt). A porta 80 é redirecionada para 443 e o upstream vai para o Sails.

Eu também tenho um servidor Tomcat ouvindo em 8080 e uso o NGINX para redirecionar da mesma maneira.

Tudo funciona bem: posso navegar nos dois servidores em https sem portas especiais no navegador.

Eu configurei o socket.io para usar apenas o protocolo websockets (sem polling). Isso é definido no servidor e no cliente do navegador.

No entanto, o socket.io (sails.io) lança um erro 502 no navegador. (o polling também deu um erro)

Aqui estão os meus sites NGINX disponíveis para o servidor Sails:

upstream sails {
   server 127.0.0.1:1337 fail_timeout=0;
}

server {
   listen 80;
   listen [::]:80;
   server_name mysails.server.com;
   return 301 https://$server_name$request_uri;
}

server {
   listen 443;
   listen [::]:443 ssl http2;
   server_name mysails.server.com;
   include snippets/ssl-mysails.server.conf;
   include snippers/ssl-params.conf;
   large_client_header_buffers 8 32k;

   location / {
      proxy_pass http://sails/;
      proxy_http_version 1.1;
      proxy_redirect off;
      proxy_set_header Host $host;
      proxy_set_header Port $server_port;
      proxy_set_header X-Real-IP $remot_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-NginX-Proxy true;
      proxy_pass_request_headers on;

   }

   location /socket.io/ {
      proxy_pass http://sails/;
      proxy_http_version 1.1;
      proxy_redirect off;
      proxy_set_header Host $host;
      proxy_set_header Port $server_port;
      proxy_set_header X-Real-IP $remot_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-NginX-Proxy true;
      proxy_pass_request_headers on;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
      proxy_buffers 8 32k;
      proxy_buffer_size 64k;

   }   
}

Os arquivos snippets/ssl-mysails.server.conf e snippers/ssl-params.conf contêm:

ssl_certificate /path/to/letsencrypt/fullchain.pem;
ssl_certificate_key /path/to/letsencrypt/privkey.pem;

e

# from https://cipherli.st/
# and https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# Disable preloading HSTS for now.  You can use the commented out header line that includes
# the "preload" directive if you understand the implications.
#add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
ssl_dhparam /etc/ssl/certs/dhparam.pem;

Alguém tem alguma pista sobre o que está acontecendo ...?

UPDATE ERROR LOG e comportamento estranho

Meu log de erros do nginx diz isso:

upstream prematurely closed connection while reading response header from upstream, client: XXXXXXXX, server: mysals.server.com, request: "GET /socket.io/?__sails_io_sdk_version=0.13.8&__sails_io_sdk_platform=browser&__sails_io_sdk_language=javascript&EIO=3&transport=websocket HTTP/1.1", upstream: "http://127.0.0.1:1337/?__sails_io_sdk_version=0.13.8&__sails_io_sdk_platform=browser&__sails_io_sdk_language=javascript&EIO=3&transport=websocket", host: "mysails.server.com"

E meu log detalhado do Sails é inconsistente. Pode dizer isso:

*verbose*: Rendering view: "homepage" (located @ "/opt/FillForm/views/homepage")
*verbose*: • using configured layout:: layout (located @ "/opt/FillForm/views/layout")
*verbose*: Rendering view: "homepage" (located @ "/opt/FillForm/views/homepage")
*verbose*: • using configured layout:: layout (located @ "/opt/FillForm/views/layout")
*verbose*: Rendering view: "fileLink" (located @ "/opt/FillForm/views/fileLink")
*verbose*: • using configured layout:: layout (located @ "/opt/FillForm/views/layout")
*verbose*: Sending 404 ("Not Found") response
*verbose*: Sending 404 ("Not Found") response
*verbose*: Rendering view: "fileLink" (located @ "/opt/FillForm/views/fileLink")
*verbose*: • using configured layout:: layout (located @ "/opt/FillForm/views/layout")
*verbose*: Sending 404 ("Not Found") response
*verbose*: Sending 404 ("Not Found") response

O que é estranho, porque deve haver apenas uma solicitação para a /opt/FillForm/views/fileLink view / page.

Se você atualizar a página (F5), o console Javascript no navegador poderá dizer:

 Socket is trying to reconnect to Sails...
_-|>_-  (attempt #7)

e toda tentativa resulta em uma série de

verbose: Rendering view: "homepage" (located @ "/opt/FillForm/views/homepage")
verbose: • using configured layout:: layout (located @ "/opt/FillForm/views/layout")

mensagens no log detalhado do Sails. Por que os pedidos de sockets fazem com que o Sails renderize a visualização da página inicial?

Se você atualizar com o cache de ignorar (shift + F5), o console Javascript começará a mostrar a mensagem AND AND the 502 bad gateway:

WebSocket connection to 'wss://mysqils.server.com/socket.io/?__sails_io_sdk_version=0.13.8&__sails_io_s…tform=browser&__sails_io_sdk_language=javascript&EIO=3&transport=websocket' failed: Error during WebSocket handshake: Unexpected response code: 502
        Socket is trying to reconnect to Sails...
_-|>_-  (attempt #20)

E o log detalhado do Sails mostra apenas duas instâncias da seguinte mensagem:

verbose: Sending 404 ("Not Found") response
verbose: Sending 404 ("Not Found") response

E ele pára de exibir quaisquer outros erros (não como no cenário anterior, em que todas as tentativas de websocket resultaram em mensagens de renderização de exibição.)

Nesse caso, parece que as solicitações do wss não estão passando pelo Nginx para o Sails.

    
por noderman 28.01.2017 / 00:35

1 resposta

1

Portanto, o problema é uma configuração ruim no arquivo conf disponível para sites do NGINX.

location /socket.io/ {
      proxy_pass http://sails/;
...
}

deve ser

location /socket.io/ {
      proxy_pass http://sails/socket.io/;
...
}

Coisas bem básicas: o "local" não é encaminhado para o proxy_pass (por que seria, certo?) - Então você precisa ter certeza de que os pedidos de sockets são redirecionados para o endpoint exato do soquete.

    
por 09.02.2017 / 22:29