基于Linux+Docker NAT的Ollama多实例负载均衡部署

一、ollama的简介

Ollama 是开源、跨平台的本地大模型运行管理工具,可以在自己电脑 / 服务器离线跑开源大模型(Llama3、通义千问 Qwen、DeepSeek、Mistral、LLaVA 多模态等),不用联网调用第三方 AI 接口,数据留在本机。

通俗类比:大模型界的 Docker,把下载、加载、显存调度、GGUF 量化封装好,一条命令拉起模型,不用手动编译配置复杂环境博客园。

核心特点:

  • **本地离线运行,隐私可控:**所有对话数据不会上传云端,适合处理敏感文档、内网私有化部署。
  • 极简命令行操作
  • 自带 HTTP API(默认端口 11434):启动服务后提供兼容 OpenAI 格式接口,可被 Python、LangChain、RAG 知识库、前端程序调用:
  • 跨平台:支持 Windows /macOS/ Linux,也提供 Docker 镜像;自动识别 NVIDIA、AMD、Apple Metal 显卡加速,低配电脑也能跑量化后的小模型
  • 支持多模态与自定义模型:LLaVA 等模型可以识图;通过Modelfile导入本地 GGUF 模型、自定义系统提示词、修改参数,制作专属模型稀土掘金

注意:默认只监听本机 127.0.0.1,如果修改配置对外暴露端口,不做认证会存在未授权访问风险,不要直接公网开放

它能做什么?

  1. 个人电脑本地私有 AI 聊天、写代码、文档总结;
  2. 内网服务器私有化部署大模型,搭建企业本地 AI 助手;
  3. 开发调试 RAG 知识库、AI 智能体,对接程序 API;
  4. 离线环境使用大模型,不依赖互联网。

❗容易混淆的两点

  1. Ollama 本身不是大模型,只是运行框架;模型需要单独下载(GGUF 格式);
  2. 和 ChatGPT / 文心一言区别:后者是云端在线服务;Ollama 是自己本地托管开源模型

二、在rhel9上的部署

2.1环境架构

  • 系统环境:RHEL 9.x(兼容Rocky Linux 9、AlmaLinux 9)

  • 网络模式:Docker NAT网络(容器私有网段,宿主端口映射对外访问)

  • 架构模式:1台负载均衡节点 + 多台Ollama服务节点(单节点多容器亦可)

  • 负载均衡方式:Nginx七层HTTP负载均衡,完美兼容Ollama流式推理、零模块报错

  • 服务端口:Ollama默认11434,Nginx对外统一接入端口11434

2.2前置条件

  • 所有服务器RHEL9系统已初始化、网络互通、可联网拉取镜像

  • 服务器关闭/放行防火墙端口,关闭SELinux或配置放行策略

  • 服务器时间同步,主机名唯一,无端口冲突

  • 硬件资源满足模型运行需求(建议单节点8C16G起步,GPU可选)

2.3系统环境初始化

2.3.1关闭SELinux

bash 复制代码
setenforce 0

永久关闭(重启后生效)

bash 复制代码
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

2.3.2防火墙放行端口

bash 复制代码
# 放行Ollama端口、Nginx端口
firewall-cmd --permanent --add-port=11434/tcp
firewall-cmd --reload

2.3.3安装基础依赖

bash 复制代码
dnf install -y dnf-utils device-mapper-persistent-data lvm2 wget curl tar

2.3.4安装Docker

bash 复制代码
dnf install -y docker-ce docker-ce-cli containerd.io
# 启动并开机自启
systemctl start docker
systemctl enable docker
# 验证Docker状态
docker info

2.3.5配置Docker国内的镜像加速,防止拉取镜像时超时和源解析失败

创建Docker镜像加速配置文件

bash 复制代码
# 创建docker daemon配置目录
mkdir -p /etc/docker
# 替换为当前可用、稳定的Docker加速源(修复源解析失败问题)
cat > /etc/docker/daemon.json << EOF
{
  "registry-mirrors": [
    "https://docker.1ms.run",
    "https://docker.xuanyuan.me"
  ],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "3"
  }
}
EOF

重新配置并重启Docker生效

bash 复制代码
# 重载Docker配置
systemctl daemon-reload
# 重启Docker服务
systemctl restart docker
# 开机自启保持不变
systemctl enable docker

查看镜像加速配置是否生效

bash 复制代码
docker info | grep -A 10 "Registry Mirrors"

生效标准:输出内容包含上述配置的国内加速地址,即为配置成功。

2.4部署Ollama容器服务

2.4.1创建Docker专属NAT网络(统一网段)

为保证所有Ollama容器在统一NAT网段,自定义bridge网络:

bash 复制代码
# 创建自定义NAT网络
docker network create ollama-nat
# 查看网络信息,确认NAT网段
docker network ls
docker network inspect ollama-nat

2.4.2启动Ollama容器实例

先前置拉取Ollama镜像(规避首次run自动拉取超时问题),再启动容器。单节点可部署多个容器(端口差异化映射),多节点单容器即可,统一加入ollama-nat网络:

bash 复制代码
# 前置拉取最新ollama镜像
docker pull ollama/ollama

第一个Ollama实例

bash 复制代码
docker run -d \
  --name ollama-01 \
  --network ollama-nat \
  -p 21434:11434 \
  --memory 16g \
  --memory-swap 20g \
  -v /data/ollama/models:/root/.ollama/models \
  -e OLLAMA_HOST=0.0.0.0 \
  -e OLLAMA_NUM_PARALLEL=1 \
  -e OLLAMA_THREADS=8 \
  -e OLLAMA_NO_WARMUP=true \
  --restart always \
  ollama/ollama
  1. docker run -d
  • run:创建并启动新容器

  • -d后台守护进程运行,不占用终端,退出终端服务不中断

  1. --name ollama-01
  • 给容器命名为 ollama-01

  • 方便后续精准管理:启停、查看日志、拉模型、负载均衡识别

  1. --network ollama-nat
  • 将容器接入自定义 Docker NAT 隔离网桥

  • 容器处于私有内网,不直接暴露公网,安全合规,统一网段方便 Nginx 代理转发

  1. -p 21434:11434
  • 端口映射格式:宿主机端口:容器内部端口

  • 容器内固定端口 11434

  • 宿主机使用 21434 差异化端口

  • 彻底规避 Nginx 11434 端口冲突

  1. --memory 16g
  • 限制容器最大物理内存 16G

  • 防止 Qwen2.5-7B 大模型独占整机内存、导致系统卡死

  1. --memory-swap 20g
  • 允许内存 + 交换分区总上限 20G

  • 解决大模型加载内存不足、静默退出、加载中断问题

  1. -v /data/ollama/models:/root/.ollama/models 持久化核心
  • 目录挂载:将宿主机模型目录挂载到容器内部模型目录

  • 作用 :模型下载后永久保存在宿主机,删除容器、重启容器无需重新拉取模型

  1. -e OLLAMA_HOST=0.0.0.0
  • 设置 Ollama 监听所有网卡

  • 允许 Nginx、内网其他机器访问容器服务,不限制本地回环

  1. -e OLLAMA_NUM_PARALLEL=1
  • 限制单容器同时只处理 1 个推理任务

  • 避免多并发抢占资源导致模型卡死、超时、无输出

  1. -e OLLAMA_THREADS=8
  • 设置模型推理线程数为 8,提升加载与推理速度

  • 解决默认线程过少、加载超慢被客户端断开的问题

  1. -e OLLAMA_NO_WARMUP=true 解决 499 报错关键
  • 关闭模型预热机制

  • 之前报错 warming up the model、client closed、加载被中止 就是预热导致

  • 直接跳过预热,杜绝加载未完成被中断、卡死、无响应

  1. --restart always
  • 容器永久开机自启、故障自动重启

  • 适配生产高可用,宕机、重启服务器自动恢复服务

  1. ollama/ollama
  • 指定基于官方 ollama/ollama 镜像启动容器

单节点多实例部署(第二个实例)

bash 复制代码
# 第二个实例:统一生产级参数,完全一致保证负载均衡一致性
docker run -d \
  --name ollama-02 \
  --network ollama-nat \
  -p 21435:11434 \
  --memory 16g \
  --memory-swap 20g \
  -v /data/ollama/models:/root/.ollama/models \
  -e OLLAMA_HOST=0.0.0.0 \
  -e OLLAMA_NUM_PARALLEL=1 \
  -e OLLAMA_THREADS=8 \
  -e OLLAMA_NO_WARMUP=true \
  --restart always \
  ollama/ollama

2.4.3验证容器运行状态

bash 复制代码
# 查看容器是否正常运行
docker ps | grep ollama
# 测试后端容器原生接口(绕过Nginx,必须有输出)
curl http://172.25.254.5:21434/api/version
curl http://172.25.254.5:21435/api/version

效果如下

2.4.4拉取模型(所有Ollama节点统一模型)

bash 复制代码
# 优先拉取轻量测试模型(验证环境可用性,避免7B卡死)
docker exec -it ollama-01 ollama pull tinyllama
docker exec -it ollama-02 ollama pull tinyllama

# 轻量模型验证通过后,再拉取业务大模型
docker exec -it ollama-01 ollama pull qwen2.5:7b
docker exec -it ollama-02 ollama pull qwen2.5:7b

# 验证模型
docker exec -it ollama-01 ollama list

2.5Nginx负载均衡配置

2.5.1安装Nginx

bash 复制代码
# 安装epel扩展源
dnf install epel-release -y
# 安装Nginx
dnf install nginx -y
# 开机自启
systemctl enable nginx

2.5.2配置Nginx七层HTTP负载均衡

采用HTTP七层负载均衡。Ollama所有API、对话、模型推理均标准HTTP接口,七层代理完全兼容、稳定性更强、RHEL9零兼容问题,生产通用最优解。

bash 复制代码
vim /etc/nginx/nginx.conf
http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 4096;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;
    
    # 后端Ollama集群负载池(双实例轮询分发)
    upstream ollama_backend {
        server 127.0.0.1:21434;
        server 127.0.0.1:21435;

    }

    # Ollama大模型专属负载均衡服务配置
    server {
        listen 11434;        # 监听Ollama标准端口,统一对外服务入口
        server_name _;       # 内网无域名适配,匹配所有IP请求,规避域名报错

        location / {
            # 所有请求转发至Ollama后端集群,实现轮询负载、故障容错
            proxy_pass http://ollama_backend;

            # 透传客户端真实请求信息,保障后端日志正常记录、接口正常解析
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            # 适配大模型长推理超时

            # 超时全局调优:适配大模型慢速加载、长时推理场景
            proxy_connect_timeout 120s;    # 延长连接超时,避免模型加载未完成被499中断
            proxy_send_timeout 600s;       # 防止长文本推理过程中空闲断连
            proxy_read_timeout 600s;       # 解决默认超时导致的推理卡死、空白无输出

            # 流式推理核心优化:适配Ollama SSE实时输出
            proxy_buffering off;           # 关闭响应缓冲,实现逐字实时推送
            proxy_cache off;               # 关闭缓存,避免动态推理结果错乱冲突
            proxy_http_version 1.1;        # 启用HTTP1.1,支持长连接传输
            proxy_set_header Connection "";# 清空连接头,维持长连接,杜绝中途断连
        }

    }

2.5.3校验配置并启动Nginx

bash 复制代码
# 校验Nginx配置语法
nginx -t
# 启动Nginx
systemctl start nginx

2.6整体服务验证

2.6.1负载均衡接口验证

bash 复制代码
# 查看版本信息(短连接测试)
curl http://172.25.254.5:11434/api/version

# 模型推理测试(关键:增加 stream:false 解决空白无输出问题)
curl http://172.25.254.5:11434/api/generate \
-d '{"model":"qwen2.5:7b","prompt":"你好","stream":false}'

效果如下

2.6.2负载分发验证

访问5次

查看容器实时日志

bash 复制代码
docker logs -f ollama-01
bash 复制代码
docker logs -f ollama-02

2.7NAT网络架构说明

  • 网络隔离性:所有Ollama容器运行在Docker NAT私有网段(172.17.0.0/16),不直接暴露公网,仅通过宿主机端口映射对外提供服务,安全性更高。

  • 通信逻辑:客户端请求→Nginx负载节点(公网/内网IP)→NAT端口转发→后端Ollama容器,全程基于NAT地址转换实现通信。

  • 扩容便捷:新增Ollama节点/容器时,仅需部署容器、拉取模型,在Nginx upstream中添加节点地址即可完成扩容。

2.8开机自启与高可用保障

2.8.1服务自启

  • Docker、Nginx已配置开机自启

  • Ollama容器添加--restart always策略,异常自动重启

2.8.2故障自愈

Nginx默认自动剔除故障节点,某台Ollama容器/节点宕机后,请求自动分发至正常节点,恢复后自动重新加入集群。

2.9日常运维命令

bash 复制代码
# 查看Ollama容器状态
docker ps | grep ollama
# 重启Ollama容器
docker restart ollama-01 ollama-02
# 重启Nginx负载均衡
systemctl restart nginx
# 查看Nginx访问日志
tail -f /var/log/nginx/access.log
# 新增后端节点后重载配置
nginx -t && systemctl reload nginx

三、常见问题排查

3.1端口访问超时

排查防火墙端口是否放行、SELinux是否关闭、Docker端口映射是否正常。

3.2模型调用失败

典型报错:client connection closed before llama-server finished loading、499超时、llama-server start canceled。根因:模型预热加载未完成被客户端中断、默认线程数过少、内存不足导致加载超时终止。解决方案:关闭模型预热、加大线程与内存、初始化完成后再访问、优先轻量模型验证。

相关推荐
流光D19 分钟前
AI时代,搭建 web 站点并配置 nginx 反向代理流程
运维·服务器·前端·人工智能·nginx·ai·ai编程
GreatVicent22 分钟前
AI Agent互操作标准化加速:A2A协议正式加入Linux基金会
linux·运维·人工智能·agent·aws·a2a
Huangjin007_1 小时前
【Linux 系统篇(十六)】进程(四) : 僵尸进程、孤儿进程、进程优先级
linux·运维·服务器
cui_hao_nan1 小时前
Git常用命令1
运维·git
瞬间&永恒~1 小时前
【Kubernetes】(十五)维护与升级、ETCD 备份和恢复
linux·运维·docker·云原生·kubernetes
LlmCraft|大模型工程实践1 小时前
12. Docker 日志管理与监控:ELK 日志收集 + Prometheus 性能监控
elk·docker·prometheus
姚永强1 小时前
gitlab安装
运维·gitlab
希望奇迹很安静1 小时前
Linux基本使用命令
linux·运维·服务器
姚永强2 小时前
安装Jenkins
运维·jenkins