Nginx 反向代理到 HTTPS 上游得到 502 Bad Gateway?

Jas*_*enn 6 ssl nginx reverse-proxy

我的目标是编写 Jasmine(一个 JavaScript BDD 测试框架)测试,以执行由独立团队构建的后端 API。

我有一个在端口 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/;
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

到“/”的流量工作正常,但 AJAX 请求(例如,

http://localhost:50000/web/internal?action=network-statistics
Run Code Online (Sandbox Code Playgroud)

) 是 502'ing。我相信它到达了正确的端点,但存在 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/"
Run Code Online (Sandbox Code Playgroud)

但是,如果我将上游块更改为:

upstream backend {
  server api-dev.example.com:443;
}
Run Code Online (Sandbox Code Playgroud)

……然后我得到了 404。我可以发誓我在 Server Fault 的其他地方看到过类似的配置。例如,是一个非常相似的问题。我错过了什么?可能出什么问题了?对不起,如果这是模糊的,我很乐意添加更多细节。

小智 2

尝试删除/web/。我认为您收到 404 是因为它尝试访问不存在的 /web/web 。您应该能够从 Nginx 日志中找到更多提示。

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

server {
        ...

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

    location /web/ {
        proxy_pass https://backend;
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)