本地大模型部署实战——Ollama + Open WebUI 的完整企业内网部署
本地大模型部署实战——Ollama + Open WebUI 的完整企业内网部署
适读人群:运维工程师、有内网部署需求的技术团队 | 阅读时长:约18分钟 | 核心价值:完整的企业内网私有大模型部署方案,从安装到生产就绪
去年有个朋友在一家军工单位做信息化,找我咨询本地大模型部署。他们的网络完全隔离,既不能用 OpenAI,也不能用任何云服务 API,但业务上急需 AI 辅助。
这种场景越来越多:金融、医疗、政府、军工,数据不能出局域网,但又需要 AI 能力。
Ollama + Open WebUI 是目前最成熟的本地部署方案。这篇文章把完整的企业内网部署流程走一遍。
方案架构
用户浏览器
↓(HTTP)
Open WebUI(:3000) ← 用户界面,用户管理,API 代理
↓(HTTP)
Ollama(:11434) ← 模型管理,推理引擎
↓
GPU / CPU ← 实际运行模型可选扩展:
- 多 Ollama 节点负载均衡(多 GPU 机器)
- Nginx 反向代理 + SSL
- LDAP/SSO 集成
服务器要求
最低配置(轻量使用):
- CPU:8核
- RAM:32GB
- GPU:NVIDIA GPU,8GB 显存(跑 7B 模型)
- 存储:500GB SSD
推荐配置(中等规模):
- CPU:16核
- RAM:64GB
- GPU:NVIDIA RTX 3090/4090 (24GB) 或 A4000 (16GB)
- 存储:2TB NVMe SSD
大规模部署:
- A100 80GB 可跑 70B 模型
- 多张 GPU 可并行服务多用户
安装 Ollama
Linux 服务器:
# 安装 Ollama
curl -fsSL https://ollama.com/install.sh | sh
# 离线环境:下载安装包手动安装
# 从另一台机器下载:https://github.com/ollama/ollama/releases
# 传到内网服务器后:
tar -xzf ollama-linux-amd64.tgz -C /usr/local/bin/
chmod +x /usr/local/bin/ollama
# 配置为系统服务
cat > /etc/systemd/system/ollama.service << 'EOF'
[Unit]
Description=Ollama Service
After=network-online.target
[Service]
ExecStart=/usr/local/bin/ollama serve
User=ollama
Group=ollama
Restart=always
RestartSec=3
Environment="OLLAMA_HOST=0.0.0.0:11434"
Environment="OLLAMA_MODELS=/data/ollama/models" # 模型存储路径,建议大磁盘
[Install]
WantedBy=default.target
EOF
# 创建用户和目录
useradd -r -s /bin/false -U -m -d /usr/share/ollama ollama
mkdir -p /data/ollama/models
chown -R ollama:ollama /data/ollama
# 启动服务
systemctl daemon-reload
systemctl enable ollama
systemctl start ollama
systemctl status ollama下载模型(有网环境):
# 常用模型推荐
ollama pull qwen2.5:7b # 通义千问,中文最好,7B版约4.7GB
ollama pull qwen2.5:14b # 14B版,效果更好,约9GB
ollama pull deepseek-r1:7b # DeepSeek推理模型,7B
ollama pull llama3.2:3b # Meta Llama3,英文强,小模型
ollama pull nomic-embed-text # Embedding模型,用于RAG
# 查看已下载的模型
ollama list离线环境迁移模型(重要):
# 在有网机器上,打包模型文件
# Ollama 模型存储在 ~/.ollama/models/(Linux/Mac)
# 或 C:\Users\xxx\.ollama\models(Windows)
# 打包
tar -czf qwen2.5-7b-model.tar.gz ~/.ollama/models/
# 传到内网服务器后解压到 OLLAMA_MODELS 目录
tar -xzf qwen2.5-7b-model.tar.gz -C /data/ollama/
# 然后 ollama list 就能看到模型安装 Open WebUI
Docker 方式(推荐):
# 如果内网没有 Docker Hub,先在外网拉取镜像再打包传入
# 外网:
docker pull ghcr.io/open-webui/open-webui:main
docker save ghcr.io/open-webui/open-webui:main > open-webui.tar
# 内网:
docker load < open-webui.tar
# 启动 Open WebUI
docker run -d \
--name open-webui \
--restart always \
-p 3000:8080 \
-v /data/open-webui:/app/backend/data \
-e OLLAMA_BASE_URL=http://host-ip:11434 \
-e WEBUI_SECRET_KEY=your-very-long-random-secret-key \
-e WEBUI_AUTH=true \
ghcr.io/open-webui/open-webui:mainDocker Compose 方式(更易管理):
# docker-compose.yml
version: '3.8'
services:
open-webui:
image: ghcr.io/open-webui/open-webui:main
container_name: open-webui
restart: unless-stopped
ports:
- "3000:8080"
volumes:
- /data/open-webui:/app/backend/data
environment:
- OLLAMA_BASE_URL=http://ollama:11434
- WEBUI_SECRET_KEY=${WEBUI_SECRET_KEY}
- WEBUI_AUTH=true
- ENABLE_SIGNUP=false # 企业环境关闭注册,由管理员创建账号
- DEFAULT_MODELS=qwen2.5:7b
- ADMIN_EMAIL=admin@yourcompany.com
networks:
- ai-network
# 可选:如果 Ollama 也用 Docker 管理
ollama:
image: ollama/ollama
container_name: ollama
restart: unless-stopped
ports:
- "11434:11434"
volumes:
- /data/ollama:/root/.ollama
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
networks:
- ai-network
networks:
ai-network:
driver: bridgeNginx 反向代理 + SSL
# /etc/nginx/sites-available/ai.yourcompany.com
server {
listen 443 ssl http2;
server_name ai.yourcompany.com;
ssl_certificate /etc/ssl/certs/yourcompany.crt;
ssl_certificate_key /etc/ssl/private/yourcompany.key;
# 安全头
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
# 限制只有内网访问
allow 192.168.0.0/16; # 内网 IP 段
allow 10.0.0.0/8;
deny all;
location / {
proxy_pass http://localhost:3000;
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_buffering off;
proxy_cache off;
# 超时配置(长对话需要)
proxy_read_timeout 300s;
proxy_connect_timeout 30s;
}
}
server {
listen 80;
server_name ai.yourcompany.com;
return 301 https://$host$request_uri;
}踩坑实录
坑一:模型运行但响应极慢
现象:安装成功,能对话,但每次回复都要等 30 秒以上,不实用。
原因:没有 GPU,或者 GPU 没有正确被 Ollama 使用,在用 CPU 推理。7B 模型 CPU 推理速度大概 2-5 tokens/秒,基本不可用。
排查:
# 查看 Ollama 是否识别到 GPU
ollama show --license qwen2.5:7b 2>/dev/null
# 或者查看推理时的 GPU 占用
nvidia-smi # 推理时 GPU 利用率应该飙高解法:
# 确认安装了 CUDA 驱动
nvidia-smi # 能看到 GPU 信息
# 确认安装了 CUDA toolkit(Ollama 需要)
nvcc --version
# 重新安装 Ollama(会自动检测 CUDA)
curl -fsSL https://ollama.com/install.sh | sh坑二:模型文件损坏,响应乱码
现象:下载的模型对话输出全是乱码或重复字符。
原因:模型文件传输时损坏(比如用 FTP 二进制模式错误传输)。
解法:传输前后校验 MD5:
# 发送方
md5sum qwen2.5-7b-model.tar.gz > qwen2.5-7b-model.tar.gz.md5
# 接收方验证
md5sum -c qwen2.5-7b-model.tar.gz.md5
# 输出 OK 才解压,FAILED 则重新传输坑三:Open WebUI 无法保持登录状态
现象:用户登录后过一会儿就自动退出,需要反复登录。
原因:WEBUI_SECRET_KEY 没有固定值,每次容器重启都生成新的,导致之前签发的 Session Token 失效。
解法:
# 生成一个固定的强密钥
openssl rand -hex 32
# 输出:a4f2c9e1b8d3f76...
# 在 docker-compose.yml 里固定设置,或通过 .env 文件管理
WEBUI_SECRET_KEY=a4f2c9e1b8d3f76...(你生成的随机值)多节点负载均衡(进阶)
如果单机满足不了并发需求:
upstream ollama_backend {
least_conn; # 最少连接数策略
server ollama-node1:11434 weight=2; # 双卡机器权重2
server ollama-node2:11434 weight=1;
keepalive 32;
}
server {
location /api/ {
proxy_pass http://ollama_backend;
}
}Open WebUI 配置多个 Ollama 端点:
- 在 Open WebUI 管理后台 → Connections 里添加多个 Ollama URL
- 可以给不同 URL 分配不同模型
生产监控
# 基础监控脚本(crontab 每分钟执行)
#!/bin/bash
# check-ollama.sh
# 检查 Ollama 服务
if ! curl -s http://localhost:11434/api/version > /dev/null; then
systemctl restart ollama
echo "$(date): Ollama 重启" >> /var/log/ollama-monitor.log
fi
# 检查 GPU 显存使用
GPU_MEM=$(nvidia-smi --query-gpu=memory.used --format=csv,noheader,nounits)
if [ "$GPU_MEM" -gt 20000 ]; then # 超过 20GB 告警
echo "$(date): GPU 显存告警: ${GPU_MEM}MB" >> /var/log/ollama-monitor.log
fi总结
Ollama + Open WebUI 是目前内网部署大模型最成熟的方案:
- Ollama 解决模型管理和推理引擎
- Open WebUI 解决用户界面和权限管理
- Nginx 解决安全访问和 SSL
关键要点:
- GPU 配置正确才有实用速度,CPU 推理基本不可用
- 离线环境传输模型要校验完整性
- 企业环境关闭注册,用管理员统一创建账号
- 生产环境一定要设固定
WEBUI_SECRET_KEY
模型能力评估:选对模型很重要
内网部署之后,面对的第一个实际问题是:给哪个模型用?Ollama 上有几十个模型,不能乱选。
下面是针对企业常见场景的模型推荐,基于我实测的结果:
中文问答/客服类场景: 首选 qwen2.5:7b 或 qwen2.5:14b,通义千问是目前开源模型里中文体验最好的。7B 模型需要约 8GB 显存,14B 需要约 10GB 显存。如果只有 8GB 显存的显卡,用 7B;有 24GB 的,上 14B,效果明显更好。
代码辅助类场景:qwen2.5-coder:7b 是专门的代码模型,比通用的 qwen2.5 在代码生成上强不少。如果预算够,qwen2.5-coder:32b 是目前开源代码模型的天花板,需要 2 张 24GB 显卡或 1 张 48GB 以上的专业卡。
文档摘要/长文本类场景:llama3.1:8b 或 llama3.2:3b,这两个对英文长文档的处理很好,如果你的业务文档主要是英文,可以考虑。
Embedding(用于 RAG):nomic-embed-text 是目前 Ollama 上综合性能最好的 Embedding 模型,768 维,速度快,中英文都支持。
实测速度参考(RTX 3090,24GB):
| 模型 | 响应速度(tokens/s) | 体感 |
|---|---|---|
| qwen2.5:7b | 35-45 | 流畅 |
| qwen2.5:14b | 18-25 | 可用 |
| qwen2.5:32b | 8-12 | 稍慢 |
| deepseek-r1:7b | 20-30 | 可用(推理模式更慢) |
Open WebUI 的企业配置
Open WebUI 默认是面向个人用户设计的,企业部署需要调整几个配置。
用户管理:
企业环境里,不应该让所有人都能自己注册账号。关闭注册,由管理员统一创建账号并分配角色:
在 Open WebUI 管理界面(Settings → Admin → Users):
- 关闭 Enable Community Sharing
- 关闭 Enable New Sign Ups
- 启用 Require Email Confirmation
模型访问控制:
不同部门可能需要不同的模型权限。比如研发部门能访问代码模型,客服部门只能访问客服模型。
Open WebUI 支持按用户组分配模型访问权限,在 Model 设置里可以指定哪些用户/组可以使用该模型。
使用量监控:
企业环境需要监控各部门的 AI 使用情况,方便做成本分摊和容量规划。Open WebUI 的 Analytics 功能提供了基本的使用统计,也可以通过 Prometheus 接口集成到你的监控系统。
常见性能问题排查
问题:响应很慢,但 GPU 利用率只有 20%
可能原因:批量推理配置不对,或者 KV Cache 内存不足导致频繁换入换出。
检查 Ollama 的 CUDA 配置:
# 查看 Ollama 的实际 GPU 使用情况
ollama ps
# 输出:
# NAME ID SIZE PROCESSOR UNTIL
# qwen2.5:7b xxx 5.0 GB 100% GPU 永久如果 PROCESSOR 显示的不是 100% GPU,而是 CPU 或者百分比很低,说明模型没有完全在 GPU 上运行,需要检查显存是否足够。
问题:并发请求时后面的请求要等很久
Ollama 默认是串行处理请求的(一次只处理一个),要开启并发推理:
# 设置并发推理数(根据显存和模型大小调整)
export OLLAMA_NUM_PARALLEL=4
# 也可以在 systemd 服务里配置
Environment="OLLAMA_NUM_PARALLEL=4"注意:开启并发会增加每个请求的单独延迟(共享 GPU 资源),但整体吞吐量提高。对于多用户场景,并发优于串行。
