在 CentOS 上实现 Node.js 应用的自动重启,可以使用多种方法。以下介绍几种常用的方法,包括使用 systemd
、Supervisor
和 pm2
。根据你的需求和环境选择最适合的方法。
systemd
是现代 Linux 发行版(包括 CentOS 7 及以上版本)的初始化系统和服务管理器,可以方便地管理 Node.js 应用的启动和自动重启。
创建 systemd 服务文件
假设你的 Node.js 应用入口文件是 /path/to/your/app.js
,并且应用监听端口是 3000
。
sudo vi /etc/systemd/system/your-app.service
在文件中添加以下内容:
[Unit]
Description=Node.js Application
After=network.target
[Service]
Type=simple
User=<your_user>
WorkingDirectory=/path/to/your/app
ExecStart=/usr/bin/node /path/to/your/app.js
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
说明:
Description
:服务描述。After
:指定服务启动顺序。User
:运行 Node.js 应用的用户。WorkingDirectory
:应用的工作目录。ExecStart
:启动命令。Restart
和 RestartSec
:配置自动重启策略。WantedBy
:指定目标运行级别。重新加载 systemd 配置
sudo systemctl daemon-reload
启动服务
sudo systemctl start your-app
设置开机自启
sudo systemctl enable your-app
查看服务状态
sudo systemctl status your-app
停止服务
sudo systemctl stop your-app
Supervisor 是一个流行的进程管理工具,可以监控和控制多个进程。
安装 Supervisor
sudo yum install epel-release
sudo yum install supervisor
配置 Supervisor
编辑 Supervisor 的配置文件,添加你的 Node.js 应用。
sudo vi /etc/supervisord.conf
在 [program:your-app]
部分添加:
[program:your-app]
command=/usr/bin/node /path/to/your/app.js
autostart=true
autorestart=true
stderr_logfile=/var/log/your-app.err.log
stdout_logfile=/var/log/your-app.out.log
user=<your_user>
environment=NODE_ENV="production",
重新加载 Supervisor 配置
sudo supervisorctl reread
sudo supervisorctl update
启动应用
sudo supervisorctl start your-app
查看应用状态
sudo supervisorctl status your-app
PM2 是一个功能强大的 Node.js 进程管理器,支持自动重启、负载均衡、日志管理等功能。
安装 PM2
使用 npm
安装 PM2:
sudo npm install pm2 -g
或者使用 yarn
:
sudo yarn global add pm2
启动应用并配置自动重启
pm2 start /path/to/your/app.js --name "your-app"
配置自动重启:
pm2 startup
PM2 会生成启动脚本,根据提示执行相应的命令(例如 systemctl
)。
保存当前进程列表
pm2 save
查看应用状态
pm2 status
停止应用
pm2 stop your-app
重启应用
pm2 restart your-app
虽然不如前述方法优雅,但也可以使用 cron
定时任务来检查 Node.js 应用是否运行,并在异常时重启。
创建检查脚本
创建一个脚本 /usr/local/bin/check_node_app.sh
:
#!/bin/bash
APP_PATH=/path/to/your/app.js
APP_USER=<your_user>
PID_FILE=/var/run/your-app.pid
if [ -f $PID_FILE ]; then
PID=$(cat $PID_FILE)
if ps -p $PID > /dev/null; then
echo "Node.js app is running with PID $PID."
else
echo "Node.js app is not running. Restarting..."
sudo -u $APP_USER /usr/bin/node $APP_PATH &
echo $! > $PID_FILE
fi
else
echo "PID file not found. Starting Node.js app..."
sudo -u $APP_USER /usr/bin/node $APP_PATH &
echo $! > $PID_FILE
fi
赋予执行权限:
sudo chmod +x /usr/local/bin/check_node_app.sh
编辑 crontab
打开当前用户的 crontab:
crontab -e
添加以下行,每分钟检查一次:
* * * * * /usr/local/bin/check_node_app.sh >> /var/log/check_node_app.log 2>&1
保存并退出。
以上方法各有优缺点:
根据你的具体需求和环境选择最合适的方法来实现 Node.js 应用的自动重启。