暴露到局域网
默认情况下,Ollama 只监听 127.0.0.1:11434(本机访问)。要让局域网内的其他设备也能使用,需要修改监听地址:
# 方式一:临时(命令行启动时设置)
OLLAMA_HOST=0.0.0.0:11434 ollama serve
# 方式二:macOS 持久化(系统偏好设置 → 隐私与安全 → 或修改 LaunchAgent)
# 编辑 Ollama 的 plist 文件
cat /Library/LaunchDaemons/com.ollama.ollama.plist # 查看当前配置
# 更简单的方式:在 ~/.ollama/config 中设置(需新版本支持)
# 或在 .zshrc / .bashrc 添加环境变量后重启 Ollama 服务
# 方式三:Linux systemd(推荐,持久化)
sudo systemctl edit ollama.service
# 在弹出的编辑器中添加:
# [Service]
# Environment="OLLAMA_HOST=0.0.0.0:11434"
sudo systemctl daemon-reload
sudo systemctl restart ollama
# 验证:从另一台设备访问
curl http://192.168.1.100:11434/api/tags
# 记得在防火墙开放 11434 端口
# Linux 防火墙配置
sudo ufw allow 11434/tcp # UFW
sudo firewall-cmd --permanent --add-port=11434/tcp # firewalld
安全警告:不要将 Ollama 直接暴露到公网
Ollama 默认没有任何认证机制,直接暴露到公网意味着任何人都可以免费使用你的算力、下载/删除你的模型。局域网内部访问问题不大,但如果需要外网访问,必须在前面加一层 Nginx + 认证层。
Nginx 反向代理与 HTTPS
# 安装 Nginx 和 Certbot
sudo apt install nginx certbot python3-certbot-nginx # Ubuntu/Debian
brew install nginx certbot # macOS
# 申请免费 SSL 证书(需要域名)
sudo certbot --nginx -d ollama.yourdomain.com
# /etc/nginx/sites-available/ollama
server {
listen 443 ssl;
server_name ollama.yourdomain.com;
# SSL 证书(由 Certbot 自动填充)
ssl_certificate /etc/letsencrypt/live/ollama.yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ollama.yourdomain.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
# Basic Auth 认证(简单有效)
auth_basic "Ollama API";
auth_basic_user_file /etc/nginx/.htpasswd;
# 超时配置(流式响应需要较长超时)
proxy_read_timeout 300s;
proxy_send_timeout 300s;
location / {
proxy_pass http://127.0.0.1:11434;
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_buffering off;
proxy_cache off;
}
}
server {
listen 80;
server_name ollama.yourdomain.com;
return 301 https://$server_name$request_uri; # HTTP 重定向到 HTTPS
}
# 创建 Basic Auth 密码文件
sudo apt install apache2-utils # 提供 htpasswd 命令
sudo htpasswd -c /etc/nginx/.htpasswd yourusername
# 输入密码后生成加密密码文件
# 启用配置并重启
sudo ln -s /etc/nginx/sites-available/ollama /etc/nginx/sites-enabled/
sudo nginx -t # 测试配置语法
sudo systemctl reload nginx
# 测试认证后的访问
curl -u yourusername:yourpassword https://ollama.yourdomain.com/api/tags
systemd 服务配置(Linux)
# /etc/systemd/system/ollama.service
# 完整的生产级 Ollama 服务配置
[Unit]
Description=Ollama Service
After=network-online.target
Wants=network-online.target
[Service]
ExecStart=/usr/local/bin/ollama serve
User=ollama
Group=ollama
Restart=always
RestartSec=3
# 环境变量
Environment=OLLAMA_MODELS=/data/ollama/models
Environment=OLLAMA_HOST=127.0.0.1:11434
Environment=OLLAMA_MAX_LOADED_MODELS=2
Environment=OLLAMA_KEEP_ALIVE=5m
Environment=OLLAMA_NUM_PARALLEL=4
# 资源限制
LimitNOFILE=65535 ; 最大打开文件数
[Install]
WantedBy=multi-user.target
# 创建 ollama 用户(专用非 root 账号)
sudo useradd -r -s /bin/false -m -d /home/ollama ollama
# 安装服务
sudo systemctl daemon-reload
sudo systemctl enable ollama # 开机自启
sudo systemctl start ollama
sudo systemctl status ollama
# 查看日志
sudo journalctl -u ollama -f # 实时日志
sudo journalctl -u ollama --since "1 hour ago"
Docker 生产部署
# docker-compose.prod.yml — 生产级配置
version: '3.8'
services:
ollama:
image: ollama/ollama:latest
container_name: ollama-prod
restart: always
ports:
- "127.0.0.1:11434:11434" # 只绑定本机,不暴露到网络
volumes:
- /data/ollama:/root/.ollama # 挂载到持久化磁盘
environment:
- OLLAMA_MAX_LOADED_MODELS=2
- OLLAMA_KEEP_ALIVE=10m
- OLLAMA_NUM_PARALLEL=4
deploy:
resources:
limits:
memory: 32G # 限制最大内存使用
cpus: '8' # 限制 CPU 核数
reservations:
memory: 8G # 保证至少 8G
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:11434/"]
interval: 30s
timeout: 10s
retries: 3
logging:
driver: json-file
options:
max-size: "100m"
max-file: "5"
Prometheus 监控与 Grafana
"""
ollama_exporter.py — 简易 Prometheus 指标导出器
将 Ollama API 的健康数据转换为 Prometheus 指标
"""
from prometheus_client import start_http_server, Gauge, Counter
import requests
import time
# 定义指标
LOADED_MODELS = Gauge("ollama_loaded_models", "当前加载到内存的模型数")
TOTAL_MODELS = Gauge("ollama_total_models", "已安装的模型总数")
SERVICE_UP = Gauge("ollama_up", "Ollama 服务是否运行(1=运行,0=宕机)")
def collect_metrics():
"""从 Ollama API 收集指标数据。"""
try:
# 健康检查
health = requests.get("http://localhost:11434/", timeout=3)
SERVICE_UP.set(1 if health.status_code == 200 else 0)
# 已安装模型数
tags = requests.get("http://localhost:11434/api/tags", timeout=5)
TOTAL_MODELS.set(len(tags.json().get("models", [])))
# 已加载模型数
ps = requests.get("http://localhost:11434/api/ps", timeout=5)
LOADED_MODELS.set(len(ps.json().get("models", [])))
except Exception as e:
SERVICE_UP.set(0)
print(f"采集失败: {e}")
if __name__ == "__main__":
start_http_server(9091) # 在 9091 端口提供 /metrics
print("Ollama Exporter 已启动,指标地址:http://localhost:9091/metrics")
while True:
collect_metrics()
time.sleep(15) # 每 15 秒采集一次
与 n8n 自动化平台集成
n8n 是一个开源工作流自动化工具,与 Ollama 结合可创建强大的 AI 自动化流程:
# 启动 n8n(Docker)
docker run -d \
--name n8n \
-p 5678:5678 \
-v n8n_data:/home/node/.n8n \
-e N8N_HOST=localhost \
docker.n8n.io/n8nio/n8n
# 访问 http://localhost:5678
# 在 n8n 中配置 Ollama 节点:
# 1. 添加 "HTTP Request" 节点
# 2. Method: POST
# 3. URL: http://host.docker.internal:11434/api/chat
# (从 Docker 容器访问宿主机的 Ollama)
# 4. Body:
# {
# "model": "qwen2.5:7b",
# "messages": [{"role":"user","content":"{{ $json.userInput }}"}],
# "stream": false
# }
# 5. 取响应中的 message.content 字段
# Dify 本地部署并连接 Ollama
# 访问 https://github.com/langgenius/dify 按说明部署
# 在 Dify 设置 → 模型提供商 → 添加 Ollama
# 服务地址填:http://host.docker.internal:11434
生产安全清单
部署到生产前必须确认:1. Ollama 监听在 127.0.0.1(不直接暴露);2. Nginx 前置代理启用了认证(Basic Auth 或 JWT);3. 启用了 HTTPS(禁止明文传输 API 密钥);4. 设置了请求速率限制(防止滥用);5. Docker 容器设置了内存上限(防止 OOM 影响其他服务);6. 定期备份 Ollama 模型目录。
全书总结
恭喜完成 Ollama 本地大模型部署教程!核心要点回顾:安装一条命令搞定(Chapter 1)→ 模型选型与管理(Chapter 2)→ Modelfile 定制(Chapter 3)→ CLI 批量自动化(Chapter 4)→ REST API 集成(Chapter 5)→ Python 深度集成(Chapter 6)→ 本地 RAG 知识库(Chapter 7)→ Open WebUI 图形界面(Chapter 8)→ GPU 性能优化(Chapter 9)→ 生产安全部署(Chapter 10)。从这里出发,你已拥有完全私有的本地 AI 基础设施。