Nginx が HTTPS アップストリームにリバース プロキシすると 502 Bad Gateway が発生しますか?

Nginx が HTTPS アップストリームにリバース プロキシすると 502 Bad Gateway が発生しますか?

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

ポート 9000 で Jasmine サーバーを実行しています。そのコードは、/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が表示されます。Server Faultの他の場所でも同様の設定が機能しているのを見たことがあるはずです。たとえば、これ非常に似た質問です。何が足りないのでしょうか? 何が間違っているのでしょうか? 漠然としていて申し訳ありませんが、詳細を追加させていただきます。

答え1

/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;
        ...
    }
}

関連情報