conexão nginx recusou ao conectar-se ao upstream

1

Eu tenho um servidor no qual eu implantei uma API (Sinatra). Eu corro essa API na porta 9292 e solicitações de proxy para ela.

Eu também preciso implantar um arquivo javascript estático e seus recursos de suporte. Eu faço isso no mesmo servidor.

Todas as informações abaixo foram anonimizadas.

O endpoint de acesso da API é o seguinte:

server {
    listen 80;
    server_name api.myapp.com;

    location / {
            proxy_pass http://localhost:9292;
    }
}

e o endpoint do qual estou atendendo o JS é:

server {
    listen 80;
    server_name xsa.myapp.com;

    location / {
            root /data/mydir/xsa;
    }
}

O servidor "localhost: 3003" que você vê no erro abaixo é onde estou me referindo ao JS de.

2018/11/23 23:31:27 [error] 18720#0: *32 connect() failed 
(111: Connection refused) while connecting to upstream, 
client: 255.255.255.7, server: api.myapp.com,
request: "GET /api/v1/sub/sub_ABCXYZ/info?token%3D56f51132-
406b-4e06-a600-7379876446ed HTTP/1.1", upstream:
"http://[::1]:9292/api/v1/sub/sub_ABCXYZ/info?token%3D56f51132
-406b-4e06-a600-7379876446ed", host: "api.myapp.com",
 referrer: "http://xsa.myapp.com/src/selector.html?
mfid=sub_ABCXYZ&location=http://localhost:3003/"

Então, para recapitular:

  • API Sinatra na VM "x" com a porta 9292
  • servidor nginx na VM "x" exibindo um proxy na porta 80 para a API para solicitações que chegam a "api.myapp.com"
  • o mesmo servidor nginx também está exibindo um arquivo javascript na porta 80 para solicitações que chegam em "xsa.myapp.com"

Eu posso ver o JS muito bem em um navegador, então, na verdade, ele está sendo exibido. Está no material dinâmico que faz na instanciação que está causando o erro.

Eu também posso ver que o servidor Sinatra no 9292 está recebendo o pedido e retornando um 200. Parece que o problema está depois disso. Portanto, nem parece que a conexão upstream é realmente recusada. Verifiquei novamente se essa resposta é exatamente a mesma resposta de quando o JS é exibido localmente (e funciona).

* UPDATE *

O erro "conexão recusada" realmente ocorre mesmo quando o JS é exibido localmente e funciona corretamente, então parece que o erro é um arenque vermelho.

    
por AKWF 24.11.2018 / 01:19

1 resposta

1

Você está recebendo esta mensagem de erro porque seu aplicativo Sinatra não está atendendo no endereço IPv6 padrão para localhost, ::1 , mas está ouvindo no endereço IPv4 herdado, 127.0.0.1 .

Como você especificou que o upstream do nginx é localhost , o nginx tenta primeiro o endereço IPv6, mas como o servidor do aplicativo não está escutando nesse endereço, o nginx recebe uma conexão recusada. Em seguida, ele tenta novamente a conexão no IPv4, que é bem-sucedido e atende ao seu aplicativo.

Como isso introduz um problema de desempenho, e como o IPv6 é preferido em relação ao IPv4 preterido, você deve reconfigurar seu aplicativo Sinatra para escutar no IPv6. Por exemplo,

set :bind, '::1'

Em particular, você deve não vincular a 127.0.0.1.

Você também pode simplesmente remover o host de ligação, porque por padrão ele escutará em IPv6 localhost se você estiver usando thin (como você deve em prod) ou WEBrick (em dev, se você esquecer de gem install thin). / p>

(E em uma nota relacionada, você configurou explicitamente o nginx para não ouvir em IPv6, o que causará problemas semelhantes mais tarde, ou talvez até agora. Você deve corrigir isso também , enquanto você está nisso.)

    
por 24.11.2018 / 02:37