1. 项目背景与核心需求
OpenClaw作为一款开源的AI自动化代理引擎,在本地化部署场景中越来越受到开发者关注。最近在腾讯云服务器上部署OpenClaw时,遇到了两个典型问题:服务进程意外卡死和端口占用冲突。经过多次实践验证,采用PM2进行进程守护是最可靠的解决方案。
这个方案特别适合需要长期稳定运行的AI服务场景。相比直接通过npm启动,PM2提供了完整的进程监控、日志管理和自动恢复功能。下面我将详细记录整个部署和优化过程,包括可能遇到的坑和对应的解决方法。
2. 环境准备与基础部署
2.1 腾讯云服务器配置
建议选择至少2核4G配置的云服务器,操作系统推荐Ubuntu 20.04 LTS。这个配置可以流畅运行OpenClaw的基础功能,如果需要进行复杂AI任务处理,建议升级到4核8G。
关键配置步骤:
- 在腾讯云控制台创建CVM实例
- 配置安全组规则,开放所需端口(默认为3000)
- 通过SSH连接到服务器
注意:如果使用非root用户,需要确保该用户具有sudo权限。建议新建专用部署用户,避免直接使用root账户。
2.2 OpenClaw安装与初始化
首先安装必要的依赖环境:
bash复制sudo apt update
sudo apt install -y git nodejs npm python3-pip
然后克隆OpenClaw仓库并安装:
bash复制git clone https://github.com/openclaw/openclaw.git
cd openclaw
npm install
安装完成后,可以先测试直接运行:
bash复制npm start
这时应该能看到服务正常启动,监听在3000端口(默认配置)。按Ctrl+C停止服务,我们接下来配置PM2守护。
3. PM2进程守护配置
3.1 PM2安装与基础使用
全局安装PM2:
bash复制sudo npm install -g pm2
使用PM2启动OpenClaw:
bash复制pm2 start npm --name "openclaw" -- start
这个命令做了几件事:
- 创建一个名为"openclaw"的PM2进程
- 执行
npm start命令 - 自动在后台运行并守护进程
验证服务状态:
bash复制pm2 list
应该能看到类似这样的输出:
code复制┌─────┬───────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id │ name │ namespace │ version │ mode │ pid │ uptime │ ↺ │ status │ cpu │ mem │ user │ watching │
├─────┼───────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0 │ openclaw │ default │ N/A │ fork │ 12345 │ 2m │ 0 │ online │ 0% │ 45.2mb │ ubuntu │ disabled │
└─────┴───────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
3.2 高级PM2配置
创建专门的PM2配置文件能提供更精细的控制。在项目根目录创建ecosystem.config.js:
javascript复制module.exports = {
apps: [{
name: "openclaw",
script: "npm",
args: "start",
instances: 1,
autorestart: true,
watch: false,
max_memory_restart: "1G",
env: {
NODE_ENV: "production",
PORT: 3000
},
error_file: "./logs/error.log",
out_file: "./logs/out.log",
log_date_format: "YYYY-MM-DD HH:mm:ss"
}]
}
然后使用配置文件启动:
bash复制pm2 start ecosystem.config.js
这个配置实现了:
- 内存超过1G自动重启
- 分离错误日志和标准输出日志
- 固定运行环境为production
- 明确指定服务端口
4. 解决端口占用问题
4.1 检测端口占用情况
当遇到端口冲突时,首先确认端口占用情况:
bash复制sudo lsof -i :3000
或者使用netstat:
bash复制sudo netstat -tulnp | grep 3000
4.2 解决方案
如果发现端口被占用,有几种处理方式:
- 终止占用进程:
bash复制sudo kill -9 <PID>
- 修改OpenClaw配置使用其他端口:
在项目配置文件或环境变量中修改PORT值,例如改为3001:
bash复制export PORT=3001
pm2 restart openclaw
- 配置PM2自动处理端口冲突:
在ecosystem.config.js中添加:
javascript复制port_retries: 10, // 尝试10次
wait_ready: true, // 等待端口释放
listen_timeout: 5000 // 超时5秒
5. 系统服务集成与开机自启
5.1 保存PM2进程列表
为了让PM2管理的服务在服务器重启后自动恢复,需要执行:
bash复制pm2 save
pm2 startup
pm2 startup会生成一个系统服务配置,根据提示完成安装即可。
5.2 验证自启功能
可以手动重启服务器测试:
bash复制sudo reboot
重启后登录服务器,检查PM2进程是否自动恢复:
bash复制pm2 list
6. 监控与日志管理
6.1 实时监控
PM2提供了多种监控方式:
bash复制pm2 monit # 实时监控面板
pm2 logs # 查看实时日志
pm2 flush # 清空日志
6.2 日志轮转
配置日志轮转防止日志文件过大:
bash复制pm2 install pm2-logrotate
pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 30
pm2 set pm2-logrotate:compress true
这个配置会:
- 当日志超过10MB时轮转
- 保留最近30个日志文件
- 自动压缩旧日志
7. 常见问题与解决方案
7.1 进程卡死问题
症状:服务无响应,但进程仍在运行
解决方案:
- 配置PM2自动重启:
javascript复制// ecosystem.config.js
kill_timeout: 3000, // 3秒超时
restart_delay: 5000 // 5秒后重启
- 增加健康检查接口:
在OpenClaw中添加一个/health接口,然后配置PM2检查:
javascript复制healthcheck: {
url: "http://localhost:3000/health",
interval: 30000, // 30秒检查一次
timeout: 5000 // 5秒超时
}
7.2 内存泄漏处理
当发现内存持续增长时:
- 设置内存限制:
javascript复制max_memory_restart: "800M" // 内存超过800MB重启
- 生成内存快照分析:
bash复制pm2 trigger openclaw heapdump
7.3 多实例负载均衡
如果需要提高并发能力,可以启动多个实例:
bash复制pm2 scale openclaw 2
然后在Nginx中配置负载均衡:
nginx复制upstream openclaw {
server 127.0.0.1:3000;
server 127.0.0.1:3001;
}
server {
listen 80;
server_name yourdomain.com;
location / {
proxy_pass http://openclaw;
}
}
8. 性能优化建议
- 启用集群模式(适合多核CPU):
javascript复制instances: "max", // 根据CPU核心数自动启动实例
exec_mode: "cluster" // 集群模式
- 调整Node.js参数:
javascript复制node_args: [
"--max-old-space-size=1024", // 1GB内存限制
"--optimize-for-size",
"--gc-interval=1000"
]
- 定期重启:
javascript复制cron_restart: "0 3 * * *" // 每天凌晨3点重启
在实际使用中,我发现结合PM2的进程守护和合理的配置,OpenClaw可以稳定运行数周甚至数月。最关键的是配置好内存限制和自动重启策略,这样即使遇到内存泄漏等问题,服务也能自动恢复。日志管理也很重要,建议至少保留一周的日志以便排查问题。
