web-dev-qa-db-ja.com

HTTPSアップストリームへのNginxリバースプロキシが502 Bad Gatewayを取得していますか?

私の目標は、別のチームによって構築されたバックエンドAPIを実行するJasmine(JavaScript BDDテストフレームワーク)テストを記述することです。

Jasmineサーバーをポート9000で実行しています。そのコードは、/ web /で始まる相対パスでAJAX要求を発行します。これらの要求をバックエンドに送信する必要があります。

これまでのところ、アップストリームブロックへのリバースプロキシは次のようになっています。

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

server {
  ...

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

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

「/」へのトラフィックは正常に機能していますが、AJAX=リクエスト(たとえば、

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

)は502です。正しいエンドポイントに到達していると思いますが、SSLエラーがあります。 Nginxのエラーログは私の疑いを確認するようです:

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/"

ただし、上流ブロックを次のように変更した場合:

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

…それから私は404を取得します。同様の構成が他の場所でサーバー障害で機能するのを見たことがあると誓ったかもしれません。たとえば、 this は非常によく似た質問です。何が欠けていますか?何がうまくいかないのでしょうか?あいまいな場合は申し訳ありませんが、詳細を追加させていただきます。

6
Jason Benn

/ web /を削除してみてください。存在しない/ web/webにアクセスしようとしたため、404を取得していると思います。 Nginxログからより多くのヒントを見つけることができるはずです。

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

server {
        ...

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

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