Proxy reverso Nginx para upstream HTTPS obtendo 502 Bad Gateway?

Proxy reverso Nginx para upstream HTTPS obtendo 502 Bad Gateway?

Meu objetivo é escrever testes Jasmine (uma estrutura de teste JavaScript BDD) que exercitem uma API de back-end construída por uma equipe separada.

Eu tenho um servidor Jasmine rodando na porta 9000. Esse código emite solicitações AJAX com um caminho relativo que começa com/web/. Quero que essas solicitações sejam direcionadas para o back-end.

Até agora, tenho um proxy reverso para um bloco upstream assim:

upstream backend {
  server api-dev.example.com;
}

server {
  ...

  location / {
    proxy_pass http://localhost:9000;
    ...
  }

  location /web/ {
    proxy_pass https://backend/web/;
    ...
  }
}

O tráfego para '/' está funcionando bem, mas as solicitações AJAX (por exemplo, para

http://localhost:50000/web/internal?action=network-statistics

) estão 502'ing. Acredito que esteja atingindo o endpoint correto, mas há um erro de SSL. O log de erros do Nginx parece confirmar minha suspeita:

2013/12/13 16:55:28 [error] 1885#0: *257 SSL_do_handshake() failed (SSL: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol) while SSL handshaking to upstream, client: 127.0.0.1, server: localhost, request: "GET /web/internal/stats?action=network-statistics&request=null HTTP/1.1", upstream: "https://50.18.192.173:80/web/internal/stats?action=network-statistics", host: "localhost:50000", referrer: "http://localhost:50000/"

No entanto, se eu alterar o bloco upstream para:

upstream backend {
  server api-dev.example.com:443;
}

…então recebo 404s. Poderia jurar que vi configurações semelhantes funcionarem em outro lugar no Server Fault. Por exemplo,esseé uma pergunta muito semelhante. o que estou perdendo? O que poderia dar errado? Desculpe se isso é vago, ficarei feliz em adicionar mais detalhes.

Responder1

Tente remover /web/. Acho que você está recebendo 404 porque tentou acessar /web/web que não existe. Você deve encontrar mais dicas nos logs do Nginx.

upstream backend {
        server api-dev.example.com:443;
}

server {
        ...

    location / {
        proxy_pass http://localhost:9000;
        ...
    }

    location /web/ {
        proxy_pass https://backend;
        ...
    }
}

informação relacionada