OpenClaw 1核4G 服务器完整优化记录(脱敏版)

OpenClaw 1核4G 服务器完整优化记录(脱敏版)

日期:2026-06-25
服务器环境:1 核 CPU / 4GB RAM,Ubuntu + 宝塔面板
目标:在保证安全与功能的前提下,将资源占用降至最低,消除所有配置与运行警告,建立长期维护标准。


一、OpenClaw 配置层优化

1.1 删除幽灵技能 mimo-v2-5-tts

问题:物理技能文件已删除,但主配置文件 openclaw.jsonskills.entries 中仍存在该条目,导致每次启动时产生警告日志。

操作步骤

  1. 停止服务:
sudo systemctl stop openclaw-gateway
  1. 备份配置文件(带时间戳):
cp /home//.openclaw/openclaw.json /home//.openclaw/openclaw.json.bak.$(date +%Y%m%d-%H%M%S)
  1. 使用 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)
"
  1. 重启服务:
sudo systemctl start openclaw-gateway
  1. 验证: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 已禁用但配置仍存在。

操作(类似幽灵技能处理):

  1. 停服、备份(同上)。
  2. 执行 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)
"
  1. 重启服务。
  2. 验证:sudo journalctl -u openclaw-gateway -n 30 --no-pager | grep "config is present" 应返回空。

1.4 添加长会话自动压缩(Compaction)

原因:当前短对话下 token 占用仅 9%,但为防御未来超长会话导致 token 膨胀、内存飙升,添加此防御性配置。

操作(确保配置位于 agents.defaults.compaction非顶层):

  1. 停服、备份。
  2. 写入配置(使用 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)
"
  1. 重启服务。

参数解释

  • truncateAfterCompaction: true 压缩后裁剪冗余历史,彻底阻止膨胀。
  • maxHistoryShare: 0.5 确保压缩后的历史占用不超过上下文窗口的 50%,为当前回复留足空间。

二、安全加固

2.1 密钥从 systemd 明文迁移至加密凭据

问题OPENCLAW_GATEWAY_PASSWORDMIMO_API_KEY 原以明文形式写在服务文件 /etc/systemd/system/openclaw-gateway.service 中,任何有权限读取该文件的人或进程都可获取。

解决方案:使用 systemd 的 LoadCredential 机制,将密钥以文件形式安全注入,服务文件本身不再包含明文。

操作

  1. 创建安全存储目录并写入密钥文件:
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 # 若需要特定用户读取
  1. 修改服务文件:
  • 删除所有原有的 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 中会被自动展开为凭据目录,进程内通过环境变量获取文件内容。
  1. 重载并重启:
sudo systemctl daemon-reload
sudo systemctl restart openclaw-gateway
  1. 验证: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 认证失败。

处理过程

  1. 确认服务存在:systemctl cat mimo-tts-proxy.service 输出 ExecStart=/usr/bin/python3 .../proxy.py
  2. 脚本直接从文件读取密钥(不做 KEY=VALUE 解析),因此密钥文件只能包含纯密钥值,不能有前缀。
  3. 修正密钥文件内容(移除误添加的 MIMO_API_KEY= 前缀):
echo "" | sudo tee /etc/openclaw/secrets/mimo-api-key > /dev/null
  1. 创建 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 使得环境变量获得文件内容。)

  1. 重载并重启:
sudo systemctl daemon-reload
sudo systemctl restart mimo-tts-proxy
  1. 功能测试(通过 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 正在工作。但存在不必要的开放端口,增加攻击面。

操作

  1. 移除无服务监听的端口 3000:
sudo ufw delete allow 3000/tcp
  1. 移除未使用的 FTP 被动端口范围 39000-40000:
sudo ufw delete allow 39000:40000/tcp
  1. 重载防火墙:
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.confpm.max_children 默认为 50,产生了大量空闲进程,严重浪费内存。

操作

  1. 停止并禁用不使用的版本:
sudo systemctl stop php-fpm-74 php-fpm-82
sudo systemctl disable php-fpm-74 php-fpm-82
  1. 调整 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

(修改前先备份原文件)

  1. 重启 PHP 8.4:
sudo systemctl restart php-fpm-84
  1. 验证:ps aux | grep php-fpm | wc -l 进程数从 15+ 降至 2–3。

效果:释放约 300–500 MB 内存。


3.2 限制 Node.js 内存使用(仅 ExecStart 参数,无冗余环境变量)

原因:避免 V8 引擎堆内存过度膨胀,在物理内存紧张时触发 OOM Killer。

操作

  1. 修改 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,避免重复设置。

  1. 重载并重启:
sudo systemctl daemon-reload
sudo systemctl restart openclaw-gateway
  1. 验证: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 -hsystemctl status openclaw-gateway、日志是否有新警告。
  • 如内存占用突然升高:优先检查 PHP-FPM 进程数是否被面板重置,或是否有新站点增加。
  • 若需重启服务:确保用户级 systemd 服务保持禁用,避免无意中再次启动。