nodejs + nginx在使用https模块而不是http时出错502

时间:2017-05-10 18:46:46

标签: node.js ssl nginx https

我已经制作了我的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:对等连接重置)从上游读取响应头,客户端:-ip-,server:-server-,request :“GET / HTTP / 1.1”,上游:“http://127.0.0.1:8001/”,主机:-host -

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

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

P.S。

我的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;

    }

}

1 个答案:

答案 0 :(得分:0)

认识到这是一个老帖子,希望这仍然可以帮助某人。我只是想出了什么似乎是相同的事情,这是代理服务器相关的。

我的NodeJS服务器在没有SSL的情况下工作正常,但在使用https时却没有到达服务器。

// =============================================================================
// 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 Allowed Ports。
  4. 在“ACL SSL端口”字段中,输入您的端口 应用程序正在使用(在我的情况下为8080)。
  5. 对我来说,彩虹出现了,蓝鸟也唱了。