0

我的 socket.io 聊天可以通过 URL http://example.com:8080/访问。Dreamhost不允许我们绑定80,所以我在8080上绑定。

我想去掉 URL 中的端口号。所以,我使用了 Dreamhost 的代理服务器功能 (http://wiki.dreamhost.com/Proxy_Server),它是 Apache 的 mod_proxy。

我将端口号 8080 代理到 URL http://example.com/socketchat。当我转到那个 URL 时,聊天不起作用。我收到此错误:

“代理错误代理服务器收到来自上游服务器的无效响应。代理服务器无法处理请求 GET /socket/。原因:从远程服务器读取错误”

有没有办法摆脱与 socket.io 一起使用的 URL 中的端口号?如果没有任何效果,如果我在向公众发布我的网站时将端口号留在 URL 中会不会有安全风险?谢谢。

4

2 回答 2

0

我的猜测是 mod_proxy 不能很好地处理 websockets,这不足为奇。也就是说,你真的不应该把 node.js 放在 Apache 后面,因为这违背了 node.js 的很多目的。Apache 将很快成为您的瓶颈。

最后,不,在另一个端口上使用 socket.io 没有安全风险——无论您在哪个端口上运行它,都会存在任何安全风险。如果其他防火墙阻止与端口 80 以外的端口的连接(这并非闻所未闻),您可能会遇到其他防火墙的问题——但话又说回来,此类防火墙在任何情况下都可能会出现 websocket 问题。

于 2012-04-26T00:02:21.690 回答
0

Apache 是否很快成为瓶颈取决于您如何准确地使用它。这是一个非常成熟的网络服务器,可以很好地托管世界各地的大量网站。无论如何,您的 socket.io 应用程序不一定要与您的 Web 应用程序共享相同的端口。您可以让 socket.io 在端口 8081 上侦听,并在端口 8080 上进行正常的 http 请求。然后您可以将代理设置为指向 8080,就像现在一样,让您的 socket.io 连接转到 8081。

在这种情况下,端口应该不是问题,因为用户不会在他们的 URL 中看到它,并且 socket.io 通信不必通过代理。如果您为 Apache 提供了足够多的请求以合法地成为瓶颈,那么无论如何您应该能够为更好的托管环境而努力!

例子

服务器

var app = require('http').createServer(handler)
  , io = require('socket.io').listen(8081)
  , fs = require('fs')

app.listen(8080);

function handler (req, res) {
  fs.readFile(__dirname + '/index.html',
  function (err, data) {
    if (err) {
      res.writeHead(500);
      return res.end('Error loading index.html');
    }

    res.writeHead(200);
    res.end(data);
  });
}

io.sockets.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    console.log(data);
  });
});

请注意,网络服务器正在侦听与 socket.io 连接不同的端口。这意味着您可以使用 mod_proxy 安全地代理从 80 到 8080 的正常 http 请求,并且 socket.io 可以绕过代理直接在端口 8081 上非常愉快地通信。您的用户无需输入端口即可访问该站点。

客户

<script src="http://domain.com:8081/socket.io/socket.io.js"></script>
<script>
  var socket = io.connect('http://domain.com:8081');
  socket.on('news', function (data) {
    console.log(data);
    socket.emit('my other event', { my: 'data' });
  });
</script>
于 2012-04-26T01:24:28.880 回答