Nginx 反向代理实现 OpenClaw 外部访问

Zou, Ning 发布于 2 小时前 技术实践 899 字 9 次阅读


第一步:创建工作目录与所需的文件

# 创建Nginx目录
mkdir Nginx
mkdir Nginx
cd /root/Nginx

第二步:生成自签名 SSL 证书

cd /root/Nginx
mkdir -p certs
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout certs/server.key \
  -out certs/server.crt \
  -subj "/CN=$(hostname -I | awk '{print $1}')"
cd /root/Nginx
mkdir -p certs
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout certs/server.key \
  -out certs/server.crt \
  -subj "/CN=$(hostname -I | awk '{print $1}')"

第三步:编写 Nginx 配置 (反向代理核心)

创建文件/root/Nginx/nginx.conf,内容如下:

events {}

http {
    # 强制 HTTP 跳转 HTTPS
    server {
        listen 80;
        server_name _;
        return 301 https://$host$request_uri;
    }

    # HTTPS 反向代理
    server {
        listen 443 ssl http2;
        server_name _;

        ssl_certificate     /etc/nginx/certs/server.crt;
        ssl_certificate_key /etc/nginx/certs/server.key;

        # SSL 协议与加密套件(推荐配置)
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers HIGH:!aNULL:!MD5;

        location / {
            # 转发到 OpenClaw(宿主机 IP + 端口 18789)
            proxy_pass http://host.docker.internal: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;

            # WebSocket 支持(必须配置,否则 UI 会频繁断连)
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";

            # 延长超时时间,防止长任务中断
            proxy_read_timeout 300s;
        }
    }
}

将 YOUR_HOST_IP 替换为宿主机的内网 IP(如 172.17.0.1,即 Docker 默认网桥网关)或使用 host.docker.internal(仅 Docker Desktop for Mac/Windows 支持;在 Linux 上需添加 --add-host=host.docker.internal:host-gateway 启动选项)。注意:由于 OpenClaw 已配置 bind: "loopback",必须通过本地代理访问,不能使用 127.0.0.1 从 Nginx 容器内部访问

第四步:创建 Docker 容器启动命令

cd /root/Nginx

# 运行 nginx 容器,映射端口,挂载配置文件与证书
docker run -d \
  --name nginx-proxy \
  --restart unless-stopped \
  -p 80:80 \
  -p 443:443 \
  -v $(pwd)/nginx.conf:/etc/nginx/nginx.conf:ro \
  -v $(pwd)/certs:/etc/nginx/certs:ro \
  nginx:alpine

关键参数解释:

  • --add-host host.docker.internal:host-gateway:将 host.docker.internal 映射到宿主机网关,使得容器内部可以用此域名访问宿主机端口。
  • -v ...:ro:挂载只读模式,更安全。
  • -p 80:80 -p 443:443:将宿主机的 80、443 映射到容器,对外提供 HTTP/HTTPS 访问。

第五步:OpenClaw 网关配置

编辑 OpenClaw 配置文件(通常位于 ~/.openclaw/openclaw.json),添加以下配置:

{
  "gateway": {
    "port": 18789,
    "mode": "local",
    "bind": "0.0.0.0",
    "controlUi": {
      "allowedOrigins": [
        "http://127.0.0.1:18789",
        "http://localhost:18789",
        "https://YOUR_SERVER_IP"
      ]
    },
    "auth": {
      "mode": "token",
      "password": "你的访问令牌"
    },
    "trustedProxies": ["127.0.0.1"]
  }
}
{
  "gateway": {
    "port": 18789,
    "mode": "local",
    "bind": "0.0.0.0",
    "controlUi": {
      "allowedOrigins": [
        "http://127.0.0.1:18789",
        "http://localhost:18789",
        "https://YOUR_SERVER_IP"
      ]
    },
    "auth": {
      "mode": "token",
      "password": "你的访问令牌"
    },
    "trustedProxies": ["127.0.0.1"]
  }
}

注意事项:

"bind": "0.0.0.0",这一项参数必须为0.0.0.0监听所有端口,否则容器(除host模式外)无法访问OpenClaw的网关!新版本又限制了0.0.0.0去监听任意端口,容器最好改为host模式!

检查宿主机防火墙是否放行 80/443

# 查看当前开放端口
firewall-cmd --list-ports

# 如果没有 80/tcp 和 443/tcp,则添加
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=443/tcp
firewall-cmd --reload

第六步:验证

1. 检查容器运行状态

docker ps | grep nginx-proxy

2. 查看 Nginx 日志,确认启动无错

docker logs nginx-proxy

3. 浏览器访问

在浏览器地址栏输入(假设宿主机 IP 为 192.168.1.x):

  • http://192.168.1.x → 应自动跳转为 https://192.168.1.x
  • 或直接访问 https://192.168.1.x/ui(YACD 面板常见入口)

登录信息就是 OpenClaw 管理界面中配置的 host(本机 IP)、端口(9090)和密码(默认 123456)

4. 常见问题排查

网关未配置:

openclaw onboard --install-daemon

网关未启动:

openclaw gateway restart

获取带令牌的仪表盘 URL:

openclaw dashboard

    令牌

    令牌在openclaw.json文件下,该文件在~/.openclaw目录下

    欢迎来到XiaoZou123,这里是一个电脑极客、数码爱好者网站。我平时喜欢关注数码新闻,研究计算机技术。如果你看我头像觉得我是二次元,那我其实还算不上!
    最后更新于 2026-05-03