☰
云服务器部署 OpenClaw 网关:Nginx 反向代理与 HTTPS 证书配置实战
2026/10/16 4:46:25 网站建设 项目流程

做网关部署这件事,我自己折腾过不少次。第一次把 OpenClaw 网关放到云服务器上时,光踩坑就花了一整晚,后来把整套流程跑顺了,才意识到很多问题其实都出在一些很基础的环节上:端口没放通、配置文件的字段写错、systemd 服务没托管好、证书到期没人管。这篇教程是我把完整过程重新整理之后的记录,既保留了第一次部署时的排查思路,也加上了后来在多个环境里反复验证过的稳妥做法。

OpenClaw 网关本质上是一个轻量级的流量入口,核心作用就是把后端零散的 HTTP 服务收拢成一个统一入口,负责路由转发、负载均衡、限流、熔断、TLS 终止和访问日志记录。你在云服务器上装了它之后,外部客户端只需要访问一个域名,请求就会按规则转发到内网的各个上游服务,不需要让每个业务服务都直接暴露公网。适合后端开发者、运维人员,也适合那些自己一个人同时维护好几个服务的独立开发者。不管你是刚开始接触网关,还是已经用其他网关产品有一段时间,这篇内容都能给你一份能直接照着操作的部署脚本。

1. 项目拆解:OpenClaw 网关到底解决了什么问题

1.1 核心能力和适用场景

先想清楚一件事:你为什么要在云服务器上单独部署一个 OpenClaw 网关,而不是直接让应用程序监听公网端口?我在实际项目里的体会是,绝大多数场景下,你的服务不可能只有一个。假设你有用户服务、订单服务、支付回调服务、管理后台、静态资源服务,各自监听不同的端口,如果全部暴露到公网,安全组规则会变得极其混乱,证书要分别配置,日志要分别采集,限流和鉴权逻辑还要在每个服务里各自实现一遍。这不仅是重复劳动,而且很容易出现某个服务忘了加鉴权、某个端口策略配错这种低级问题。

OpenClaw 网关把这些问题收敛到一个入口。它支持 HTTP/HTTPS 请求的按域名路由、按路径前缀转发、加权轮询负载均衡、基于令牌桶的限流策略、熔断降级规则、TLS 证书统一管理,以及请求级别的访问日志。它不像重量级服务网格那样需要引入一大堆基础设施,部署形态就是单个二进制文件加一份 YAML 配置,用 systemd 托管在云服务器上就能跑。这个特性非常适合中小规模的业务团队,也适合个人开发者用一台 2C4G 的入门云服务器同时管理多个内部项目。

另外一个常被忽略的使用场景是灰度发布和接口迁移。OpenClaw 的路由规则支持权重调整,你可以在不修改业务代码的情况下,把 10% 的流量切到新版本服务上,观察日志和错误率之后再逐步放大比例。这比直接在 Nginx 配置文件里反复改 upstream 要灵活得多,因为路由规则的变更可以直接走管理接口下发,不需要重启进程,也就不需要担心 reload 期间的长连接被切断。

1.2 架构设计的两种路线

部署 OpenClaw 网关之前,你要先选定架构形态。常见的做法有两种:一种是让 OpenClaw 直接占用服务器的 80/443 端口,对外暴露公网入口;另一种是让 OpenClaw 监听内网端口,前面再套一层 Nginx 反向代理,由 Nginx 负责 HTTP 层的基础优化,OpenClaw 专注做业务路由和流量治理。

我个人的建议是:除非你的服务器真的没有多余资源,否则优先选择第二种。理由有几个层面。第一,Nginx 的事件驱动模型在静态连接处理上有非常成熟的优化,处理大并发请求时占用的系统资源比普通应用网关低;第二,OpenClaw 的管理端口、指标端口、内部心跳端口都可以只监听在内网回环地址或 VPC 内网,减少暴露面;第三,Nginx 的配置生态里有很多现成的安全优化片段,比如请求体大小限制、超时时间、缓存策略,直接拿过来改改就能用,没必要在 OpenClaw 里重新造一遍轮子。

当然,如果你部署 OpenClaw 只是为了服务一两个内部 API,而且服务器规格比较有限,那直接让 OpenClaw 监听 443 端口也完全可行。只要你别把管理端口暴露到公网,再把证书路径正确配置到 OpenClaw 的 TLS 字段里即可。我后面会按这两种情况分别给出关键配置差异。

2. 云服务器准备工作:选型、初始化与网络规划

2.1 配置选型推荐

OpenClaw 对服务器硬件的要求不算高,但它毕竟承担了所有流量的转发和限流计算,配置太低会出现 CPU 飙升和连接超时,配置太高又浪费成本。我根据自己部署过的环境整理了一个参考区间:

业务规模CPU内存磁盘带宽适用场景
个人项目/内部工具1核2G30G SSD3Mbps日均请求量低于 2 万
小型团队/创业项目2核4G50G SSD5Mbps日均请求量 10 万以下
中等规模业务4核8G100G SSD10Mbps+日均请求量 50 万左右

选配置的核心评估指标是“并发连接数”而不是“日均请求量”。OpenClaw 每处理一个请求,会占用一些内存作为连接缓冲区,如果上游服务响应慢,并发连接会被拉高,内存占用也会随之上涨。所以我的经验是:即便日均请求量不高,只要你的请求里有大量接口耗时超过 500ms,内存规格就往上提一档,内存越多,系统能缓冲的慢连接就越多,网关崩溃的概率越低。

操作系统层面,推荐用 Debian 12 或者 Ubuntu 22.04 这种长期维护的版本。这两类系统内核版本不会太旧,systemd 的版本也新,能省掉很多兼容性问题。不推荐在容器里跑这个网关作为生产入口,虽然 Docker 部署方便,但涉及网络性能调优时,容器会额外引入一层虚拟网络的开销,排查问题也更麻烦。

2.2 基础环境初始化与安全加固

服务器到手后,第一件事不是装 OpenClaw,而是先做基础环境初始化。我总结过一套固定步骤,每一步都有它存在的理由。

先创建独立的运行用户,避免直接用 root 运行网关进程。长期用 root 跑服务,一旦进程被外部攻击者利用,对方拿到的就是整个服务器的最高权限,代价太大。用一个没有高权限的普通用户运行 OpenClaw,即使二进制文件本身出现漏洞,攻击面也会小很多。

adduser openclaw mkdir -p /var/log/openclaw chown -R openclaw:openclaw /var/log/openclaw

然后用 SSH 密钥登录替代密码登录。云厂商控制台创建实例时,都可以选择用密钥对登录,如果你已经用密码方式创建了实例,可以手动把公钥写入到登录用户的 authorized_keys 文件里:

mkdir -p ~/.ssh chmod 700 ~/.ssh echo "你的公钥内容" >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys

之后编辑 /etc/ssh/sshd_config,确认PermitRootLogin no和PasswordAuthentication no,再重启 SSH 服务。这一步的目的是让服务器不再接受密码握手,因为密码可以在多次尝试中被在线猜中,而密钥方式在没有私钥文件的情况下几乎无法暴力破解。重启之前,务必保留一个已经登录的会话,改完配置后先开一个新连接验证能登录成功,再关闭旧会话,防止配置写错把自己锁在外面。

接下来调整系统文件描述符和 TCP 连接参数。OpenClaw 作为网关,需要同时维持大量长连接,Linux 默认的进程文件描述符上限通常只有 1024,根本不够用。编辑 /etc/security/limits.conf,添加:

openclaw soft nofile 65535 openclaw hard nofile 65535

再调整内核参数。在服务器上执行命令来添加这些配置:

sysctl -w fs.file-max=65535 sysctl -w net.core.somaxconn=1024 sysctl -w net.ipv4.tcp_tw_reuse=1 sysctl -w net.ipv4.ip_local_port_range="1024 65535"

somaxconn控制处于等待状态的连接队列长度,高并发场景下如果这个值太小,客户端会看到连接被拒绝;tcp_tw_reuse让处于 TIME_WAIT 状态的连接可以更快被复用,避免大量短连接把端口池耗尽;ip_local_port_range决定本地发起连接时能使用哪些源端口,如果你的网关转发了大量外部请求到内部上游服务,端口范围不够就会间歇性出现“Cannot assign requested address”的报错。

这些参数写入 /etc/sysctl.conf 后,直接sysctl -p加载,重启服务器后仍然生效。

3. 下载、配置并启动 OpenClaw 网关

3.1 安装二进制包与版本校验

OpenClaw 的安装方式比较简单,从项目的官方发布页面下载对应架构的压缩包。云服务器基本都是 amd64 架构,如果你用的是 ARM 架构服务器,记得选 arm64 包。

cd /usr/local wget https://releases.example.com/openclaw/openclaw-linux-amd64.tar.gz tar -zxvf openclaw-linux-amd64.tar.gz mv openclaw /usr/local/bin/openclaw chmod +x /usr/local/bin/openclaw

下载之后一定先做版本校验。理想的流程是同时下载官方提供的校验值文件,然后比对 sha256:

sha256sum openclaw-linux-amd64.tar.gz echo "官方发布的校验值 openclaw-linux-amd64.tar.gz" | sha256sum -c -

这一步看起来繁琐,但真的很重要。网关作为流量入口,如果拿到的二进制被人替换,后果比业务服务被入侵还要严重。我在生产环境安装任何组件都会执行这一步,虽然不能百分百保证安全,但至少能挡住下载链路篡改这类风险。

验证完成后运行openclaw version,确认程序能正常执行。如果提示缺少动态链接库,说明系统缺依赖,按报错内容补齐即可。

3.2 核心配置文件详解

OpenClaw 的配置是 YAML 格式,默认路径是 /etc/openclaw/openclaw.yml。我给一个完整的生产配置示例,然后挑关键字段逐一说清楚它们的作用。

# /etc/openclaw/openclaw.yml node: name: gateway-01 listen: http: "0.0.0.0:8080" metrics: "127.0.0.1:9090" admin: enabled: true listen: "127.0.0.1:9091" token: "换成你自己的随机长字符串" routes: - name: api-server match: host: api.example.com path_prefix: /v1 upstreams: - "http://10.0.0.11:8000" - "http://10.0.0.12:8000" load_balance: round_robin timeout_connect: 3s timeout_read: 30s retry: attempts: 2 on_connect_failure: true ratelimit: - name: api-global-limit route: api-server rate: 100 burst: 200 window: 60s tls: cert: /etc/letsencrypt/live/api.example.com/fullchain.pem key: /etc/letsencrypt/live/api.example.com/privkey.pem log: level: info format: json output: stdout

node.name是网关实例的唯一标识。如果后续你部署了多个 OpenClaw 实例做集群,这个名称会被用于区分日志来源和服务注册信息,不能重复。

listen.http设置网关对外的 HTTP 监听地址。示例中我监听在所有网卡的 8080 端口,因为前面还会套一层 Nginx,Nginx 接收公网流量之后转发到本机 8080;如果你要让 OpenClaw 直接对外服务,可以改成 443 并配合 tls 配置。metrics监听在回环地址,这个端口暴露指标的地址不能被外部访问到,否则任何人都能查看你的流量状态甚至通过管理接口调整路由。

routes是路由规则集合。匹配条件由host和path_prefix共同生效,请求必须同时满足两个条件才会被路由;upstreams是上游服务地址列表,可以配置多台机器,OpenClaw 会按照load_balance策略分发请求;timeout_connect是建立连接到上游服务的最长等待时间,timeout_read是等待上游响应体的超时时间,这两个超时值要根据业务接口的实际耗时去调,设得太短会把慢接口误判为故障,设得太长又容易堆积大量慢请求。

ratelimit配置全局限流规则。示例中这个规则限定 api-server 这条路由在 60 秒窗口内最多接受 100 个请求,突发情况下允许峰值达到 200 个,超过限制的请求会直接返回 429。限流的关键是rate和burst的配合:rate是平均速率,burst是瞬时允许超过的量。如果 burst 等于 rate,就会造成客户端偶尔出现比较长的等待;如果 burst 设得过大,限流就失去了意义。

log.format设置成 json 的好处是,日志输出后可以直接投递给日志采集系统做结构化分析。生产环境不建议用纯文本格式,排查问题的时候你会发现 grerp 出来的日志字段散在各处,处理起来非常痛苦。

3.3 使用 systemd 托管进程

安装和配置完成后,要让 OpenClaw 在后台稳定运行,systemd 是 Linux 服务器上最标准的方案。创建一个服务单元文件:

# /etc/systemd/system/openclaw.service [Unit] Description=OpenClaw Gateway Service After=network-online.target Wants=network-online.target [Service] User=openclaw Group=openclaw WorkingDirectory=/etc/openclaw ExecStart=/usr/local/bin/openclaw run --config /etc/openclaw/openclaw.yml Restart=on-failure RestartSec=5 LimitNOFILE=65535 StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target

这里LimitNOFILE再次强调一下:systemd 对一些资源限制有自己的默认值,即使你在 limits.conf 里设置了 65535,systemd 管理的进程可能还是只拿到 1024。只有在这个服务单元里明确写上LimitNOFILE=65535,进程才能真正放开文件描述符限制。

写完配置文件后,执行:

systemctl daemon-reload systemctl enable --now openclaw systemctl status openclaw

enable让服务在开机时自动启动,--now表示立即启动。检查服务状态时看到 active (running) 不代表一切正常,还要看日志确认启动过程中有没有报错:

journalctl -u openclaw -n 100 --no-pager

启动之后测试一下路由是否生效。在本机执行:

curl -I http://127.0.0.1:8080/v1/health

如果返回了上游服务的响应头,说明路由已经跑通了。如果你看到 502,先检查 upstream 服务的地址是否能从这台服务器上访问,再检查防火墙和安全组。

4. 接入域名、HTTPS 与上游服务

4.1 Nginx 反向代理与 WebSocket 接入

如果你的 OpenClaw 监听在 8080 端口,我不建议直接把公网流量打到 8080 上,而是用 Nginx 在 443 端口接收外部请求,再转发到本机 8080。这样做的好处是,TLS 终止逻辑放在 Nginx 层,OpenClaw 只需要关心业务路由,两边的复杂度相互隔离,后面调整证书或者调整路由不会互相影响。

先安装 Nginx,然后写一个虚拟主机配置:

server { listen 80; server_name api.example.com; return 301 https://$host$request_uri; } server { listen 443 ssl http2; server_name api.example.com; ssl_certificate /etc/letsencrypt/live/api.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/api.example.com/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; location / { proxy_pass http://127.0.0.1:8080; 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; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_read_timeout 60s; } }

proxy_set_header Host $host保证 OpenClaw 的路由规则可以正确匹配到域名;X-Forwarded-For用来保留真实客户端 IP,否则 OpenClaw 里看到的请求来源全是 127.0.0.1,限流和审计日志就失去了意义;X-Forwarded-Proto让 OpenClaw 知道外部客户端是用 HTTPS 访问的,在回调逻辑中生成跳转地址时能保持正确协议。

Upgrade和Connection "upgrade"这两行是为了支持 WebSocket 长连接。如果你后面想让 OpenClaw 转发 WebSocket 消息,这两行必须加上;不加的话,WebSocket 握手会失败。proxy_read_timeout对于 WebSocket 场景也要调大,60 秒只是底线,如果业务上有长时间没有消息的推送连接,建议再拉高到 300 秒。

4.2 免费证书申请与自动续期

证书方面,目前使用最广的免费方案是 Let's Encrypt,配合 certbot 工具申请和续期都很快。在 Nginx 配置已经就绪的情况下,申请命令可以写成:

apt install -y certbot python3-certbot-nginx certbot --nginx -d api.example.com --redirect

certbot 会自动检测 Nginx 配置里的 server_name,安装证书到标准路径,并重载 Nginx。申请完成后,关键是你不能手动去跟证书的到期时间赛跑,一定要确认自动续期任务存在:

systemctl status certbot.timer

Let's Encrypt 的证书有效期是 90 天,如果不配置自动续期,三个月后服务就会突然出现证书校验失败。certbot.timer默认会每天检查两次证书状态,发现离过期不足 30 天就自动续期。检查这个定时器是否正常,比申请证书本身还重要。

如果你的服务器网络环境比较特殊,无法直接访问证书签发服务的接口,也可以使用阿里云或腾讯云的免费证书。流程基本是:在云控制台申请证书,下载证书文件,手动放到指定路径,然后在 Nginx 里替换ssl_certificate和ssl_certificate_key,最后 reload Nginx。

4.3 上游服务内网互通与安全组策略

OpenClaw 转发目标里的http://10.0.0.11:8000这类地址,通常是云服务器 VPC 私网内的其他机器。使用内网 IP 而不是公网 IP 有几个实际原因:一是内网流量不计入公网带宽,费用更可控;二是内网传输的时延更低,而且不会经过公网的不可控链路;三是安全组可以限制这两个端口只允许来自 OpenClaw 所在服务器的访问,外部无法直接触达。

配置安全组的原则是:少开放、白名单化。公网入方向只放行22(SSH)、80(HTTP)、443(HTTPS)三个端口;OpenClaw 的8080、管理端口9091、指标端口9090一律不对公网开放。如果你的业务有来自特定办公网段的运维需求,可以把管理端口临时加上来源 IP 白名单,而不是对所有来源开放。

内网侧的上游服务安全组也要双向思考:上游服务的端口要允许 OpenClaw 所在服务器的内网 IP 访问,但不能允许同 VPC 内其他无关机器访问。如果嫌细粒度麻烦,至少也要限制到 VPC 网段。云厂商的默认安全组通常是全部放行,这在很多事故里都是背后凶手。

我这里要特别提醒一个现象:很多人会看到网关配置没问题、服务也启动了,但外部请求还是 502,最后发现是安全组里压根没放行 80/443,或者放行了但绑定的实例选错了。改完安全组规则后,用外部环境主动访问一下测试页面,不要只在服务器本机 curl。

5. 上线后的监控、日志与故障排查

5.1 健康检查与告警脚本

网关一旦上线,它就是你所有流量的咽喉,它挂了,后面所有服务都等于没挂。所以健康检查脚本必须尽早准备。最简单的方案是写一个脚本,定时请求 OpenClaw 暴露的指标端口或健康检查接口,连续失败就触发重启并写日志。

#!/bin/bash # /usr/local/bin/check_openclaw.sh if curl -fsS --max-time 5 http://127.0.0.1:9090/health > /dev/null 2>&1; then echo "$(date '+%F %T') OK" >> /var/log/openclaw_health.log else echo "$(date '+%F %T') FAIL" >> /var/log/openclaw_health.log systemctl restart openclaw curl -fsS --max-time 10 "http://localhost:9091/reload" \ -H "X-Admin-Token: 你的管理token" fi

然后通过 cron 或 systemd timer 每 5 分钟执行一次:

*/5 * * * * /usr/local/bin/check_openclaw.sh

这里的逻辑是:先检查健康状态,失败先重启;restart 之后立即 reload 配置,因为有些配置修改可能还没加载到最新版本。这种“重启 + reload”双保险的做法,可以有效处理进程假死但服务单元状态没被识别为失败的情况。

有预算或者有条件的话,再用一个外部监控服务从公网角度检查https://api.example.com/v1/health,因为本机检查只能表明进程还活着,不能代表外部链路是通的。本机不通一定有问题,本机通而外网不通,那问题往往在 Nginx、安全组或域名解析。

5.2 日志查看与轮转配置

OpenClaw 的日志配置里我把 output 设置成了 stdout,这样日志会统一进 systemd journal,用journalctl就能查看。

journalctl -u openclaw -f journalctl -u openclaw --since "10 minutes ago" -p warning

journal 的优点是集中,但缺点是默认没有滚动清理,时间长了会占用大量磁盘空间。我一般在 /etc/logrotate.d/openclaw 里写一个轮转配置,把日志文件按天切分,保留 30 天:

/var/log/openclaw.log { daily rotate 30 compress delaycompress missingok notifempty create 0640 openclaw openclaw postrotate systemctl restart openclaw endscript }

如果你启用了 log 文件输出,记得确认 openclaw 用户对 /var/log/openclaw.log 有写权限。如果不给权限,日志会静默丢弃,排查问题时就等于瞎子摸象。日志采集的方案,团队规模小可以直接把 journal 拉到日志平台,规模大建议输出成 JSON 后用消息队列集中收集,方便按请求ID串联上下游日志。

5.3 高频问题排查速查表

我把实际部署中遇到过的、以及身边同事问过最多的故障整理成了速查表,按频率排下来大概是这些:

现象可能原因排查与解决
外部访问 502Nginx 没转发到 OpenClaw / 安全组没放行本机先 curl 127.0.0.1:8080,通的话再按链路依次检查 Nginx、安全组
路由不生效请求的 host 或 path_prefix 不匹配检查配置中的域名是否完整带点,path_prefix 是否和调用方路径一致
证书过期certbot.timer 停用或网络不通重新 certbot renew,确认证书路径和 Nginx 引用路径一致
限流不生效rate/burst 写反或 route 名称写错限流规则的 route 必须与 routes.name 完全一致
内存持续上涨timeout_read 过长 + 慢请求堆积缩短超时时间,为慢接口单独设置更长超时,避免全局拉高
大量 TIME_WAIT短连接太多确认 tcp_tw_reuse 已设置,必要时在 Nginx 层开启 keepalive
请求头丢失真实 IPNginx 没设置 X-Forwarded-For补上 proxy_set_header,并在 OpenClaw 中开启信任代理头

这里有一个很重要的细节:排查问题时千万不要在 Nginx 层改一个参数就重启整个链路来测试,应该按“客户端 → Nginx → OpenClaw → 上游服务”逐层确认。先在服务器本机 curl OpenClaw 的 8080,如果通了说明 OpenClaw 没问题;再 curl Nginx 的 443,如果通了说明 Nginx 配置没问题;最后再从外部客户端访问域名。这样每测一层,问题范围就缩小一半,不至于一头扎进配置文件的海洋里。

关于日志排查,还有一条经验:上线初期最好把日志级别调到 debug,观察真实流量在 OpenClaw 里的匹配情况。等跑个一两天、确认所有路由都稳定通过,再把日志级别调回 info,避免 debug 日志在高峰期形成巨大 IO 负担,拖慢整体转发性能。

最后再分享一个小技巧。我部署 OpenClaw 网关时,会先在本地虚拟机或容器里把配置跑一遍,确认路由、限流、证书全都没问题之后,再搬到云服务器上。这样线上出了问题,你的排查范围里至少可以去掉了“配置基础语法写错”这个选项。每次改动配置之前,也尽量先跑一遍openclaw check -c /etc/openclaw/openclaw.yml做配置验证,OpenClaw 会在加载配置时直接给出语法层面的错误提示,能挡住至少一半的低级问题。这个习惯从第一次部署用到现在,没出过一次因为手滑写错配置导致的线上事故。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询