摘要:在一台 2 核 3.4G 内存的阿里云 ECS 上把 OpenClaw 从零跑通,接上微信、装上 HTTPS、建了管理端。这篇文章不写"理论上可以",只记真实执行过的命令、真实报出来的错、真实花掉的时间。8 个坑里有一半会让你以为自己配对了、其实三个月后才炸。
OpenClaw 本身不难装,难的是它跑起来之后你要给它配的那些周边——反向代理、HTTPS、开机自启、定时任务。这篇解决的是后者。
如果你只想跑通,看第 2 节;如果你不想三个月后半夜被证书过期搞醒,第 4 节的坑 3 必看。
目标很具体:一个能 24 小时待命的 AI 助手,挂在微信上,能自己按定时任务干活(每天生成日报、抓热点、发文章),还能管我自己的网站。
不是聊天机器人,是常驻后台的自动化进程。
| 项目 | 值 |
|---|---|
| 服务器 | 阿里云 ECS,2 核 |
| 内存 | 3.4 Gi(实测已用 1.0 Gi) |
| 系统 | Ubuntu 22.04.5 LTS |
| OpenClaw | 2026.8.2 |
| nginx | 1.18.0(Ubuntu 源) |
| 磁盘 | 剩余 40 G |
这个配置跑 OpenClaw + 一个静态站 + 两个 Python 后端,内存占用 30%,完全够用。不用上 4 核 8G。
OpenClaw 装好后不要手动 nohup 拉起来——重启就没了。用 systemd 托管:
systemctl enable --now openclaw
systemctl is-active openclaw # 应输出 active
它默认监听 127.0.0.1:18789。注意是本地回环,外网直接访问不到——这是对的,后面靠 nginx 反代出去。
ss -tlnp | grep 18789
看到 127.0.0.1:18789 才算起来。只看到进程不代表端口在监听。
location / {
proxy_pass http://127.0.0.1:18789;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
改完必须先校验再 reload:
/usr/sbin/nginx -t # 必须用全路径,nginx 不在 PATH 里
systemctl reload nginx
http2 on;报错:nginx -t 直接失败。
原因:独立的 http2 on; 指令是 nginx 1.25.1+ 才有的。Ubuntu 22.04 源里是 1.18.0,写这个必挂。
解决:用老语法写在同一行:
listen 443 ssl http2; # ✅ 1.18 认这个
# http2 on; # ❌ 1.25.1+ 才有
--nginx 插件会改坏你的配置现象:用 certbot --nginx 一键签证书,它会自动改写 nginx 配置。你手写的注释、自定义 location 可能被重排。
解决:改用 webroot 模式,配置完全自己控制:
certbot certonly --webroot -w /var/www/你的站点 \
-d 你的域名 -d www.你的域名
现象:签证书一切正常,网站 HTTPS 也能访问。但三个月后续期失败,整站挂掉。
原因:Let's Encrypt 续期用的是 HTTP-01 校验,它会访问 http://你的域名/.well-known/acme-challenge/xxx。如果你配了"HTTP 全站 301 跳 HTTPS",这个校验请求会被跳走,续期拿不到文件。
解决:ACME 校验路径必须单独放行,不跳转:
# 这个 location 要放在 301 跳转规则之前
location /.well-known/acme-challenge/ {
root /var/www/你的站点;
# 注意:这里绝对不能写 return 301
}
必做验证——干跑一次续期,别等三个月后才发现:
certbot renew --dry-run
看到 Congratulations, all simulated renewals succeeded 才算真配对了。
报错:SSL: no alternative certificate subject name matches target host name '47.92.243.8'
原因:Let's Encrypt 只给域名签证书,不给公网 IP 签。证书里只有 zyker.cn,没有 IP。
后果:https://你的IP 浏览器会报证书错误(红锁),http://你的IP 正常。这不是配错了,是无解。
结论:IP 只能留作应急备用,正式访问一律走域名。
{2} 必须加引号报错:pcre_compile() failed: missing )
原因:nginx 把 { 当成配置块的开始。
解决:正则整体加引号:
location ~ "^/(20[0-9]{2}-[0-9]{2}-[0-9]{2}-.+[.]html)$" {
现象:我把站点基址从 IP 改成了域名,验证通过。结果第二天早上一看,又变回 IP 了。
原因:生成脚本是 SITE_BASE = os.environ.get("SITE_BASE", "http://47.92.243.8")。我手动跑的时候传了环境变量,但crontab 里的每日自动重跑没传,于是退回了默认值。
教训:靠环境变量覆盖默认值的设计,默认值必须和当前事实一致。否则任何一次没带环境变量的执行都会把你的改动冲掉。
验证方法:模拟 crontab 场景跑一次:
env -u SITE_BASE python3 你的脚本.py
报错:ERROR: No matching distribution found for flask
原因:服务器出网有白名单,pypi 不可达。
影响:Flask、passlib、python-multipart 全都装不上。
解决:只能用 Python 内置库。表单自己解析、密码用 hashlib.pbkdf2_hmac、会话用 http.cookies。写起来多几十行,但能跑。
现象:管理端有 8 个"是否显示"勾选框,勾了 5 个,保存后只有最后一个生效。
原因:name="show" 同名,解析成 dict 时后面的 key 覆盖前面的。
解决:name 必须唯一,把标识编进去:
<input type="checkbox" name="show_/price-calendar.html" value="1">
保存时按前缀收集:{k[5:] for k in form if k.startswith("show_")}。
| 项目 | 金额 | 说明 |
|---|---|---|
| 云服务器 | ¥50-100/月 | 2核3.4G,已有 |
| HTTPS 证书 | ¥0 | Let's Encrypt 免费 |
| OpenClaw | ¥0 | 开源 |
| 域名 | 已持有 | — |
| API 调用 | 按量,几元到几十元 | 取决于任务量 |
纯新增成本:0 元。 用到的全是已有资源 + 免费证书。
从动手到跑通,主要时间花在踩坑和验证上,不是安装上。
这套环境跑起来只是第一步。接下来要接的是:微信渠道、定时任务、内容自动生成。
卡在哪、怎么过的,我会继续记。 这类"报错信息 + 解决方案"的内容最容易被搜到——因为写的人大多只写成功案例,不写翻车过程。
本文所有命令与报错均来自真实部署环境,非推测。环境:Ubuntu 22.04.5 + OpenClaw 2026.8.2 + nginx 1.18.0。
这篇文章涉及的场景,我整理成了拿来即用的提示词包,复制粘贴就能跑:
单包 ¥9.9 / 任选三包 ¥19.9 / 全套 15 包 ¥39.9,均可先免费预览。
以下工具经实际使用验证(部分含推广链接,你购买不影响价格,我能获得分成):
广告与推广说明:本站部分链接为推广链接,感谢你的支持让内容持续更新。