【问题标题】:Why can't I run node.js & socket.io in a screen or with Forever?为什么我不能在屏幕或 Forever 中运行 node.js 和 socket.io?
【发布时间】:2013-01-14 12:09:28
【问题描述】:

我遇到了一些烦人的问题,那就是我在屏幕上运行 nodejs 时遇到了麻烦。因为只要我离开屏幕并且没有连接任何套接字,下一个要连接的人将面临错误消息,直到再次打开屏幕。只要使用screen -R node(例如)打开屏幕,它就会再次开始接受连接。

但是请注意,如果屏幕关闭(在后台运行)并且有人已经打开了一个套接字,它将继续响应新的连接。

当我尝试再次启动应用程序时,使用命令 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 install app。无法理解为什么它不想工作。我真的只是想要一个服务器,我可以将其用于不会崩溃的测试目的。

编辑:我认为这与加密的主文件夹有关?

我认为无法访问的文件夹是问题所在。错误:找不到模块“(无法访问)/square_defense/app”。但我不知道为什么会这样。现在,我正在使用 Forever 运行该应用程序,并且只要我有一个 ssh-session 就可以工作。但是一旦我退出连接并重新加载页面。它会产生错误。

【问题讨论】:

  • @Riwels 是的,确切地说是 ubuntu 12.04。
  • 建议你永远使用。你现在知道了。 =)
  • 我将不得不收回这一点,似乎永远会导致同样的问题,但有一个有趣的问题。如果我通过 ssh 连接到我的服务器,它工作正常,没有问题。但是一旦我关闭我的 ssh-session 并重新加载页面,我就会得到这个:Error: ENOENT, stat '/home/jarvis/square_defense/index.html' 和以前一样,我只能猜测它在内部有与上面相同的错误。我想我必须赏金。

标签: javascript node.js ubuntu express socket.io


【解决方案1】:

正如你所说,你的主目录是加密的,并且根据the document from Ubuntu

此目录在登录时自动挂载,并在注销时卸载。

所以你的猜测是正确的,这正是导致错误的原因。操作系统不会考虑运行分离的screen 会话,因为用户仍处于登录状态*。用户的所有shell会话结束时,加密的主目录被卸载。


解决方案:您可以将您的应用程序移至 $HOME 以外的目录,然后我认为 GNU Screenforever 都可以正常工作。†


* 你可以自己测试一下:登录,启动screen 会话,运行vim 之类的东西,分离;使用命令w 来查看谁登录以及他们在做什么

†​​我认为,如果您为此编写自己的新贵脚本,那么应用程序文件不放置在自动加密的主目录中仍然至关重要。

【讨论】:

  • 老兄,谢谢。我要试试这个,在我测试了一下之后会回来。然后明天,如果一切看起来都很好。你会得到你的奖励:)
  • 在我将文件移到主目录之外后似乎仍在工作。谢谢你:)
【解决方案2】:

由于您已经使用 Ubuntu,我建议您使用 Upstartmonit,如本文所述:http://howtonode.org/deploying-node-upstart-monit

我唯一添加到组合中的是前端代理服务器(在我的情况下是 HAProxy,但 nginx 也可以),以便在端口 80 上为我的应用程序提供服务。

大约一个月前,我自己在 Amazon EC2 上使用此技术堆栈部署了一个 socket.io/express 应用程序,效果惊人!

编辑:

以下是我收集的一些关于使用 node.js/nginx/monit/git 进行正确生产设置的资源:

我真的推荐第一个,你可能需要跳过一些部分(比如 npm 模块安装或系统设置),但是关于 nginx/git 和 supervisor 的部分值得一读。

【讨论】:

  • 好吧,我很确定我会在使用 upstart 和 monit 时遇到同样的错误。我认为不需要代理服务器 :) 我不需要负载平衡器!
  • 使用 upstart 和 monit 并不是专门解决您的问题,而是保持节点服务正常运行的好方法。因为我从来没有使用过屏幕(对我来说总是很粗略),所以我不能给你一个正确的意见。顺便说一句:HAProxy 在这种情况下不是负载平衡器,它只是您的应用程序服务器的前端服务器;)编辑:哦,我很确定这个设置会解决您的问题...
  • 好吧,现在我永远使用它,如果应用程序出现故障(它说),它将重新启动应用程序。但是当我使用forever list 时,即使有进程明显在运行,我也会得到info: No forever processes running
  • 有趣的是我可以重新启动它,它会工作一段时间。我不确定要多久。但最终它会崩溃。这会因为套接字超时而我不处理它们而发生吗?
  • 我只在我的本地开发机器上永久使用了一个开放的终端会话,我真的不能给你关于这个的建议。一旦我在远程服务器上工作,我总是使用 git-hooks 启动 upstart/monit/nginx 设置以重新启动部署服务......对不起:/
猜你喜欢
  • 2017-09-27
  • 2017-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多