Linux环境下使用PM2和脚本自动部署博客完整教程
本教程将教你如何在Linux服务器上使用PM2进程管理工具和自动化脚本,实现博客项目的一键部署和后台运行。
🎯 教程目标
- 掌握PM2进程管理工具的使用
- 学会编写自动化部署脚本
- 实现博客项目的一键部署和重启
- 配置开机自启动和健康检查
📋 前置条件
- Linux服务器(Ubuntu/CentOS等)
- Node.js环境已安装
- Git仓库已配置
- 具备基本的Shell脚本知识
第一部分:PM2进程管理器配置
1. 安装PM2
1 2 3 4 5
| npm install pm2 -g
pm2 --version
|
2. PM2基本使用
启动应用
1 2 3 4 5
| pm2 start app.js --name "blog"
pm2 start npm --name "blog" -- run start
|
查看应用状态
你会看到类似输出:
1 2 3 4 5
| ┌─────┬──────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┐ │ id │ name │ namespace │ version │ mode │ pid │ uptime │ ↺ │ status │ cpu │ mem │ user │ ├─────┼──────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┤ │ 0 │ blog │ default │ N/A │ fork │ 12345 │ 2d │ 0 │ online │ 0% │ 30.5mb │ root │ └─────┴──────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┘
|
其他常用命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| pm2 stop blog
pm2 restart blog
pm2 delete blog
pm2 logs blog
pm2 monit
|
3. 配置开机自启动
第二部分:创建自动化部署脚本
1. 创建部署脚本
创建 deploy.sh 文件:
2. 脚本内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
| #!/bin/bash
SERVICE_NAME=${1:-"blog"} BRANCH=${2:-"main"} LOG_FILE="deploy.log"
RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m'
log() { echo -e "${BLUE}[$(date '+%Y-%m-%d %H:%M:%S')]${NC} $1" | tee -a $LOG_FILE }
success() { echo -e "${GREEN}[SUCCESS]${NC} $1" | tee -a $LOG_FILE }
error() { echo -e "${RED}[ERROR]${NC} $1" | tee -a $LOG_FILE }
warning() { echo -e "${YELLOW}[WARNING]${NC} $1" | tee -a $LOG_FILE }
handle_error() { error "部署失败,退出码: $1" error "请检查日志文件: $LOG_FILE" exit $1 }
set -e trap 'handle_error $?' ERR
log "开始自动化部署..." log "服务名: $SERVICE_NAME" log "分支: $BRANCH"
log "检查 Git 仓库状态..." if [ ! -d ".git" ]; then error "当前目录不是 Git 仓库" exit 1 fi
if ! git diff --quiet; then warning "检测到本地修改,正在暂存..." git stash push -m "Auto stash before deploy $(date)" fi
log "拉取最新代码 (分支: $BRANCH)..." git fetch origin git checkout $BRANCH git pull origin $BRANCH
success "代码拉取完成"
log "安装 npm 依赖..." if [ -f "package-lock.json" ]; then npm ci else npm install fi
success "依赖安装完成"
if [ -f "package.json" ] && grep -q "\"build\":" package.json; then log "运行构建脚本..." npm run build success "构建完成" fi
log "检查 PM2 服务状态..." if pm2 list | grep -q "$SERVICE_NAME"; then log "重启 PM2 服务: $SERVICE_NAME" pm2 restart $SERVICE_NAME else warning "服务 $SERVICE_NAME 不存在,尝试启动..." if [ -f "ecosystem.config.js" ]; then pm2 start ecosystem.config.js else pm2 start app.js --name $SERVICE_NAME fi fi
success "服务重启完成"
log "等待服务启动..." sleep 3
if pm2 list | grep -q "$SERVICE_NAME.*online"; then success "服务运行正常" else error "服务启动失败" pm2 logs $SERVICE_NAME --lines 10 exit 1 fi
log "清理部署日志..." if [ -f "$LOG_FILE" ]; then tail -n 1000 $LOG_FILE > ${LOG_FILE}.tmp && mv ${LOG_FILE}.tmp $LOG_FILE fi
success "🎉 部署成功完成!" log "服务状态:" pm2 list | grep $SERVICE_NAME
log "最近的应用日志:" pm2 logs $SERVICE_NAME --lines 5 --nostream
|
3. 设置脚本权限
第三部分:高级配置
1. PM2生态系统配置
创建 ecosystem.config.js 文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| module.exports = { apps: [{ name: 'blog', script: './app.js', instances: 'max', exec_mode: 'cluster', env: { NODE_ENV: 'production', PORT: 3000 }, env_production: { NODE_ENV: 'production', PORT: 3000 } }] }
|
2. 部署配置文件
创建 deploy.config 文件:
1 2 3 4 5
| SERVICE_NAME="blog" BRANCH="main" BUILD_COMMAND="npm run build" HEALTH_CHECK_URL="http://localhost:3000/health"
|
第四部分:使用方法
1. 基本部署
1 2 3 4 5 6 7 8
| ./deploy.sh
./deploy.sh my-api
./deploy.sh my-api develop
|
参数说明:
- 第一个参数:服务名称(默认为
blog)
- 第二个参数:Git分支名(默认为
main)
2. 首次部署
1 2 3 4 5 6 7 8 9 10 11 12 13
| git clone https://github.com/your-username/your-blog.git cd your-blog
vim deploy.sh
chmod +x deploy.sh
./deploy.sh
|
3. 日常更新
4. 多项目部署示例
如果你有多个项目需要部署:
1 2 3 4 5 6 7 8
| ./deploy.sh blog main
./deploy.sh api-server develop
./deploy.sh frontend release
|
第五部分:监控和维护
1. 查看服务状态
1 2 3 4 5 6 7 8
| pm2 list
pm2 show blog
pm2 monit
|
2. 日志管理
1 2 3 4 5 6 7 8
| pm2 logs blog
pm2 logs blog --err
pm2 flush
|
3. 性能监控
1 2 3 4 5 6 7 8
| pm2 monit
pm2 restart all
pm2 reload ecosystem.config.js
|
🔧 故障排查
常见问题
服务启动失败
1
| pm2 logs blog --lines 50
|
端口被占用
1 2
| netstat -tlnp | grep :3000 kill -9 <PID>
|
权限问题
1
| sudo chown -R $USER:$USER /path/to/project
|
📈 优化建议
- 使用集群模式:提高性能和可用性
- 配置日志轮转:避免日志文件过大
- 设置监控告警:及时发现问题
- 定期备份:保护重要数据
总结
通过本教程,你已经学会了:
- ✅ PM2进程管理工具的安装和使用
- ✅ 编写自动化部署脚本
- ✅ 配置服务的自动重启和健康检查
- ✅ 设置开机自启动
- ✅ 监控和维护服务
现在你可以通过一条简单的命令 ./deploy.sh 就能完成博客的自动部署,大大提高了开发效率!
提示:建议在生产环境中使用前,先在测试环境中验证脚本的可靠性。如果你有任何问题,欢迎在评论区讨论交流!