Clawdbot+Qwen3-32B详细步骤:8080端口代理至18789网关的Nginx配置详解
1. 为什么需要这层代理:搞懂Clawdbot与Qwen3-32B的协作逻辑
你可能已经试过直接用Ollama跑Qwen3-32B,也装好了Clawdbot聊天界面,但打开网页却提示“连接失败”或“超时”。这不是模型没起来,也不是前端崩了——而是它们之间缺了一座桥。
Clawdbot本身不直接调用本地Ollama服务,它默认通过HTTP请求访问一个统一的API网关地址。而你的Qwen3-32B模型正安静地运行在本机http://localhost:11434/api/chat(Ollama默认端口),这个地址对外不可达,也不符合Clawdbot预设的请求路径结构。
所以,我们需要做三件事:
- 把Ollama的原始API接口“包装”成Clawdbot能认的格式;
- 把内部服务暴露到一个固定、可预测的端口(比如8080);
- 再让这个8080端口被反向代理到最终对外服务的网关端口18789——这样无论Clawdbot从前端发什么请求,后端都能准确路由、转换、转发、响应。
这不是多此一举,而是私有部署中保障安全、统一入口、便于监控和灰度发布的标准做法。
整个链路是这样的:
Clawdbot前端 → Nginx(监听18789) → Nginx内部重写 → 代理到localhost:8080 → 8080服务做路径适配 → 转发给Ollama(localhost:11434)
下面我们就一步步把这座桥搭稳。
2. 环境准备与服务就位:先确认每一块砖都在
在动Nginx之前,请确保以下四个组件已正常运行且可互相访问:
2.1 Ollama服务:Qwen3-32B必须已加载并响应
打开终端,执行:
ollama list你应该看到类似输出:
NAME ID SIZE MODIFIED qwen3:32b abc123... 21.4 GB 2 hours ago再验证API是否通:
curl -X POST http://localhost:11434/api/chat \ -H "Content-Type: application/json" \ -d '{ "model": "qwen3:32b", "messages": [{"role": "user", "content": "你好"}], "stream": false }'如果返回包含"message":{"role":"assistant","content":"..."}的JSON,说明Ollama已就绪。
注意:不要跳过这步。很多后续问题其实源于模型未真正加载成功,或Ollama监听地址被修改(如绑定了127.0.0.1以外的IP)。
2.2 Clawdbot前端:静态资源已部署完成
Clawdbot通常以纯前端方式运行(无需Node.js后端)。你只需用任意HTTP服务器托管其dist/目录即可。例如用Python快速起一个:
cd /path/to/clawdbot/dist python3 -m http.server 8000然后访问http://localhost:8000,应能看到聊天界面。此时若点击发送,控制台会报错:Failed to fetch http://localhost:18789/v1/chat/completions—— 这正是我们要用Nginx解决的问题。
2.3 8080端口服务:轻量级适配层(推荐用Caddy或简易Node脚本)
我们不需要复杂后端。一个50行以内的Node.js脚本就能完成路径重写与Header透传:
// adapter.js const http = require('http'); const url = require('url'); const { ClientRequest, request } = require('http'); const OLLAMA_HOST = 'http://localhost:11434'; const server = http.createServer((req, res) => { const parsedUrl = url.parse(req.url, true); // 将 /v1/chat/completions → /api/chat let targetPath = req.url; if (req.url.startsWith('/v1/chat/completions')) { targetPath = '/api/chat'; } else if (req.url.startsWith('/v1/models')) { targetPath = '/api/tags'; } const options = { method: req.method, hostname: 'localhost', port: 11434, path: targetPath, headers: { 'Content-Type': req.headers['content-type'] || 'application/json', 'Accept': req.headers.accept || 'application/json', } }; const proxyReq = request(options, (proxyRes) => { res.writeHead(proxyRes.statusCode, proxyRes.headers); proxyRes.pipe(res); }); proxyReq.on('error', (err) => { console.error('Proxy error:', err); res.writeHead(502, { 'Content-Type': 'text/plain' }); res.end('Bad Gateway'); }); if (req.method !== 'GET' && req.method !== 'HEAD') { req.pipe(proxyReq); } else { proxyReq.end(); } }); server.listen(8080, () => { console.log(' Adapter running on http://localhost:8080'); });保存为adapter.js,安装依赖并启动:
npm init -y node adapter.js现在访问curl http://localhost:8080/api/chat应该和直接调Ollama一致;而curl http://localhost:8080/v1/chat/completions也会被正确转成/api/chat并返回结果。
验证小技巧:用浏览器打开
http://localhost:8080/v1/models,应返回Ollama中所有模型列表(JSON格式),说明适配层工作正常。
2.4 端口可用性检查:确认18789未被占用
运行以下命令,确保18789端口空闲:
lsof -i :18789 # macOS / Linux # 或 netstat -ano | findstr :18789 # Windows若无输出,说明端口可用;若有进程占着,记下PID并kill -9 <PID>释放。
3. Nginx核心配置:从零写出可落地的18789网关
这是全文最关键的一步。我们不贴完整nginx.conf,而是聚焦最小可行配置块,逐行解释作用,并给出可直接复制粘贴的代码。
3.1 创建独立配置文件(推荐做法)
不要修改nginx.conf主文件,新建一个:
sudo nano /etc/nginx/conf.d/clawdbot-qwen3.conf填入以下内容(已去除所有注释,仅保留生效行):
upstream qwen3_backend { server 127.0.0.1:8080; } server { listen 18789 ssl http2; server_name _; # SSL证书(若用HTTPS,否则删掉ssl相关行) # ssl_certificate /path/to/fullchain.pem; # ssl_certificate_key /path/to/privkey.pem; # ssl_protocols TLSv1.2 TLSv1.3; # ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256; location /v1/ { proxy_pass http://qwen3_backend/; 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_buffering off; proxy_cache off; proxy_redirect off; client_max_body_size 100M; } location / { add_header Content-Type text/html; return 200 "<h1>Clawdbot + Qwen3-32B Gateway Active</h1><p> Port 18789 is ready.</p>"; } }关键点说明:
upstream定义后端服务池,这里只有一台127.0.0.1:8080,即我们上一步写的适配器;location /v1/是Clawdbot实际发起请求的路径前缀,必须精确匹配;proxy_pass http://qwen3_backend/;结尾的/至关重要:它表示去除/v1/前缀后再转发,否则请求会变成http://localhost:8080/v1//api/chat,导致404;proxy_buffering off和proxy_cache off是必须项,避免流式响应(如Chat SSE)被Nginx缓存截断;client_max_body_size 100M支持大文本输入(Qwen3-32B支持长上下文,别卡在这里)。
3.2 启用配置并热重载Nginx
# 检查语法 sudo nginx -t # 若输出 successful,则重载 sudo nginx -s reload没有报错即代表配置已生效。
3.3 快速验证网关是否通
打开新终端,执行:
curl -v http://localhost:18789/v1/models你应该看到:
- HTTP状态码
200 OK - 响应体为JSON,包含
"models"数组,每个元素含name、modified_at等字段
再试一次流式请求(模拟Clawdbot真实行为):
curl -X POST http://localhost:18789/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "qwen3:32b", "messages": [{"role": "user", "content": "用一句话介绍你自己"}], "stream": true }'如果返回一连串SSE格式的data: {...}事件,说明整条链路——从18789网关,经8080适配器,到底层Ollama——全部打通。
4. Clawdbot前端配置:告诉它该找谁要答案
Clawdbot不会自动猜网关地址。你需要手动修改它的配置文件(通常是src/config.ts或构建前的环境变量)。
4.1 修改API基础地址
找到Clawdbot项目中的API配置位置,将默认的https://api.openai.com/v1替换为你的网关地址:
// src/config.ts 示例 export const API_CONFIG = { baseUrl: 'http://localhost:18789', // ← 关键!指向你的Nginx网关 apiKey: '', // 无需密钥(私有部署) model: 'qwen3:32b', };如果你用的是构建后部署的dist/版本,也可以在HTML中注入:
<!-- 在 dist/index.html 的 <head> 中添加 --> <script> window.CLAWD_CONFIG = { API_BASE_URL: 'http://localhost:18789' }; </script>4.2 重新构建或刷新页面
- 若你本地开发,运行
npm run build重新打包; - 若已部署静态文件,清空浏览器缓存后刷新
http://localhost:8000。
此时打开浏览器开发者工具(F12),切换到Network标签页,发送一条消息。你应该看到:
- 请求URL为
http://localhost:18789/v1/chat/completions - 状态码为
200 - Response Preview中滚动出现Qwen3-32B的流式回答
恭喜,Clawdbot已成功驱动Qwen3-32B,且全程走通18789网关。
5. 常见问题排查:比报错信息更早发现问题
即使按步骤操作,也可能遇到“看似通了实则卡住”的情况。以下是高频陷阱与对应解法:
5.1 请求卡在pending,无响应
现象:前端发送后,Network里请求一直pending,几秒后变failed。
原因:Nginx未开启proxy_buffering off,或Ollama未启用stream支持。
解法:
- 检查Nginx配置中
location /v1/块内是否有proxy_buffering off; - 确保Ollama版本 ≥ 0.3.10(旧版对stream支持不完善),升级命令:
ollama upgrade - 在curl测试时加
-N参数禁用curl缓冲:curl -N -X POST ...
5.2 返回404,但路径看起来没错
现象:curl http://localhost:18789/v1/models返回404,但curl http://localhost:8080/api/tags正常。
原因:Nginxproxy_pass末尾少了/,导致路径未剥离。
解法:
- 错误写法:
proxy_pass http://qwen3_backend;(无结尾/) - 正确写法:
proxy_pass http://qwen3_backend/;(有结尾/) - 修改后务必
sudo nginx -s reload
5.3 中文乱码或emoji显示为
现象:返回的中文是方块或问号。
原因:Nginx未声明UTF-8编码。
解法:在server块内添加:
charset utf-8;5.4 Clawdbot提示“Network Error”,但curl能通
现象:浏览器报错,但终端curl一切正常。
原因:浏览器同源策略拦截,或Clawdbot前端硬编码了HTTPS协议。
解法:
- 确保Clawdbot访问地址与API地址协议一致(都用
http://,不要混用https://); - 若需HTTPS,务必配置SSL证书(见3.1中注释部分),并确保证书受信任;
- 检查Clawdbot代码中是否强制拼接了
https://前缀,改为相对协议://localhost:18789
6. 进阶建议:让这套组合更稳定、更易维护
完成基础部署只是开始。以下是经过生产环境验证的优化建议:
6.1 用systemd守护8080适配器
避免手动启停,创建服务文件:
sudo nano /etc/systemd/system/clawdbot-adapter.service[Unit] Description=Clawdbot Qwen3 Adapter After=network.target [Service] Type=simple User=your_username WorkingDirectory=/path/to/adapter ExecStart=/usr/bin/node adapter.js Restart=always RestartSec=10 StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target启用服务:
sudo systemctl daemon-reload sudo systemctl enable clawdbot-adapter sudo systemctl start clawdbot-adapter6.2 Nginx日志分级记录
在clawdbot-qwen3.conf的server块中添加:
access_log /var/log/nginx/clawdbot-qwen3-access.log main; error_log /var/log/nginx/clawdbot-qwen3-error.log warn;便于后续分析请求量、错误类型、响应延迟。
6.3 为不同模型预留扩展空间
当前只对接Qwen3-32B,但未来可能加入Qwen2.5、GLM-4等。建议将upstream改造成动态:
map $http_host $backend { default "127.0.0.1:8080"; "~*qwen3\." "127.0.0.1:8080"; "~*glm4\." "127.0.0.1:8081"; } upstream qwen3_backend { server $backend; }配合DNS或Hosts文件,实现模型路由隔离。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。