为什么我不能运行node.js& socket.io在屏幕上或与Forever?

时间:2013-01-14 12:09:28

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

我遇到了一些恼人的问题,就是我在屏幕上运行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就可以了。但是一旦我退出连接并重新加载页面。它会产生错误。

2 个答案:

答案 0 :(得分:3)

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

  

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

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


解决方案:您可以将应用程序移动到$HOME以外的目录,然后我认为 GNU Screen forever 将无错误地完成工作。 †


*您可以通过自己进行测试:登录,开始screen会话,运行类似vim的内容,分离;使用命令w查看谁登录以及他们正在做什么

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

答案 1 :(得分:0)

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

我在混音中添加的唯一内容是前端代理服务器(在我的情况下是HAProxy,但nginx也能正常工作),以便在端口80上为我的应用程序提供服务。

我在大约一个月前在Amazon EC2上使用这个技术堆栈部署了一个socket.io/express app,结果令人惊叹!

修改

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

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