我可以通过网址http://example.com:8080/访问我的socket.io聊天。 Dreamhost不允许我们绑定80,所以我在8080绑定它。
我想删除网址中的端口号。所以,我使用了Dreamhost的代理服务器功能(http://wiki.dreamhost.com/Proxy_Server),这是Apache的mod_proxy。
我将端口号8080代理到URL http://example.com/socketchat。当我转到该URL时,聊天无效。我收到这个错误:
“代理错误 代理服务器从上游服务器收到无效响应。 代理服务器无法处理请求GET / socket /。 原因:从远程服务器“
读取时出错有没有办法摆脱与socket.io一起使用的URL中的端口号?如果没有任何作用,如果我在向公众发布网站时将端口号留在URL中,是否存在安全风险?感谢。
答案 0 :(得分:0)
我的猜测是mod_proxy不能很好地处理websockets,这并不奇怪。也就是说,你真的不应该将node.js放在Apache之后,因为这会破坏node.js的很多目的。 Apache很快就会成为你的瓶颈。
最后,不,在另一个端口上使用socket.io没有安全风险 - 无论您运行哪个端口,都会出现任何安全风险。如果它们阻止与端口80以外的端口的连接(这并非闻所未闻),您可能会遇到其他防火墙的问题 - 但是,在任何情况下,这样的防火墙可能会出现websockets的问题。
答案 1 :(得分:0)
Apache是否很快成为瓶颈取决于您如何正确使用它。它是一个非常成熟的网络服务器,并在世界各地托管大量网站。无论如何,您的socket.io应用程序不一定必须与Web应用程序共享相同的端口。您可以在端口8081上使用socket.io监听,并在端口8080上获得正常的http请求。然后,您可以将代理设置为现在指向8080,并将socket.io连接转到8081。 / p>
在这种情况下,端口不应该是一个问题,因为它不是用户在其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);
});
});
请注意,Web服务器正在侦听与socket.io连接不同的端口。这意味着您可以使用mod_proxy安全地将正常的http请求代理从80到8080,而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>