首页 教程 分类 Skills下载 关于
ZH EN JA KO
问题排查

OpenClaw端口冲突与网关启动失败解决

· 8 分钟

问题描述

启动 OpenClaw 网关时,遇到端口被占用的错误:

[openclaw:server] Error: listen EADDRINUSE: address already in use :::3000
    at Server.setupListenHandle [as _listen2] (node:net:1817:16)
    at listenInCluster (node:net:1865:12)
    at Server.listen (node:net:1964:7)

或者启动后无法访问管理面板:

[openclaw:server] Server started on port 3000
$ curl http://localhost:3000/health
curl: (7) Failed to connect to localhost port 3000: Connection refused

OpenClaw 默认使用 3000 端口启动 HTTP 网关服务,用于接收 Webhook 回调、提供管理面板和 REST API。如果该端口已被其他程序占用,OpenClaw 将无法启动。

诊断步骤

检查端口占用情况

Linux / macOS:

lsof -i :3000

输出示例:

COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
node    12345   user   22u  IPv6 123456      0t0  TCP *:3000 (LISTEN)

或者使用 ss 命令:

ss -tlnp | grep 3000

Windows:

netstat -ano | findstr :3000

输出示例:

TCP    0.0.0.0:3000    0.0.0.0:0    LISTENING    12345

通过 PID 查找占用端口的进程:

tasklist /FI "PID eq 12345"

检查是否有残留的 OpenClaw 实例

ps aux | grep openclaw

如果发现有旧的 OpenClaw 进程还在运行,可能是之前没有正确关闭。

检查 OpenClaw 配置的端口

cat ~/.openclaw/openclaw.json | grep port

确认配置文件中设置的端口号。

解决方案

方案一:停止占用端口的进程

如果端口被旧的 OpenClaw 实例占用:

openclaw stop

如果 stop 命令无效,强制终止进程:

Linux / macOS:

# 找到并终止占用3000端口的进程
kill $(lsof -t -i :3000)

# 如果普通 kill 无效
kill -9 $(lsof -t -i :3000)

Windows:

# 查找PID
netstat -ano | findstr :3000

# 终止进程(替换PID)
taskkill /PID 12345 /F

终止进程后重新启动 OpenClaw:

openclaw start

方案二:更换 OpenClaw 端口

如果 3000 端口被其他重要服务占用(如 React 开发服务器),修改 OpenClaw 的端口配置:

通过命令行参数指定端口:

openclaw start --port 3001

或者修改配置文件 ~/.openclaw/openclaw.json

{
  "server": {
    "port": 3001,
    "host": "0.0.0.0"
  }
}

也可以通过环境变量设置:

OPENCLAW_PORT=3001 openclaw start

注意:如果你使用了 Webhook 方式接收消息(如 Telegram Webhook),更换端口后需要同时更新 Webhook URL 的端口号。

方案三:解决防火墙阻止

如果端口没有被其他程序占用,但仍然无法连接,可能是防火墙阻止了连接。

Linux(ufw):

sudo ufw allow 3000/tcp
sudo ufw status

Linux(firewalld):

sudo firewall-cmd --add-port=3000/tcp --permanent
sudo firewall-cmd --reload

Windows:

New-NetFirewallRule -DisplayName "OpenClaw" -Direction Inbound -Port 3000 -Protocol TCP -Action Allow

方案四:配置反向代理

在生产环境中,建议使用 Nginx 或 Caddy 作为反向代理,让 OpenClaw 监听在本地端口上,通过反向代理对外暴露标准的 80/443 端口:

Nginx 配置示例:

server {
    listen 80;
    server_name bot.example.com;

    location / {
        proxy_pass http://127.0.0.1:3000;
        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;

        # WebSocket 支持
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

Caddy 配置示例(自动 HTTPS):

bot.example.com {
    reverse_proxy localhost:3000
}

使用反向代理后,OpenClaw 可以监听在 127.0.0.1:3000(仅本地访问),安全性更高:

{
  "server": {
    "port": 3000,
    "host": "127.0.0.1"
  }
}

方案五:使用 Unix Socket(Linux/macOS)

如果端口冲突是反复出现的问题,可以让 OpenClaw 使用 Unix Socket 而非 TCP 端口:

{
  "server": {
    "socket": "/tmp/openclaw.sock"
  }
}

Nginx 配置中对应修改为:

location / {
    proxy_pass http://unix:/tmp/openclaw.sock;
}

这样完全避免了端口冲突的可能性。

验证修复

启动后验证服务正常运行:

openclaw start

# 检查服务健康状态
curl http://localhost:3000/health

# 预期输出
# {"status":"ok","version":"x.x.x","uptime":5}

如果更换了端口,将命令中的 3000 替换为新的端口号。确认管理面板可以正常访问:在浏览器中打开 http://localhost:3000(或你配置的端口)。

OpenClaw 是开源免费的个人AI助手,支持 WhatsApp、Telegram、Discord 等多平台接入