NewAPI整合Ollama本地大模型公网调用
为什么要用NewAPI包装Ollama再发布公网
Ollama默认只监听本地地址(127.0.0.1:11434),直接改成0.0.0.0虽然能开放端口,但缺少身份验证、频率限制、日志审计等能力。NewAPI作为一个轻量API网关,可以给Ollama添加API Key鉴权、请求限流、访问日志,还能统一管理多个模型端点。
适合需要把本地大模型安全地提供给外网应用(如小程序、Web服务)调用的场景。
环境准备:安装Ollama与NewAPI
1. 安装Ollama(如果还未安装)
在Ubuntu/Debian上执行:
curl -fsSL https://ollama.com/install.sh | sh
安装完成后拉取一个模型(例如llama3.2:1b)作为测试:
ollama pull llama3.2:1b
ollama serve # 确保服务运行在11434端口
2. 部署NewAPI
推荐使用Docker部署,快速且隔离。
新建docker-compose.yml:
version: '3.8'
services:
newapi:
image: newapi/newapi:latest
container_name: newapi
ports:
- "3000:3000"
volumes:
- ./newapi_data:/app/data
environment:
- SQL_DSN=newapi.db
restart: always
启动:
docker-compose up -d
访问http://服务器IP:3000,首次设置管理员账号。
配置NewAPI对接本地Ollama
登录NewAPI后台,进入渠道管理 -> 添加渠道。
- 类型选择 Ollama
- 名称随便填(如“本地Ollama”)
- 地址填写
http://宿主机IP:11434(如果NewAPI与Ollama在同一台机器,可以用Docker内网地址,但建议用宿主机IP避免解析问题) - 模型列表手动添加你拉取的模型名(例如
llama3.2:1b) - API Key暂时留空,因为Ollama本身无鉴权
- 保存后回到令牌管理,创建一个新令牌,设置过期时间和额度,这个令牌就是将来公网调用的凭证。
部署后立即测试:
# 假设令牌为 sk-test123
curl http://服务器IP:3000/v1/chat/completions \
-H "Authorization: Bearer sk-test123" \
-H "Content-Type: application/json" \
-d '{"model": "llama3.2:1b", "messages": [{"role": "user", "content": "你好"}]}' \
--insecure
得到正常JSON响应则说明内网联通。
公网发布:域名、反向代理与安全设置
内网测试通过后,需要把NewAPI端口(3000)暴露到公网。强烈建议不要直接映射端口到公网,而是使用Nginx反代并开启HTTPS。
1. 配置Nginx反向代理(假设已有域名api.example.com)
server {
listen 443 ssl;
server_name api.example.com;
ssl_certificate /path/to/ssl.pem;
ssl_certificate_key /path/to/ssl.key;
location / {
proxy_pass http://127.0.0.1:3000;
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;
}
}
重启Nginx,并通过https://api.example.com访问。
2. 安全加固要点
- 在NewAPI后台开启IP白名单(如果调用源固定)
- 设置合理的速率限制(如每分钟60次)
- 定期轮换API Key并设置过期时间
- 不要泄露管理后台地址(可在Nginx层限制内网IP访问管理路径)
效果验证与高频问题解答
验证公网调用
从任意地方(比如另一台服务器)执行:
curl https://api.example.com/v1/chat/completions \
-H "Authorization: Bearer sk-你的令牌" \
-H "Content-Type: application/json" \
-d '{"model": "llama3.2:1b", "messages": [{"role": "user", "content": "1+1=?"}]}'
如果返回包含"content":"2"的JSON,则公网调用成功。
常见问题
Q:NewAPI报“channel not found”或“model not available”?
A:检查渠道配置中模型列表是否准确,必须与ollama list输出的模型名称完全一致(含标签)。
Q:公网访问返回502?
A:检查NewAPI容器是否正常,Nginx反代地址是否正确;如果是Docker部署的NewAPI,proxy_pass应指向宿主机IP而非127.0.0.1。
Q:如何让NewAPI也支持流式输出?
A:默认支持,只需在请求中添加stream: true参数,确保Nginx关闭缓冲(proxy_buffering off)。
Q:Ollama需要开启公网端口吗?
A:不需要,Ollama仍然只监听本地,NewAPI在内网桥接即可。
如果你在整合过程中遇到其他异常,建议先检查NewAPI日志(docker logs newapi)和Ollama日志,重点排查渠道地址与鉴权参数。
按照本文步骤操作,零基础也能快速跑通NewAPI整合Ollama本地大模型的公网调用。