对于我的项目,我需要一个VPS,所以我在DigitalOcean上买了一个。我安装了MongoDB,Laravel,整个操作都在Nginx上运行。
今天早些时候我问了一个关于计时器的问题,建议是使用WebSockets。根据评论,最好的方法是使用NodeJS和Socket.io。所以我做到了。
我在这里(本地)遵循this教程,并且在localhost上完全没有任何问题。
所以我的下一步是将代码上传到我的网络服务器并将其与Laravel结合使用。我在建立连接时遇到了一些问题,但在我发现this Stackoverflow帖子后,它终于奏效了。服务器正在发送日期对象,屏幕上的计时器正在实时更新。
但只有当我通过node
terminal-command手动启动脚本时,它才有效。所以我在DigitalOcean上关注了this教程,你使用PM2继续运行脚本,即使我关闭终端/退出我的VPS。一切都工作正常,计时器仍在更新,我真的很惊讶我没有遇到那么多问题..
..直到5分钟后。突然之间,WebSocket停止了工作。也许我在没有意识到的情况下做了一个拼写错误,也许服务器注意到代码中的一些变化,我没有。我不知道,但当我查看开发人员控制台时,它说:
GET http://<my-domain-ip>:8080/socket.io/?EIO=3&transport=polling&t=LF8I2CO net::ERR_CONNECTION_REFUSED
当然,我搜索了很多内容并根据(主要)Stackoverflow的答案对我的代码应用了各种更改,但现在我真的缺乏想法,并且完全不知道为什么我的代码不能正常工作。 / p>
server.js文件:
var http = require('http');
var url = require('url');
var fs = require('fs');
var io = require('socket.io');
var server = http.createServer(function (request, response) {
var path = url.parse(request.url).pathname;
switch(path) {
case '/' :
response.writeHead(200, { 'Content-Type' : 'text/html'});
response.write('hello world');
response.end();
break;
case '/socket.html' :
fs.readFile(__dirname + path, function (error, data) {
if(error) {
response.writeHead(404);
response.write("Oops, this doesn't exist - 404");
response.end();
} else {
response.writeHead(200, {'Content-Type' : 'text/html'});
response.write(data, 'utf8');
response.end();
}
});
break;
default :
response.writeHead(404);
response.write("Oops, this doesn't exist - 404");
response.end();
break;
}
});
server.listen(8080, '<private ip>');
console.log('Server running at http://<private ip>:8080/');
var listener = io.listen(server);
listener.sockets.on('connection', function (socket) {
setInterval(function () {
socket.emit('date', {'date' : new Date()});
});
});
(我必须根据DigitalOcean教程设置私有IP,因此Nginx可以使其工作)。
客户端的Javascript代码:
<script src="https://cdn.socket.io/socket.io-1.4.5.js"></script>
<script>
var baseURL = getBaseURL(); // Call function to determine it
var socketIOPort = 8080;
var socketIOLocation = baseURL + socketIOPort; // Build Socket.IO location
var socket = io(socketIOLocation);
//Build the user-specific path to the socket.io server, so it works both on 'localhost' and a 'real domain'
function getBaseURL()
{
baseURL = location.protocol + "//" + location.hostname + ":" + location.port;
return baseURL;
}
socket.on('date', function (data) {
$('#date').text(data.date.getHours() + ':' + data.date.getMinutes() + ':' + data.date.getSeconds());
})
</script>
如果我没记错的话,我还会设置一些选项,例如proxy_pass
和Upgrade $upgrade
,但我不记得我在哪里阅读/我应用了哪个文件,但据我所知,这些选项设置正确。
有人知道问题所在吗?因为我真的没有想法了。
提前致谢!
答案 0 :(得分:0)
托管公司通常有办法“管理”长期运营 连接以保护其资源。一种可能是你的 托管基础架构需要专门配置很长时间 运行webSocket连接所以nginx(或其他一些 网络设备)一段时间后不会自动杀死它 时间这不是所有托管的通用 - 它是 特定于您的特定VPS的配置 特别是托管公司,所以你必须得到任何指导 这个话题来自他们。
我改变了:
server.listen(8080, <private ip>);
为:
server.listen(443);
和
var socketIOPort = 8080;
为:
var socketIOPort = 443;
并且WebSockets立即工作,感谢jfriend00!