news 2026/4/28 10:57:01

Clawdbot+Qwen3-32B详细步骤:8080端口代理至18789网关的Nginx配置详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Clawdbot+Qwen3-32B详细步骤:8080端口代理至18789网关的Nginx配置详解

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 offproxy_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"数组,每个元素含namemodified_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-adapter

6.2 Nginx日志分级记录

clawdbot-qwen3.confserver块中添加:

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星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 11:54:21

USB OTG的智能切换:从硬件ID信号到软件控制的深度解析

USB OTG智能切换技术&#xff1a;从硬件信号到软件控制的全面解析 在移动设备和嵌入式系统领域&#xff0c;USB OTG&#xff08;On-The-Go&#xff09;技术已经成为实现设备间直接通信的关键。想象一下这样的场景&#xff1a;你的智能手机可以直接连接U盘读取文件&#xff0c;或…

作者头像 李华
网站建设 2026/4/27 18:37:02

TypeScript 高级类型技巧:解决索引签名问题

引言 在使用 TypeScript 开发过程中,类型系统的强大之处在于它能在编译时就捕捉到许多潜在的错误。然而,有时我们会遇到一些类型检查的难题,尤其是当涉及到复杂的联合类型(Union Types)和索引签名时。本文将通过一个具体的实例,展示如何解决 TypeScript 中的索引签名问题…

作者头像 李华
网站建设 2026/4/27 2:00:03

如何让安卓手机焕发第二春:LineageOS全流程指南

如何让安卓手机焕发第二春&#xff1a;LineageOS全流程指南 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 旧设备升级和系统优化是延长电子设备生命周期的关键。本文将详…

作者头像 李华
网站建设 2026/4/23 19:43:42

3步打造家庭游戏串流系统:无缝体验多设备同步游戏乐趣

3步打造家庭游戏串流系统&#xff1a;无缝体验多设备同步游戏乐趣 【免费下载链接】Sunshine Sunshine: Sunshine是一个自托管的游戏流媒体服务器&#xff0c;支持通过Moonlight在各种设备上进行低延迟的游戏串流。 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshi…

作者头像 李华