OpenClaw 1核4G 服务器完整优化记录(脱敏版)
日期:2026-06-25
服务器环境:1 核 CPU / 4GB RAM,Ubuntu + 宝塔面板
目标:在保证安全与功能的前提下,将资源占用降至最低,消除所有配置与运行警告,建立长期维护标准。
一、OpenClaw 配置层优化
1.1 删除幽灵技能 mimo-v2-5-tts
问题:物理技能文件已删除,但主配置文件 openclaw.json 的 skills.entries 中仍存在该条目,导致每次启动时产生警告日志。
操作步骤:
- 停止服务:
sudo systemctl stop openclaw-gateway
- 备份配置文件(带时间戳):
cp /home//.openclaw/openclaw.json /home//.openclaw/openclaw.json.bak.$(date +%Y%m%d-%H%M%S)
- 使用 Python 精准删除
mimo-v2-5-tts键(该键位于skills.entries内):
python3 -c "
import json
with open('/home//.openclaw/openclaw.json','r') as f:
c = json.load(f)
c.get('skills',{}).get('entries',{}).pop('mimo-v2-5-tts', None)
with open('/home//.openclaw/openclaw.json','w') as f:
json.dump(c, f, indent=2, ensure_ascii=False)
"
- 重启服务:
sudo systemctl start openclaw-gateway
- 验证:
sudo journalctl -u openclaw-gateway -n 50 --no-pager | grep -i mimo应无输出。
1.2 移除 workspace 中的无效文件
问题:/home//.openclaw/workspace/openclaw-setup-article.md (7.5KB) 可能被作为上下文注入,浪费 token。
操作:
mkdir -p /home//doc
mv /home//.openclaw/workspace/openclaw-setup-article.md /home//doc/
验证:ls ~/.openclaw/workspace/ 应不再包含该文件。
1.3 清理残留的禁用插件配置条目
问题:日志持续提示 plugins.entries.memory-core, feishu, wecom-openclaw-plugin 已禁用但配置仍存在。
操作(类似幽灵技能处理):
- 停服、备份(同上)。
- 执行 Python 脚本删除这三个键:
python3 -c "
import json
with open('/home//.openclaw/openclaw.json') as f:
c = json.load(f)
entries = c.get('plugins',{}).get('entries',{})
for k in ('memory-core','feishu','wecom-openclaw-plugin'):
if k in entries: del entries[k]
with open('/home//.openclaw/openclaw.json','w') as f:
json.dump(c, f, indent=2, ensure_ascii=False)
"
- 重启服务。
- 验证:
sudo journalctl -u openclaw-gateway -n 30 --no-pager | grep "config is present"应返回空。
1.4 添加长会话自动压缩(Compaction)
原因:当前短对话下 token 占用仅 9%,但为防御未来超长会话导致 token 膨胀、内存飙升,添加此防御性配置。
操作(确保配置位于 agents.defaults.compaction,非顶层):
- 停服、备份。
- 写入配置(使用
setdefault链式创建路径):
python3 -c "
import json
with open('/home//.openclaw/openclaw.json') as f:
c = json.load(f)
c.setdefault('agents',{}).setdefault('defaults',{})['compaction'] = {
'truncateAfterCompaction': True,
'maxHistoryShare': 0.5
}
with open('/home//.openclaw/openclaw.json','w') as f:
json.dump(c, f, indent=2, ensure_ascii=False)
"
- 重启服务。
参数解释:
truncateAfterCompaction: true压缩后裁剪冗余历史,彻底阻止膨胀。maxHistoryShare: 0.5确保压缩后的历史占用不超过上下文窗口的 50%,为当前回复留足空间。
二、安全加固
2.1 密钥从 systemd 明文迁移至加密凭据
问题:OPENCLAW_GATEWAY_PASSWORD 和 MIMO_API_KEY 原以明文形式写在服务文件 /etc/systemd/system/openclaw-gateway.service 中,任何有权限读取该文件的人或进程都可获取。
解决方案:使用 systemd 的 LoadCredential 机制,将密钥以文件形式安全注入,服务文件本身不再包含明文。
操作:
- 创建安全存储目录并写入密钥文件:
sudo mkdir -p /etc/openclaw/secrets
sudo chmod 700 /etc/openclaw/secrets
echo "" | sudo tee /etc/openclaw/secrets/gateway-password > /dev/null
echo "" | sudo tee /etc/openclaw/secrets/mimo-api-key > /dev/null
sudo chmod 600 /etc/openclaw/secrets/*
sudo chown root: /etc/openclaw/secrets/mimo-api-key # 若需要特定用户读取
- 修改服务文件:
- 删除所有原有的
Environment=OPENCLAW_GATEWAY_PASSWORD=...和Environment=MIMO_API_KEY=...行。 - 在
[Service]段中添加:LoadCredential=gateway-password:/etc/openclaw/secrets/gateway-password LoadCredential=mimo-api-key:/etc/openclaw/secrets/mimo-api-key Environment=OPENCLAW_GATEWAY_PASSWORD=%d/gateway-password Environment=MIMO_API_KEY=%d/mimo-api-key %d在 systemd 中会被自动展开为凭据目录,进程内通过环境变量获取文件内容。
- 重载并重启:
sudo systemctl daemon-reload
sudo systemctl restart openclaw-gateway
- 验证:
sudo systemctl show openclaw-gateway | grep Environment显示%d/...占位符,无真实密钥。
注意:Gateway 密码和 API Key 分别存入独立文件,权限设置为 600,目录 700,仅 root 及特定用户可访问。
2.2 清除 Shell 环境变量中的密钥残留
原因:早期配置可能将密钥导出到了 ~/.bashrc,导致普通用户会话中仍存在明文。
操作:
sed -i '/OPENCLAW_GATEWAY_PASSWORD/d; /MIMO_API_KEY/d' ~/.bashrc
# 同时检查 .profile, .zshrc 等其他配置文件
grep -rn 'OPENCLAW_GATEWAY_PASSWORD\|MIMO_API_KEY' ~/.[^.]* 2>/dev/null
若有输出,对应删除。
2.3 修复 TTS 服务的密钥注入(mimo-tts-proxy 确认真实存在)
背景:独立的 mimo-tts-proxy 服务(由 /home//.openclaw/plugin-skills/mimo-tts/proxy.py 启动)原本依赖 shell 环境中的 MIMO_API_KEY。进行 2.1 迁移后该变量消失,导致 TTS 返回 401 认证失败。
处理过程:
- 确认服务存在:
systemctl cat mimo-tts-proxy.service输出ExecStart=/usr/bin/python3 .../proxy.py。 - 脚本直接从文件读取密钥(不做 KEY=VALUE 解析),因此密钥文件只能包含纯密钥值,不能有前缀。
- 修正密钥文件内容(移除误添加的
MIMO_API_KEY=前缀):
echo "" | sudo tee /etc/openclaw/secrets/mimo-api-key > /dev/null
- 创建 systemd drop-in 配置注入环境变量:
sudo mkdir -p /etc/systemd/system/mimo-tts-proxy.service.d
sudo tee /etc/systemd/system/mimo-tts-proxy.service.d/override.conf <<'EOF'
[Service]
EnvironmentFile=/etc/openclaw/secrets/mimo-api-key
EOF
(EnvironmentFile 读取文件内容并设置为同名环境变量,因文件只有纯值,故需确认脚本从环境变量读取;实际上脚本读取环境变量 MIMO_API_KEY,该 drop-in 使得环境变量获得文件内容。)
- 重载并重启:
sudo systemctl daemon-reload
sudo systemctl restart mimo-tts-proxy
- 功能测试(通过 OpenClaw 使用的本地 TTS 端点):
curl -s http://127.0.0.1:3456/v1/audio/speech \
-H "Content-Type: application/json" \
-d '{"model":"tts-1","input":"测试","voice":"alloy"}' \
--output /tmp/test.mp3 && ls -lh /tmp/test.mp3
生成文件成功,日志中无 401 错误。
2.4 收紧防火墙规则
现状:UFW 已开启,fail2ban 正在工作。但存在不必要的开放端口,增加攻击面。
操作:
- 移除无服务监听的端口 3000:
sudo ufw delete allow 3000/tcp
- 移除未使用的 FTP 被动端口范围 39000-40000:
sudo ufw delete allow 39000:40000/tcp
- 重载防火墙:
sudo ufw reload
当前开放端口(均为必需):
- 80/tcp, 443/tcp (Nginx Web 服务)
- xx/tcp (SSH,已修改默认端口)
后续建议:若公网 IP 固定,可将 SSH 和宝塔面板限制为仅允许特定 IP 访问,进一步减少暴力破解风险。
三、系统资源与性能优化
3.1 精简 PHP-FPM 版本与进程数
分析:检查 Nginx 配置发现所有网站均使用 enable-php-84.conf,但系统同时运行了 PHP 7.4、8.2、8.4 三个版本。每个版本的 www.conf 中 pm.max_children 默认为 50,产生了大量空闲进程,严重浪费内存。
操作:
- 停止并禁用不使用的版本:
sudo systemctl stop php-fpm-74 php-fpm-82
sudo systemctl disable php-fpm-74 php-fpm-82
- 调整 PHP 8.4 的进程池配置(实际路径为
/www/server/php/84/etc/php-fpm.conf的[www]段):
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
(修改前先备份原文件)
- 重启 PHP 8.4:
sudo systemctl restart php-fpm-84
- 验证:
ps aux | grep php-fpm | wc -l进程数从 15+ 降至 2–3。
效果:释放约 300–500 MB 内存。
3.2 限制 Node.js 内存使用(仅 ExecStart 参数,无冗余环境变量)
原因:避免 V8 引擎堆内存过度膨胀,在物理内存紧张时触发 OOM Killer。
操作:
- 修改 Gateway 服务文件,在
ExecStart中添加--max-old-space-size=768(单位 MB):
sudo sed -i 's|ExecStart=/usr/bin/node /usr/lib|ExecStart=/usr/bin/node --max-old-space-size=768 /usr/lib|' /etc/systemd/system/openclaw-gateway.service
注意:此参数已足够限制 V8 堆大小,无需额外添加 Environment=NODE_OPTIONS,避免重复设置。
- 重载并重启:
sudo systemctl daemon-reload
sudo systemctl restart openclaw-gateway
- 验证:
ps aux | grep openclaw的命令行中应包含--max-old-space-size=768。
3.3 关闭 Swap
背景:优化后系统已用内存稳定在 1.2GB 左右,总内存 4GB 充裕。Swap 开启会导致内核不时将不活跃内存页换出到磁盘,引起无谓 I/O 延迟。
操作:
sudo swapoff -a
sudo sed -i '/swap/s/^/#/' /etc/fstab # 注释掉 swap 行,防止重启后自动挂载
sudo rm -f /swapfile # 若存在
free -h # 确认 Swap 显示 0
效果:消除因磁盘交换产生的随机性能毛刺。
3.4 清理冗余系统服务
不必要的服务:
- 京东云监控:
jcs-agent-core,jdcloudservice,jdog_service - Nginx 默认站点配置:
/www/server/panel/vhost/nginx/0.default.conf - PHP 状态监控配置(引用已删除版本):
phpfpm_status.conf
操作:
sudo systemctl stop jcs-agent-core jdcloudservice jdog_service
sudo systemctl disable jcs-agent-core jdcloudservice jdog_service
sudo mv /www/server/panel/vhost/nginx/0.default.conf /www/server/panel/vhost/nginx/0.default.conf.bak
sudo mv /www/server/panel/vhost/nginx/phpfpm_status.conf /www/server/panel/vhost/nginx/phpfpm_status.conf.bak
sudo nginx -t && sudo systemctl reload nginx
3.5 禁用用户级 systemd 重复服务,确保单实例运行
现象:发现系统级 (/etc/systemd/system/) 和用户级 (~/.config/systemd/user/) 同时存在 openclaw-gateway.service,导致两个实例争抢资源。用户级服务由 systemd --user 管理,并非短暂重启残留,而是持续运行。
操作:
systemctl --user stop openclaw-gateway
systemctl --user disable openclaw-gateway
# 清理可能残留的进程
sudo pkill -9 -f openclaw.*gateway
sudo systemctl restart openclaw-gateway
pgrep -af openclaw.*gateway # 应仅显示一条进程,且带 --max-old-space-size=768
3.6 日志自动清理
防止 /tmp 被日志填满,添加 cron 任务:
sudo crontab -e
# 添加行:
0 3 * * 0 find /tmp/openclaw -name "*.log" -mtime +7 -delete
(systemd 的 Restart=always 已保证进程守护,无需额外 cron 检查存活。)
四、最终运行状态对比
| 指标 | 优化前 | 优化后 |
|---|---|---|
| 上下文注入量 | 12 KB | 2.7 KB |
| 缓存命中率 | 59% | 94% |
| TTS 文件体积 | WAV (大) | Opus (减 92%) |
| PHP 进程数 | 15+ | 2-3 |
| 系统已用内存 | 1.6 GB | ~1.2 GB |
| Swap 使用 | 522 MB | 0 |
| Node.js 内存限制 | 无 | 768 MB 硬顶 (ExecStart 参数) |
| 密钥存储方式 | systemd 明文 | LoadCredential 文件注入 |
| 配置中幽灵技能/无用插件 | 存在 | 已从 JSON 中删除 |
| 启动日志警告 | 多条 disabled plugin 提示 | 零警告 |
| 防火墙多余端口 | 开放 3000, 39000-40000 | 已移除 |
| OpenClaw 实例数 | 系统级 + 用户级 (双实例) | 单实例运行 |
五、长期维护备忘
- 升级 OpenClaw 前:先备份
openclaw.json,对比新旧配置,检查幽灵技能和 disabled 插件是否重新出现。 - 修改 TTS 相关配置时:注意密钥文件格式,纯值 vs KEY=VALUE 不可混淆;
mimo-tts-proxy密钥文件只存纯值。 - 每 1-2 个月检查:
free -h、systemctl status openclaw-gateway、日志是否有新警告。 - 如内存占用突然升高:优先检查 PHP-FPM 进程数是否被面板重置,或是否有新站点增加。
- 若需重启服务:确保用户级 systemd 服务保持禁用,避免无意中再次启动。