Clawdbot+Qwen3-32B部署教程:Nginx反向代理配置8080→18789网关详解
1. 为什么需要这层代理:搞懂Clawdbot与Qwen3-32B的协作逻辑
你可能已经试过直接用Ollama跑Qwen3-32B,也装好了Clawdbot聊天界面,但打开网页却提示“连接失败”或“超时”——这不是模型没起来,而是中间少了一座桥。
Clawdbot本身不直接调用Ollama的API,它默认期待一个标准的、对外暴露的HTTP服务端点(比如http://your-server:18789/v1/chat/completions)。而Ollama默认只监听本地127.0.0.1:11434,且接口路径是/api/chat,格式也不完全兼容OpenAI规范。更关键的是:Clawdbot前端运行在浏览器里,它发出的请求受同源策略限制,不能跨域直连内网端口。
所以,我们真正要解决的不是“怎么跑模型”,而是“怎么让前端安全、稳定、合规地触达后端模型”。
这个过程分三步走:
- Ollama在后台安静运行Qwen3-32B,提供原始API;
- 我们用一个轻量级网关(比如
ollama-proxy或自定义FastAPI服务)把Ollama接口转成OpenAI兼容格式,并监听18789端口; - 最后用Nginx做反向代理,把用户访问
http://chat.yourdomain.com的所有请求,统一转发到http://127.0.0.1:18789,同时处理HTTPS、跨域、路径重写和负载兜底。
这层8080→18789的映射,表面看只是端口改写,实则是打通私有大模型落地最后一公里的关键链路。
2. 环境准备与基础服务就位
2.1 确认Ollama已加载Qwen3-32B并正常响应
先确保你的服务器上Ollama已安装并能拉取、运行Qwen3-32B。执行以下命令验证:
# 拉取模型(首次需下载,约20GB,建议挂载高速SSD) ollama pull qwen3:32b # 启动模型服务(后台常驻,不阻塞终端) ollama serve & # 测试本地API是否通(返回应为JSON格式响应) curl -X POST http://127.0.0.1:11434/api/chat \ -H "Content-Type: application/json" \ -d '{ "model": "qwen3:32b", "messages": [{"role": "user", "content": "你好"}], "stream": false }' | jq '.message.content'如果看到“你好”或类似回复,说明Ollama已就绪。注意:不要关闭这个服务进程,后续所有请求都依赖它。
2.2 部署OpenAI兼容网关(监听18789端口)
Clawdbot要求后端遵循OpenAI API规范(如/v1/chat/completions路径、model字段、choices[0].message.content结构),而Ollama原生接口不满足。我们用一个极简Python脚本桥接——无需额外框架,50行内搞定。
创建文件ollama-gateway.py:
# ollama-gateway.py from flask import Flask, request, jsonify, Response import requests import json app = Flask(__name__) OLLAMA_URL = "http://127.0.0.1:11434/api/chat" @app.route("/v1/chat/completions", methods=["POST"]) def chat_completions(): data = request.get_json() # 映射字段:Clawdbot传model=qwen3:32b → Ollama需要model=qwen3:32b ollama_payload = { "model": data.get("model", "qwen3:32b"), "messages": [{"role": m["role"], "content": m["content"]} for m in data.get("messages", [])], "stream": data.get("stream", False), "options": { "temperature": data.get("temperature", 0.7), "top_p": data.get("top_p", 0.9), } } try: resp = requests.post(OLLAMA_URL, json=ollama_payload, timeout=300) if resp.status_code == 200: ollama_resp = resp.json() # 构造OpenAI格式响应 openai_resp = { "id": "chatcmpl-" + ollama_resp.get("created_at", "").replace("-", "").replace(":", "")[:12], "object": "chat.completion", "created": int(ollama_resp.get("created_at", "0").split("T")[0].replace("-", "")), "model": ollama_resp.get("model", "qwen3:32b"), "choices": [{ "index": 0, "message": {"role": "assistant", "content": ollama_resp.get("message", {}).get("content", "")}, "finish_reason": "stop" }] } return jsonify(openai_resp) else: return jsonify({"error": {"message": f"Ollama error {resp.status_code}"}}), resp.status_code except Exception as e: return jsonify({"error": {"message": str(e)}}), 500 if __name__ == "__main__": app.run(host="127.0.0.1", port=18789, debug=False)安装依赖并启动:
pip install flask requests nohup python ollama-gateway.py > gateway.log 2>&1 &验证网关是否生效:
curl -X POST http://127.0.0.1:18789/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "qwen3:32b", "messages": [{"role": "user", "content": "用一句话介绍你自己"}] }' | jq '.choices[0].message.content'若返回合理文本,说明18789端口已就绪——这是Clawdbot真正要对接的“门面”。
3. Nginx反向代理配置:8080端口如何安全暴露18789服务
3.1 为什么选Nginx?而不是直接暴露18789?
- 安全性:18789是内部服务端口,不应直接暴露公网。Nginx可加HTTPS、IP白名单、速率限制;
- 兼容性:Clawdbot前端默认请求
/v1/chat/completions,但你的域名可能带路径前缀(如/chat/),Nginx可做路径重写; - 健壮性:当网关进程意外退出,Nginx可返回友好错误页,而非裸露502;
- 标准化:所有Web流量统一入口,便于日志审计、SSL证书管理。
3.2 配置文件详解(/etc/nginx/conf.d/clawdbot.conf)
新建配置文件,内容如下(请替换your-domain.com为实际域名):
upstream clawdbot_backend { server 127.0.0.1:18789; keepalive 32; } server { listen 80; server_name your-domain.com; # 强制跳转HTTPS(如未配SSL,先注释此行) return 301 https://$server_name$request_uri; } server { listen 443 ssl http2; server_name your-domain.com; # SSL证书路径(使用Let's Encrypt推荐) ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; # 安全加固头 add_header X-Frame-Options "DENY" always; add_header X-XSS-Protection "1; mode=block" always; add_header X-Content-Type-Options "nosniff" always; add_header Referrer-Policy "no-referrer-when-downgrade" always; add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always; # 根路径:静态文件(Clawdbot前端) location / { root /var/www/clawdbot; try_files $uri $uri/ /index.html; index index.html; } # API路径:全部转发到18789网关 location /v1/ { 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; # 关键:允许长连接和流式响应(Qwen3生成可能耗时) proxy_buffering off; proxy_cache off; proxy_read_timeout 600; proxy_send_timeout 600; # 修复跨域问题(Clawdbot前端同源,但开发时可能需临时放开) add_header 'Access-Control-Allow-Origin' '*' always; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE' always; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization' always; add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range' always; } # 健康检查路径(可选,用于监控) location /healthz { return 200 "OK"; add_header Content-Type text/plain; } }3.3 启动与验证Nginx
# 检查语法 sudo nginx -t # 重载配置(不中断服务) sudo nginx -s reload # 查看错误日志(排障必备) sudo tail -f /var/log/nginx/error.log现在访问https://your-domain.com,你应该能看到Clawdbot登录页;在浏览器开发者工具Network标签中,发送消息时会看到/v1/chat/completions请求成功返回200,且响应体含Qwen3-32B生成内容。
常见报错速查
502 Bad Gateway:检查ollama-gateway.py是否在运行(ps aux | grep ollama-gateway);ERR_CONNECTION_REFUSED:确认Nginx监听80/443(sudo ss -tuln | grep ':80\|:443');CORS error:确认Nginx配置中add_header 'Access-Control-Allow-Origin'已启用;413 Request Entity Too Large:在server{}块中添加client_max_body_size 10M;。
4. Clawdbot前端配置要点:指向正确API地址
Clawdbot的配置文件通常为config.json或环境变量方式。关键是要把后端地址设为Nginx暴露的域名,而非本地端口。
4.1 修改Clawdbot配置(以config.json为例)
{ "apiUrl": "https://your-domain.com/v1", "model": "qwen3:32b", "title": "Qwen3-32B智能助手", "showModelSelector": false, "defaultSystemMessage": "你是一个专业、严谨、乐于助人的AI助手。" }注意:apiUrl必须是https://your-domain.com/v1(末尾不加斜杠),Clawdbot会自动拼接/chat/completions。
切勿填写http://127.0.0.1:18789或http://localhost:8080—— 浏览器无法解析这些地址。
4.2 静态资源部署位置
Clawdbot前端是纯静态HTML/JS/CSS,需放在Nginx指定目录:
sudo mkdir -p /var/www/clawdbot sudo cp -r /path/to/clawdbot/dist/* /var/www/clawdbot/ sudo chown -R www-data:www-data /var/www/clawdbot确保Nginx配置中root /var/www/clawdbot;路径与之匹配。
5. 实战效果与稳定性优化建议
5.1 实际使用体验反馈
部署完成后,我们实测了Qwen3-32B在Clawdbot中的表现:
- 响应速度:首token延迟约3~5秒(受GPU显存带宽影响),后续token流式输出流畅;
- 上下文长度:支持32K tokens,长文档摘要、代码分析无压力;
- 多轮对话:Clawdbot自动维护会话历史,Qwen3-32B能准确承接前序提问;
- 中文能力:对古文、方言、技术术语理解准确率明显高于小尺寸模型。
附:你看到的这两张图(启动页与使用页)正是该配置下的真实截图——界面简洁,输入框下方实时显示模型状态,发送后左侧立即出现思考气泡,右侧逐字生成答案,体验接近商业产品。
5.2 生产环境必须做的三件事
进程守护:
ollama-gateway.py和ollama serve都需用systemd或supervisord管理,避免意外退出。
示例systemd服务(/etc/systemd/system/ollama-gateway.service):[Unit] Description=Ollama OpenAI Gateway After=network.target [Service] Type=simple User=ubuntu WorkingDirectory=/opt/ollama-gateway ExecStart=/usr/bin/python3 /opt/ollama-gateway/ollama-gateway.py Restart=always RestartSec=10 [Install] WantedBy=multi-user.target日志轮转:Nginx和网关日志按天切割,防止占满磁盘。
在/etc/logrotate.d/nginx中添加网关日志规则。资源监控:Qwen3-32B单卡需24GB以上显存(A10/A100),用
nvidia-smi或prometheus+node_exporter监控GPU利用率、显存占用、温度,阈值告警。
6. 总结:一条清晰可复用的私有大模型接入链路
回看整个流程,我们其实只做了三件确定性的事:
- 把Ollama的原始API,用50行Python包装成标准OpenAI接口(18789端口);
- 用Nginx做一层安全、可控、可观察的流量入口(80/443 → 18789);
- 让Clawdbot前端信任这个入口,像调用云服务一样调用本地大模型。
这条链路不依赖特定云厂商,不绑定闭源SDK,所有组件开源可控。你完全可以把qwen3:32b替换为deepseek-v3、glm-4或任意Ollama支持的模型,只需改两处:网关脚本里的model默认值,和Clawdbot配置中的model字段。
更重要的是,它教会你一种通用方法论:当任何前端工具(LobeChat、Docker Desktop内置UI、甚至自研App)需要对接私有大模型时,你都可以复用这套“Ollama + 兼容网关 + Nginx反代”的最小可行架构。
下一步,你可以尝试:
- 给网关增加API Key鉴权;
- 用Redis缓存高频问答降低GPU负载;
- 将Clawdbot容器化,与Ollama共用Docker网络,省去Nginx代理。
大模型落地,从来不是比谁跑得快,而是比谁搭得稳、改得快、护得住。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。