Javascript 为什么可以';运行node.js&;socket.io在屏幕中还是永久?
我有一些恼人的问题,那就是我在屏幕上运行nodejs时遇到了麻烦。因为当我离开屏幕并且没有连接插座时,下一个要连接的人将面临一条错误消息,直到屏幕再次打开。使用Javascript 为什么可以';运行node.js&;socket.io在屏幕中还是永久?,javascript,node.js,ubuntu,express,socket.io,Javascript,Node.js,Ubuntu,Express,Socket.io,我有一些恼人的问题,那就是我在屏幕上运行nodejs时遇到了麻烦。因为当我离开屏幕并且没有连接插座时,下一个要连接的人将面临一条错误消息,直到屏幕再次打开。使用屏幕-R节点打开屏幕后(例如),它将再次开始接受连接 但是请注意,如果屏幕关闭(在后台运行),并且有人已经打开了一个套接字,它将继续应答新的连接 当我再次尝试启动应用程序时,使用命令node-app会收到以下消息: module.js:340 throw err; ^ Error: Cannot find mo
屏幕-R节点打开屏幕后(例如),它将再次开始接受连接
但是请注意,如果屏幕关闭(在后台运行),并且有人已经打开了一个套接字,它将继续应答新的连接
当我再次尝试启动应用程序时,使用命令node-app
会收到以下消息:
module.js:340
throw err;
^
Error: Cannot find module '(unreachable)/square_defense/app'
at Function.Module._resolveFilename (module.js:338:15)
at Function.Module._load (module.js:280:25)
at Module.runMain (module.js:492:10)
at process.startup.processNextTick.process._tickCallback (node.js:244:9)
服务器端代码:
var app = require('express')()
, server = require('http').createServer(app)
, io = require('socket.io').listen(server);
server.listen(3000);
app.get('/', function (req, res) {
console.log(__dirname);
res.sendfile(__dirname + '/index.html');
});
io.sockets.on('connection', function (socket) {
socket.on('user-message', function (data) {
console.log(data);
sendMessage.call(socket, data.message);
});
});
var sendMessage = function(message) {
this.emit('server-message', {message: message});
this.broadcast.emit('server-message', {message: message});
}
我在app.js的目录中尝试了很多类似npm安装app
。
。我不明白为什么它不想工作。我真的只是想要一个服务器,我可以使用它进行测试,不会崩溃
编辑:我认为这与加密的主文件夹有关
我认为无法访问的文件夹就是问题所在。错误:找不到模块“(无法访问)/square\u defence/app”。但我不知道为什么会这样。现在我正在用Forever运行这个应用程序,只要我有一个ssh会话,它就会工作。但只要我退出连接并重新加载页面。它将生成一个错误。因为您已经在Ubuntu设备上,我建议使用和,如本文所述:
我唯一添加到混合中的是前端代理服务器(在我的例子中是HAProxy,但nginx也可以),以便在端口80上为我的应用程序提供服务
大约一个月前,我自己在Amazon EC2上部署了一个socket.io/express应用程序,使用该技术堆栈,结果令人惊讶
编辑:
下面是我收集的一些关于使用node.js/nginx/monit/git进行正确生产设置的资源:
- (一个很棒的导游,帮了我很多忙!)
我真的推荐第一个,您可能需要跳过一些部分(如npm模块安装或系统设置),但是关于nginx/git和supervisor的部分值得一读。正如您所说,您的主目录是加密的,并且根据:
此目录在登录时自动装入,在注销时自动卸载
所以你的猜测是正确的,这正是导致错误的原因。操作系统不会考虑运行分离的屏幕
会话,因为用户仍在登录*。当用户的所有shell会话结束时,加密的主目录被卸载
解决方案:您可以将应用程序移动到除$HOME
以外的目录,然后我认为GNU Screen或forever都可以完成这项工作,不会出现错误。†
*您可以自己测试:登录,启动屏幕
会话,运行类似于vim
的程序,分离;使用命令w
查看谁已登录以及他们正在做什么
†我认为,如果您为此编写自己的upstart脚本,应用程序文件不放在自动加密的主目录中仍然很重要。@Riwels是的,准确地说是ubuntu 12.04。嗯。。。我可能有这个问题:它是建议你永远使用。你现在知道了我不得不收回这句话,永远似乎会引起同样的问题,但有一个有趣的放纵。如果我通过ssh连接到我的服务器,它工作正常,没有问题。但是,一旦我关闭ssh会话并重新加载页面,我就会得到如下信息:Error:enoint,stat'/home/jarvis/square\u defence/index.html'
与之前相同,我只能猜测它内部存在与上面相同的错误。我想我得悬赏了。我很肯定我会在upstart和monit上犯同样的错误。我不认为需要代理服务器:)我不需要负载平衡器!upstart和monit的使用并不是专门用来解决您的问题,它是保持节点服务正常运行的一种非常好的方法。由于我从未使用过screen(在我看来总是很粗略),所以我不能给你们一个正确的意见。顺便说一句:在这种情况下,HAProxy不是负载平衡器,它只是应用服务器的前端服务器;)编辑:哦,我很确定这个设置会解决你的问题……现在我使用的是“永远”,如果应用程序停止运行,它会重新启动(上面说)。但是当我使用永久列表
时,我得到了信息:没有永久进程在运行
,即使有进程明显在运行。有趣的是,我可以重新启动它,它会工作一段时间。我不确定要多久。但最终它会崩溃。这可能是因为套接字超时而我不处理它们吗?我只在本地开发机器上使用了一个开放终端会话,我真的不能给你这个建议。我一开始在远程服务器上工作,就一直使用git钩子启动upstart/monit/nginx设置,以便在部署时重新启动服务……对不起:/Dude,谢谢。我要试试这个,在我测试了一点之后会回来的。那么明天如果一切顺利的话。您将得到您的奖励:)在我将文件移到主目录之外后,似乎仍在工作。谢谢你:)