簡體   English   中英

使用https模塊而不是http時,nodejs + nginx出現502錯誤

[英]nodejs + nginx getting 502 error when using https module instead of http

我已經制作了我的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- [錯誤] 18116#18116:* 1 recv()失敗(104:對等連接重置),同時從上游讀取響應標頭,客戶端:-ip-,服務器:-server-,請求:“ GET / HTTP / 1.1”,上游:“ http://127.0.0.1:8001/ ”,主機:-host-

但是最奇怪的是,如果我嘗試使用https協議和端口8001(https:// {domainname} .com:8001)進行訪問,我可以看到我的應用程序運行正常,但連接不安全。

我只是不明白我在做什么錯...

PS

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

    }

}

認識到這是一個舊帖子,希望它仍然可以對某人有所幫助。 我只是想出了什么似乎是同一回事,這與代理服務器有關。

我的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防火牆后面。

當我調用api.mydomain.com:8080/myroute時,pfSense控制api.mydomain.com的DNS並將流量路由到我的開發服務器。 我有api.mydomain.com的有效SSL / TLS證書

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

  • 取消注釋https.createServer(...)后,我收到502錯誤,流量從未到達服務器。

修理:

  1. 在pfSense中,單擊服務-> Squid代理服務器
  2. 單擊ACL配置頁面
  3. 在頁面底部找到名為Squid Allowed Ports的部分。
  4. 在“ ACL SSL端口”字段中,輸入您的應用程序正在使用的端口(在我的情況下為8080)。

對我來說,彩虹出現了,藍鳥也唱歌了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM