Chapter 10

生产部署与安全

将 Ollama 从开发环境推向生产环境的完整指南。涵盖局域网访问配置、Nginx 反向代理、HTTPS 加密、API 认证、systemd 服务管理、Prometheus 监控,以及与 n8n、Dify 等自动化平台的集成。

暴露到局域网

默认情况下,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 基础设施。