Clawdbot+Qwen3:32B保姆级教程:Web网关配置、HTTPS反向代理与CORS设置
1. 为什么需要这套组合:从本地模型到可用聊天平台
你可能已经成功用Ollama跑起了Qwen3:32B,也试过curl调用它的API,但很快会发现一个问题:直接暴露Ollama的3000端口不安全,前端网页访问会遇到跨域错误,想用域名访问还得手动处理HTTP/HTTPS,更别说要让团队同事或客户也能稳定使用了。
Clawdbot就是为解决这类“最后一公里”问题而生的——它不是另一个大模型,而是一个轻量、专注、可配置的Web网关层。它把Qwen3:32B这样的后端模型“包装”成一个真正能上线的Chat平台:统一入口、自动处理HTTPS、智能转发请求、精准控制跨域策略,还能加基础认证和日志追踪。
这篇文章不讲模型原理,也不比参数性能,只聚焦一件事:手把手带你把本地跑起来的Qwen3:32B,变成一个带域名、有HTTPS、能被网页直连、不报CORS错误的可用聊天服务。全程基于真实部署流程,每一步都可验证、可回退、可复现。
2. 环境准备与基础服务启动
2.1 前置条件确认
请确保以下三项已就绪(缺一不可):
- Linux服务器一台(推荐Ubuntu 22.04或Debian 12,x86_64架构,内存≥32GB,显存≥24GB用于Qwen3:32B推理)
- Docker 24.0+ 已安装并可执行
docker run - 域名一个(如
chat.yourcompany.com),已解析到该服务器IP;若仅内网测试,可用localhost或局域网IP替代,但HTTPS部分需额外生成自签名证书
注意:本教程默认你已在服务器上通过
ollama run qwen3:32b成功加载模型,并确认其API可访问:curl http://localhost:11434/api/chat -H "Content-Type: application/json" \ -d '{"model":"qwen3:32b","messages":[{"role":"user","content":"你好"}]}'若返回JSON响应且含
"done": true,说明Ollama服务正常。
2.2 启动Qwen3:32B服务(固定端口模式)
Ollama默认监听127.0.0.1:11434,但Clawdbot需通过网络访问,因此需显式绑定到0.0.0.0:
# 停止已有Ollama服务(如有) sudo systemctl stop ollama # 以指定端口启动Ollama(后台常驻) OLLAMA_HOST=0.0.0.0:11434 nohup ollama serve > /var/log/ollama.log 2>&1 &验证是否生效:
curl http://localhost:11434/health # 应返回 {"status":"ok"}2.3 获取并运行Clawdbot网关镜像
Clawdbot提供预编译Docker镜像,无需构建:
# 拉取最新稳定版(v0.8.2) docker pull ghcr.io/clawdbot/clawdbot:0.8.2 # 创建配置目录 mkdir -p ~/clawdbot/config ~/clawdbot/logs # 启动容器(关键:映射8080→18789,这是Clawdbot默认网关端口) docker run -d \ --name clawdbot \ --restart=unless-stopped \ -p 18789:8080 \ -v ~/clawdbot/config:/app/config \ -v ~/clawdbot/logs:/app/logs \ -e CLAWDBOT_MODEL_URL="http://host.docker.internal:11434" \ -e CLAWDBOT_MODEL_NAME="qwen3:32b" \ ghcr.io/clawdbot/clawdbot:0.8.2注意
host.docker.internal是Docker Desktop在Mac/Windows的写法;Linux服务器需替换为宿主机真实IP(如192.168.1.100)或改用--network host模式:# Linux推荐方式(省去IP硬编码) docker run -d --network host --name clawdbot ... ghcr.io/clawdbot/clawdbot:0.8.2
等待30秒后检查:
curl http://localhost:18789/health # 返回 {"status":"ok","model":"qwen3:32b"}此时,Clawdbot已作为代理网关运行在18789端口,它会把所有请求转发给http://localhost:11434上的Qwen3:32B。
3. Web网关核心配置详解
3.1 配置文件结构与关键字段
Clawdbot使用YAML格式配置,位于~/clawdbot/config/config.yaml。首次启动时会自动生成默认文件,我们只需修改以下几处:
# ~/clawdbot/config/config.yaml server: port: 8080 # 容器内监听端口(固定,勿改) host: "0.0.0.0" model: url: "http://host.docker.internal:11434" # 实际模型API地址 name: "qwen3:32b" timeout: 300 # 请求超时(秒),大模型建议设高些 cors: enabled: true origins: - "https://chat.yourcompany.com" - "http://localhost:3000" - "http://127.0.0.1:5173" methods: ["GET", "POST", "OPTIONS"] headers: ["Content-Type", "Authorization", "X-Requested-With"] auth: enabled: false # 生产环境建议开启,此处先关闭便于调试小贴士:
origins列表必须包含你前端页面的实际来源协议+域名+端口。开发时加localhost,上线时只留正式域名,避免宽泛通配符(如*)导致安全风险。
保存后重启容器使配置生效:
docker restart clawdbot3.2 验证CORS设置是否生效
用浏览器打开开发者工具(F12),在Console中执行:
fetch('http://your-server-ip:18789/v1/chat/completions', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ model: 'qwen3:32b', messages: [{ role: 'user', content: '你好' }] }) }) .then(r => r.json()) .then(console.log)若返回结果且无CORS error红字,说明配置成功。若仍报错,请检查:
origins中是否漏写http://或https://- 浏览器地址栏URL是否与
origins完全一致(包括端口) - 是否误将
enabled: false写成false(YAML对缩进和布尔值敏感)
4. Nginx HTTPS反向代理实战配置
4.1 安装与基础Nginx
sudo apt update && sudo apt install -y nginx certbot python3-certbot-nginx sudo ufw allow 'Nginx Full' # 开放80/443端口4.2 创建反向代理配置文件
新建/etc/nginx/sites-available/chat-proxy:
# /etc/nginx/sites-available/chat-proxy upstream clawdbot_backend { server 127.0.0.1:18789; } server { listen 80; server_name chat.yourcompany.com; # 强制HTTPS跳转 return 301 https://$server_name$request_uri; } server { listen 443 ssl http2; server_name chat.yourcompany.com; # SSL证书(由certbot自动生成) ssl_certificate /etc/letsencrypt/live/chat.yourcompany.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/chat.yourcompany.com/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # 关键:代理到Clawdbot网关 location / { proxy_pass http://clawdbot_backend; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; 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_buffering on; proxy_buffer_size 128k; proxy_buffers 4 256k; proxy_busy_buffers_size 256k; } # API专用路径(如需独立监控) location /api/ { proxy_pass http://clawdbot_backend/api/; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }启用配置:
sudo ln -sf /etc/nginx/sites-available/chat-proxy /etc/nginx/sites-enabled/ sudo nginx -t && sudo systemctl reload nginx4.3 自动申请并续期SSL证书
# 申请证书(确保域名DNS已解析) sudo certbot --nginx -d chat.yourcompany.com # 测试自动续期(无输出即成功) sudo certbot renew --dry-run此时,访问https://chat.yourcompany.com即可看到Clawdbot默认欢迎页,且所有请求均走HTTPS加密通道。
5. 前端集成与生产就绪检查
5.1 前端调用示例(React/Vue通用)
Clawdbot兼容OpenAI标准API格式,前端可直接复用现有SDK:
// 使用openai npm包(v4+) import { OpenAI } from "openai"; const openai = new OpenAI({ baseURL: "https://chat.yourcompany.com/v1", // 注意:/v1结尾 apiKey: "dummy-key", // Clawdbot不校验key,填任意非空字符串即可 }); const stream = await openai.chat.completions.create({ model: "qwen3:32b", messages: [{ role: "user", content: "用中文写一首关于春天的五言绝句" }], stream: true, }); for await (const chunk of stream) { console.log(chunk.choices[0]?.delta?.content || ""); }验证要点:
baseURL必须是HTTPS且带/v1路径apiKey可任意填写(Clawdbot默认关闭鉴权)- 浏览器Network面板中,请求应显示
200 OK且Response Headers含access-control-allow-origin
5.2 生产环境加固建议
| 项目 | 推荐操作 | 说明 |
|---|---|---|
| 身份认证 | 启用Clawdbot Basic Auth | 在config.yaml中设auth.enabled: true,并配置auth.username/password,前端请求头加Authorization: Basic xxx |
| 速率限制 | 配置Nginxlimit_req | 防止单IP暴力请求,保护后端模型资源 |
| 日志审计 | 挂载~/clawdbot/logs并定期归档 | 查看access.log和error.log定位异常请求 |
| 模型卸载 | 设置OllamaOLLAMA_KEEP_ALIVE=5m | 避免模型常驻内存,按需加载释放显存 |
6. 常见问题排查指南
6.1 “Connection refused” 错误
- 现象:
curl http://localhost:18789/health返回Failed to connect - 检查步骤:
docker ps | grep clawdbot确认容器正在运行docker logs clawdbot查看启动日志,重点找Starting server on :8080或failed to connect to model- 若日志报
connection refused to model,检查CLAWDBOT_MODEL_URL是否指向正确IP和端口,且Ollama确实在监听该地址
6.2 CORS依然报错
- 典型原因:前端请求URL与
config.yaml中cors.origins不完全匹配 - 快速验证:临时将
origins改为["*"](仅测试用),若成功则证明是域名匹配问题 - 修复方法:确保
origins中每个条目都包含完整协议+域名+端口,且无多余空格
6.3 HTTPS页面无法加载模型响应
- 现象:页面能打开,但发送消息后无响应,Network中请求状态为
(pending) - 原因:Nginx未正确传递
Upgrade和Connection头,导致WebSocket升级失败 - 修复:确认
/etc/nginx/sites-available/chat-proxy中location /块内包含以下三行:proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_http_version 1.1;
7. 总结:你已拥有一套企业级AI聊天基础设施
回顾整个过程,你完成了三件关键事:
- 打通模型链路:让Qwen3:32B这个庞然大物,通过Ollama标准化API,被Clawdbot稳定接入;
- 构建安全网关:用Nginx实现HTTPS终结、反向代理、流量缓冲,屏蔽所有底层复杂性;
- 开放前端接口:通过精准CORS配置,让任何网页都能安全、合规地调用你的私有大模型。
这不是一个玩具Demo,而是一套可立即投入使用的AI服务骨架。下一步,你可以:
- 把Clawdbot配置接入Git版本管理,实现配置即代码(GitOps)
- 为不同业务线配置多个子域名(如
sales.chat.yourcompany.com、support.chat.yourcompany.com),共享同一Qwen3:32B实例 - 在Clawdbot前再加一层Kong或Traefik,实现灰度发布和A/B测试
真正的AI落地,从来不在模型多大,而在管道多稳、接口多简、体验多顺。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。