【问题标题】:nodejs + nginx getting 502 error when using https module instead of httpnodejs + nginx 在使用 https 模块而不是 http 时出现 502 错误
【发布时间】:2017-05-10 18:46:46
【问题描述】:

我已经制作了我的 nodejs 应用程序,将其托管在数字海洋服务器上,将其连接到域名,一切正常,但是当我尝试放置 ssl 证书(使用 https 模块而不是 http)时,它没有作品。这是一个代码:

var sslopt = {

    key  : fs.readFileSync('./ssl/server.key'),
    cert : fs.readFileSync('./ssl/server.crt'),
    ca   : [fs.readFileSync('./ssl/ca1.crt'), fs.readFileSync('./ssl/ca2.crt')]

};

var server = https.createServer(sslopt,function(req,res){
    ...
});

server.listen(8001,function(err){
    ...
});

我的 nodejs 应用程序运行良好,但如果我尝试访问它,我只会看到 502 Bad Gateway 错误,并且没有向我的 nodejs 应用程序发送任何请求。当我打开我的 nginx 错误日志时,我看到了错误

-date--time- [error] 18116#18116: *1 recv() 失败(104: Connection reset by peer)同时从上游读取响应头,客户端:-ip-,服务器:-server-,请求:“GET / HTTP/1.1”,上游:“http://127.0.0.1:8001/”,主机:-host-

但最奇怪的是,如果我尝试使用 https 协议和端口 8001 (https://{domainname}.com:8001) 进行访问,我可以看到我的应用程序运行良好,但连接不安全。

我只是无法理解我做错了什么......

附言

我的 nginx 配置文件

server {
    listen *:443;
listen *:80;


    server_name {myhostname};

    access_log /var/log/nginx/qt.access.log;
    error_log /var/log/nginx/qt.error.log;

    root /srv/qt;
    index index.html index.htm index.php;


    # Headers to pass to proxy server.
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $host;
    proxy_set_header X-NginX-Proxy true;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_cache_bypass $http_upgrade;
    proxy_http_version 1.1;
    proxy_redirect off;
    # Go to next upstream after if server down.
    proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
    proxy_connect_timeout 5s;
    # Gateway timeout.
    proxy_read_timeout 20s;
    proxy_send_timeout 20s;
    # Buffer settings.
    proxy_buffers 8 32k;
    proxy_buffer_size 64k;




    location  / {



        proxy_pass http://127.0.0.1:8001;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    }

}

【问题讨论】:

  • proxy_pass 设置为 http://,而不是 https://。但是,我建议不要让 Node 处理 HTTPS,而是让 NGINX 来处理(所以 "client-to-NGINX" 是 HTTPS 并且 "NGINX-to-Node" 是纯 HTTP)。
  • 感谢您的回复。如果我将证书附加到 nginx,然后使用 http 而不是 https 一切正常,但我现在无法连接到 websocket 服务器。在控制台中,我看到了错误。 WebSocket 连接到 'wss://{hostname}:8001/' 失败:连接建立错误:net::ERR_CONNECTION_CLOSED 并且没有请求发送到我的 websocket 服务器日志
  • 你应该让 NGINX 为你代理你的 websockets:wss://{hostname}(不需要端口号)
  • 现在它响应我与 'wss://{hostname}/' 的连接失败:WebSocket 握手期间出错:意外响应代码:200 在我的控制台中,我看到它就像简单的 http 请求一样。 ..
  • 这可能是个问题,尽管我认为常规 HTTPS 请求也会在这种情况下导致问题。也许(目前)将 HTTPS 部分移回 Node 更容易:(

标签: node.js ssl nginx https


【解决方案1】:

认识到这是一个旧帖子,希望这仍然可以帮助某人。我刚刚弄清楚似乎是同一件事,它与代理服务器有关。

我的 NodeJS 服务器在没有 SSL 的情况下运行良好,但在我使用 https 时却没有到达服务器就给出了 502。

// =============================================================================
// START THE SERVER

var port = process.env.PORT || 8080;        // set our port

https.createServer({
     key: fs.readFileSync('./certs/private.key'),
     cert: fs.readFileSync('./certs/cert.crt')
 }, app).listen(port);

//app.listen(port);

console.log('API Active on port ' + port);

我的客户端和服务器位于使用 Squid3 代理服务器的 pfSense 防火墙后面。

pfSense 控制 api.mydomain.com 的 DNS,并在我调用 api.mydomain.com:8080/myroute 时将流量路由到我的开发服务器。我有 api.mydomain.com 的有效 SSL/TLS 证书

  • 取消注释 app.listen(port) 行后一切正常。

  • 在取消注释 https.createServer(...) 的情况下,我收到 502 错误并且流量从未到达服务器。

修复:

  1. 在 pfSense 点击服务 -> Squid 代理服务器
  2. 单击 ACL 配置页面
  3. 在页面底部找到该部分 称为 Squid 允许的端口。
  4. 在 ACL SSL 端口字段中,输入您的端口 应用程序正在使用(在我的例子中是 8080)。

对我来说,彩虹出现了,蓝鸟确实在歌唱。

【讨论】:

    猜你喜欢
    • 2018-04-23
    • 1970-01-01
    • 2015-04-24
    • 2016-02-16
    • 2012-07-10
    • 1970-01-01
    • 2019-11-14
    • 2016-10-23
    • 1970-01-01
    相关资源
    最近更新 更多