Nodejs发布到linux服务器的几个问题

Nodejs发布到linux服务器的几个问题

初学node,遇到这么几个问题:

  • 我是用ssh启动:node app,那么当我把ssh窗口关闭node也就停止运行了,我看到论坛里有说·nohup node app &·能启动,可是不知如何停用。
  • 当网站已经在服务器端运行,那么这个时候要更新文件,只有重启服务才会生效,这个如何解决?
  • 当网站在运行的时候如果出现错误,这个时候网站不就整个都挂了,能否忽略错误?

大神们,求解答~~

9 回复

Node.js 发布到 Linux 服务器的几个问题

作为一个初学者,在将 Node.js 应用程序部署到 Linux 服务器时,可能会遇到一些常见的问题。这里我将详细解释并提供解决方案。

1. 如何在后台运行 Node.js 应用程序

当你使用 ssh 启动 Node.js 应用程序时(例如 node app),一旦关闭 SSH 会话,应用程序也会停止运行。为了解决这个问题,你可以使用 nohup 命令,它可以让进程在关闭终端后继续运行。

示例代码:

nohup node app.js &

这行命令会将 app.js 在后台运行,并且输出会被重定向到 nohup.out 文件中。如果你想停止这个进程,可以先找到它的进程 ID(PID):

ps aux | grep "node app.js"

找到 PID 后,可以使用 kill 命令来终止进程:

kill <PID>

2. 更新文件时自动重启服务

当你更新应用代码时,通常需要手动重启 Node.js 应用程序才能使更改生效。为了简化这一过程,可以使用 pm2 这样的工具,它可以自动检测文件变化并重启应用。

安装 pm2:

npm install -g pm2

启动应用:

pm2 start app.js

自动重启功能:

pm2 watch app.js

这样,每当文件发生变化时,pm2 会自动重启应用。

3. 忽略错误以保持服务运行

在生产环境中,错误不应该导致整个应用崩溃。你可以通过使用 try-catch 块或日志记录工具来捕获异常,确保应用能够继续运行。

示例代码:

process.on('uncaughtException', (err) => {
    console.error(`Caught exception: ${err}`);
});

// 或者在特定函数中捕获异常
try {
    // 你的代码
} catch (error) {
    console.error(`Error caught: ${error}`);
}

此外,你还可以使用 foreverpm2 来自动重启应用,即使发生错误。

使用 forever:

npm install -g forever
forever start app.js

这些方法可以帮助你在生产环境中更可靠地运行 Node.js 应用程序。希望这些解决方案对你有所帮助!


1、不管什么方式后台启动之后要关闭的话都可以通过kill掉进程来停止。 2、除非更新静态资源文件,否则必须重启。 3、通过下面的进程捕获错误可以避免挂掉进程: pocess.on(‘uncaughtException’, function (err) { //进程捕获异常 logger.error('Caught exception: ’ + err); });

http://cnodejs.org/?q=forever 先看一下 forever 的用法.

找到你的进程,杀掉就行了

ps -ef | grep node

我在 Ubuntu 上用 upstart 管理 node 程序。

第一个问题是由于logout时会给所有sshd的子进程发送HUP信号,你的方法就是让程序无视HUP信号。
相关的方法还有很多,比如setsid建立新会话,disown使作业忽略HUP信号,最强大的是screen,直接提供模拟器来运行多个伪终端,由于screen是init的进程,HUP信号影响不到。

  1. 当网站已经在服务器端运行,那么这个时候要更新文件,只有重启服务才会生效,这个如何解决?

如果你的用户访问很大不想宕机。 简单的方案是,前端用dns或者nginx做代理,2个node节点或者多个节点(几万PV),轮流重启。

复杂一些的方案,可以参考php的应用架构(百万级),或者JavaEE的应用架构(千万级)。

ps -ef | grep node

找到相关的node主进程pid(如果未通过cluster启动则直接用那唯一的pid),并kill pid

ps -aux 看下你的NODE的进程号 kill 进程号

针对你在Linux服务器上部署Node.js应用时遇到的问题,这里提供一些解决方案:

  1. 保持进程后台运行 使用nohup命令可以让进程在SSH会话关闭后继续运行。如果你想停止这个进程,可以通过查看当前运行的nohup进程来找到对应的PID,然后使用kill命令终止它。

    示例:

    # 启动应用
    nohup node app.js &
    
    # 查找进程ID(PID)
    ps aux | grep 'node app.js'
    
    # 终止进程
    kill -9 <PID>
    
  2. 热更新(Hot Reload) 可以使用一些工具来实现热更新,例如PM2nodemon。这些工具可以在文件发生变化时自动重启你的应用。

    使用PM2的示例:

    # 安装PM2
    npm install pm2 -g
    
    # 使用PM2启动应用
    pm2 start app.js --name myapp
    
    # 监控应用状态
    pm2 monit
    
  3. 错误处理 在Node.js中,你可以通过添加错误处理机制来避免整个应用因为一个错误而崩溃。可以使用try-catch块捕获同步代码中的异常,对于异步代码,可以使用.catch()方法。

    示例:

    // 捕获同步错误
    try {
      // 可能出错的代码
    } catch (error) {
      console.error('同步代码出错:', error);
    }
    
    // 异步错误处理
    someAsyncFunction()
      .then(result => {
        // 成功逻辑
      })
      .catch(error => {
        console.error('异步操作出错:', error);
      });
    

以上是针对你提出问题的一些解决方案。希望对你有所帮助!

回到顶部