【问题标题】:Nodejs server https running, but socket won't connect (net::ERR_CONNECTION_TIMED_OUT)Nodejs 服务器 https 正在运行,但套接字无法连接(net::ERR_CONNECTION_TIMED_OUT)
【发布时间】:2017-10-19 04:16:08
【问题描述】:

我正在设置一个 nodejs 服务的子域,以便我可以使用 socket.io。我通过 https 提供页面,并且我让服务器正常运行。该页面已提供。那不是问题。问题是当我尝试将套接字连接到客户端时。我一直在尝试解决这个问题,我相信这里有很多有能力的人可以帮助我。

这是我的网站https://reward.cshive.com

我收到的错误消息:

客户端

var socket = io.connect('https://reward.cshive.com:3000');

服务器端

const https = require('https');
var fs = require('fs');
const options = {
  key: fs.readFileSync('/etc/letsencrypt/live/reward.cshive.com/privkey.pem'),
  cert: fs.readFileSync('/etc/letsencrypt/live/reward.cshive.com/cert.pem')
};
var app = https.createServer(options, (req, res) => {
   fs.readFile(__dirname + '/served.html',
  function (err, data) {
    if (err) {
      res.writeHead(500);
      console.log('Error loading page');
      return res.end('Error loading page');

    }
    console.log('--Connection');
    res.writeHead(200);
    res.end(data);
  });
})



var server = app.listen(3000, function(err) {
    if (err) {
        console.log(err);
    } else {
        console.log("Listening on port 3000");
    }
});
var io = require('socket.io').listen(server);

【问题讨论】:

  • 当您说“页面已提供”时,您指的是哪个页面?我最初以为您指的是代码中提到的页面(来自文件served.html),但我似乎无法访问它。我无法从端口 3000 获得任何响应,因此可能是代理或防火墙问题,也可能是服务器未运行等简单问题。
  • 对不起,我应该进一步澄清。我的意思是,served.html 文件由节点提供。我知道这一点,因为当我不执行“node server.js”时,我会从 nginx 收到“502 bad gateway”。我确实设置了一个 proxy_pass 以允许在可用站点中我的位置块中通过端口 3000 的请求。如果有帮助,我会在我从学校回来时添加配置。但是,防火墙是什么意思。哪一个?
  • 我自己没有尝试过,但这似乎通过 nginx 代理所有内容而不是尝试在端口 3000 gist.github.com/uorat/10b15a32f3ffa3f240662b9b0fefe706 上将 Node 直接暴露给世界。
  • 我会尽快尝试的。
  • 为什么不用 nginx?

标签: node.js sockets https socket.io


【解决方案1】:

在你的身上试试这个

把这个放在服务器部分,socket.io的路径可能会改变。对我来说是/socket.io-client/

    location /socket.io-client/ {
            proxy_pass http://node_server;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_redirect off;

            proxy_buffers 8 32k;
            proxy_buffer_size 64k;

            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_set_header X-NginX-Proxy true;
        }

还有这个

upstream node_server {
    server 127.0.0.1:8080;
    keepalive 15;
}

也这样做

var socket = io.connect();您不需要指定主机

【讨论】:

  • 谢谢,这并不是我解决问题所需要的。但绝对是修复的主要部分
  • 我建议让 nginx 处理所有与 ssl 相关的东西,让 node js 摆脱它。作为我看到的方法,你最终在节点 js 和 nginx 中都使用了 ssl。还不如让nginx来做。
  • 好吧,我尝试在 nodejs 中创建一个 http 服务器。但是浏览器会拒绝加载资源,因为它们会被标记为不安全。
猜你喜欢
  • 1970-01-01
  • 2015-08-15
  • 2022-01-20
  • 2013-08-18
  • 2018-01-24
  • 1970-01-01
  • 2012-11-03
  • 2021-02-18
  • 2015-06-25
相关资源
最近更新 更多