最近在公司内网搭了一套私有大模型服务,最终选型就是 CentOS7 + Ollama。这个组合看起来简单,网上教程也不少,但真正操作一遍才发现,坑全埋在一些不起眼的细节里:官方脚本下载慢到怀疑人生、systemd 里端口改了不生效、SELinux 半路出来挡一刀、模型存储目录被系统盘撑爆……这篇文章不打算复述官网 README,而是按照我自己实际部署的完整流程来写,从安装、验证、自定义端口到国内环境下的模型加速下载,最后把踩过的坑和排查思路一并整理出来,希望对要在 CentOS7 上折腾 Ollama 的你有点帮助。
1. 部署前的三个判断
1.1 为什么选 Ollama,不选其他部署方案
先聊清楚一个问题:CentOS7 上要跑本地私有大模型,可选方案其实不少,比如直接用 Python + Transformers 加载模型、用 vLLM 做服务化推理、或者用 Docker 跑各种现成镜像。我最终选 Ollama,核心原因是它把“模型管理”和“服务化推理”这两件事做了很好的封装。
简单说,Ollama 是一个大模型运行时,负责模型下载、存储、加载和推理服务,对外提供 REST API。你不需要手动处理 CUDA 环境、模型文件格式转换、显存调度这些琐碎细节,一条命令就能拉模型、跑对话,这一点在内网快速交付 demo 时非常关键。
它还有个优势是接口兼容 OpenAI 格式,也就是说,现有接入了 OpenAI API 的应用,只要改一下 base_url,就能直接切到本地 Ollama 服务,省去一大堆适配工作。相比之下,vLLM 性能更强,但配置文件、启动参数、量化格式的处理门槛明显更高;Transformers 直连则更适合做研究实验,不适合长期稳定提供服务。
1.2 硬件和系统要求,提前确认清楚
Ollama 官方对 Linux 的要求不算苛刻,但 CentOS7 属于“能用但需要小心”的系统。先说说版本问题,Ollama 二进制要求 GLIBC_2.17 以上,CentOS7 的 glibc 版本恰好是 2.17,所以理论上合格。实际操作中,如果你下载的是最新版,某些动态库版本可能更敏感,遇到version GLIBC_2.18 not found这类报错,说明二进制太新,需要换旧版本安装包,或者升级系统组件。
硬件方面,主要看你要跑多大模型。我的建议直接一条经验值:纯 CPU 环境下跑 7B 参数的量化模型(Q4),内存至少 16G,推理速度大约每秒几个 token,做个对话 demo 没问题;如果要跑 13B 以上,内存起步 32G,而且要有足够耐心。有 N 卡的话,显存尽量 8G 以上,能跑 7B 模型,加载后大约占用 5-6G 显存。
部署前花两分钟做一次体检,命令如下:
cat /etc/redhat-release uname -r free -h df -h nvidia-smi重点看三样东西:系统版本、内存余量、模型存储目录剩余空间。我见过太多人栽在磁盘上,默认模型目录在/usr/share/ollama下,系统盘只有 20G,拉一个 7B 模型就塞满了,后面再想换目录还得迁移数据,很折腾。
1.3 网络环境与下载痛点,要有心理准备
国内部署 Ollama 最大的障碍不是安装本身,而是下载。官方安装脚本要访问国外服务器下载二进制,模型文件要从 registry.ollama.ai 拉取,这两个环节在默认网络环境下都可能慢到让人崩溃,甚至连接超时。
所以部署前就要想清楚加速策略,不要等卡住了再临时抱佛脚。我常用的几条路:
- 如果服务器能够访问外网但速度慢,考虑配置合规的 HTTP 代理环境变量。
- 如果服务器在内网完全无法访问外网,就用“离线安装 + 模型手动导入”的方式,先在能联网的机器上下载好二进制和模型文件,再拷贝进去。
- 如果只是模型下载慢,可以通过 ModelScope 魔搭社区等国内平台下载 GGUF 格式的模型文件,再手动创建 Ollama 模型,这个后面详细展开。
2. 从零到能跑:Ollama 安装与国内加速方案
2.1 官方脚本安装流程
安装 Ollama 最常规的方式是直接执行官方一键脚本:
curl -fsSL https://ollama.com/install.sh | sh这里说明一下,我之所以劝你先了解脚本干了什么再执行,是因为它并不是只下载一个二进制那么简单。脚本会做这几件事:
- 检测系统架构和操作系统版本,下载对应的 Ollama 二进制压缩包。
- 解压到
/usr/local,并在/usr/local/bin下创建ollama软链接。 - 创建
ollama系统用户,用于服务隔离。 - 写入 systemd 服务文件
/etc/systemd/system/ollama.service,注册为系统服务。 - 启动服务并设置开机自启。
安装完成后验证:
ollama --version systemctl status ollama正常能看到服务是 running 状态,ollama --version会输出版本号。如果卡在这一步,大概率是网络问题,脚本下载二进制失败,这种情况不要反复重试单命令,直接看下面的加速方案。
2.2 国内加速安装,三种方案实测对比
方案一:通过代理加速。如果服务器有可用的 HTTP/HTTPS 代理,安装前导出环境变量即可:
export http_proxy=http://your-proxy-ip:port export https_proxy=http://your-proxy-ip:port curl -fsSL https://ollama.com/install.sh | sh注意脚本执行时如果用了 sudo,环境变量可能被清掉,建议用sudo -E保留环境变量,或者直接 root 下执行。
方案二:手动下载二进制离线安装。这个方式最稳,尤其适合内网服务器。先去官网下载对应架构的 Linux 安装包,拷贝到服务器后手动解压,安装过程非常可控:
# 下载得到 ollama-linux-amd64.tgz mkdir -p /usr/local tar -C /usr/local -xzf ollama-linux-amd64.tgz ln -sf /usr/local/ollama/ollama /usr/local/bin/ollama # 创建系统用户(如果脚本不处理的话) useradd -r -s /bin/false -m -d /usr/share/ollama ollama # 手动生成 systemd 服务并启动手动安装的核心是把二进制放对位置,后面 systemd 服务文件参照官方写法即可。这个方式的好处是安装包可以提前下载,在内网环境反复使用。
方案三:利用开源镜像站下载 RPM 包。实际上 Ollama 也在部分镜像站有分发,但版本不一定最新,这里不展开,生产环境我更推荐方案二。
2.3 底层原理补课:install.sh 到底做了什么
直接把脚本内容拉出来看一段核心逻辑,你就明白为什么有些环境会出问题:
# 脚本核心逻辑(简化) get_arch() { uname -m } get_os() { uname -s } dl() { curl -fsSL -o "$temp_dir/$archive_name" "$url" } # 关键在于 url 拼接 url="https://ollama.com/download/ollama-linux-${arch}.tgz"脚本先检查命令是否可用,再根据 CPU 架构拼下载地址,下载成功后会执行install逻辑。它还会检测系统里有没有systemd,如果没有,就改成后台进程方式启动,输出一行提示让你手动配置。
理解了脚本逻辑,你就能预判一些坑:比如某些精简版 CentOS 没有装curl,脚本第一行就失败;比如内核太老,下载amd64版本可能默认用了要求更高 glibc 的构建,解压后一运行就报错。碰到这类问题,先看日志再动手,别盲目重装。
3. 自定义端口配置,从环境变量到防火墙一次搞定
3.1 默认端口和 OLLAMA_HOST 的关系
Ollama 默认监听127.0.0.1:11434,这个地址可以拆成两部分:IP 和端口。很多人以为有单独的OLLAMA_PORT环境变量,其实只有OLLAMA_HOST,它决定了 Ollama 的监听地址,格式是host:port。例如你想改到 8080 端口并且允许局域网访问,就设置:
OLLAMA_HOST=0.0.0.0:8080其中0.0.0.0表示监听所有网卡接口,这样同一局域网内其他机器才能访问到。如果只改端口,不改监听地址,对外服务不会生效,这也是新手最容易踩的误区之一。
3.2 三种改端口的方式,推荐 systemd 配置
方式一:通过 systemd 覆盖配置(推荐)。CentOS7 的 Ollama 服务由 systemd 管理,直接改启动参数最可靠。我通常用systemctl edit生成覆盖配置:
systemctl edit ollama在打开的空白文件里写入:
[Service] Environment="OLLAMA_HOST=0.0.0.0:8080"保存退出后,让 systemd 重新加载配置并重启服务:
systemctl daemon-reload systemctl restart ollama用这种方式的好处是:不动原始服务文件,以后升级 Ollama 时配置不会丢失,也符合 systemd 的最佳实践。
方式二:修改原始服务文件。不同安装方式,路径可能略有不同,可以通过命令查看:
systemctl cat ollama找到Environment=那一行,修改成你想要的地址:
Environment="OLLAMA_HOST=0.0.0.0:8080"改完同样要daemon-reload和restart。
方式三:手动启动方式。如果你不是为了做 systemd 服务,而是想在当前终端测试,可以这样:
export OLLAMA_HOST=0.0.0.0:8080 nohup ollama serve > /tmp/ollama.log 2>&1 &这种方式适合快速验证,但系统重启后不会自动拉起服务,所以生产环境还是老老实实用 systemd。
改完端口后,务必验证监听是否生效:
ss -lntp | grep 8080正常应该看到8080端口处于 LISTEN 状态,监听地址是0.0.0.0。如果没看到,说明环境变量没生效,回过去检查服务配置。
3.3 防火墙放行与 SELinux 处理
CentOS7 默认开着 firewalld,如果你改了监听地址但外部还是访问不了,先检查防火墙:
# 放行端口 firewall-cmd --permanent --add-port=8080/tcp firewall-cmd --reload # 查看当前放行列表 firewall-cmd --list-all然后是 SELinux,这个坑非常隐蔽。CentOS7 默认 SELinux 状态是 enforcing,即使防火墙放行了端口,SELinux 也可能拦截 Ollama 进程对外监听或者读取模型文件。最简单的判断方法是看/var/log/audit/audit.log有没有avc: denied记录,或者直接用getenforce看状态。
临时关闭 SELinux 的方法:
setenforce 0永久关闭需要修改/etc/selinux/config:
SELINUX=permissive我个人对生产环境的建议是:不要图省事直接disabled,先设为permissive,确认 Ollama 运行正常后可以选择性配置 SELinux 策略上下文。当然,如果是内部测试环境,直接关闭也无妨,只要心里清楚这是个折中方案。
3.4 生产环境安全建议:不该裸奔就别裸奔
把端口绑到0.0.0.0之后,意味着内网所有机器都能访问你的模型服务,如果模型包含内部数据,必须考虑访问控制。Ollama 本身没有内建认证机制,所以生产环境建议放在反向代理后面。
我用 Nginx 做了一层简单的访问限制,配置思路如下:
server { listen 18080; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; # 简单的基础认证 auth_basic "ollama access"; auth_basic_user_file /etc/nginx/.ollama_htpasswd; } }这样对外只暴露 18080 端口,请求到 Ollama 之前必须通过认证,既隐藏了后端端口,也加了权限校验。如果你不想加 Nginx,至少保证 Ollama 监听在内网 IP 上,不要直接暴露在公网环境。
4. 模型下载与离线导入,国内环境的核心玩法
4.1 在线拉取模型,以及下载太慢的应对
安装好 Ollama 后,最常用的操作就是拉取模型。以阿里通义千问 7B 模型为例:
ollama pull qwen2.5:7b这条命令会从官方模型仓库下载模型文件,默认存到/usr/share/ollama/.ollama/models或者你自定义的OLLAMA_MODELS目录。下载是个体力活,7B 量化模型大概 4-5G,官方源在国内速度不稳定,经常出现跑一会儿就断掉的情况。
重试和断点续传方面,Ollama 会保留已下载的分块临时数据,重新执行ollama pull会继续传,但有时候临时文件损坏会导致一直卡在某个百分比,这时候删掉对应临时目录重来反而更快。
如果你遇到典型的“下载太慢”,我建议优先考虑下面的离线导入方案。
4.2 通过 ModelScope 下载模型文件,再导入 Ollama
ModelScope 魔搭社区是国内访问速度很快的模型托管平台,很多官方模型的 GGUF 量化版本都能直接搜到。思路是:先从 ModelScope 下载 GGUF 文件,再用 Ollama 的Modelfile机制导入本地模型库。
具体步骤如下:
第一步,在能联网的机器上,从 ModelScope 下载模型的 GGUF 文件。比如下载 Qwen2.5-7B-Instruct 的 Q4_K_M 量化版,得到qwen2.5-7b-instruct-q4_k_m.gguf。这时也可以直接用modelscope命令或者浏览器手动下载。
第二步,把文件上传到目标服务器,放在一个专用目录,比如/data/models/gguf/。
第三步,创建 Modelfile:
FROM /data/models/gguf/qwen2.5-7b-instruct-q4_k_m.gguf # 可选参数设置,上下文长度等 PARAMETER temperature 0.7 PARAMETER num_ctx 8192 # 模板信息,一般用模型默认即可 TEMPLATE """{{- if .System }}<|im_start|>system {{ .System }}<|im_end|> {{- end }}<|im_start|>user {{ .Prompt }}<|im_end|> <|im_start|>assistant """第四步,创建并运行:
ollama create qwen2.5-7b -f Modelfile ollama run qwen2.5-7b这样模型就以qwen2.5-7b的标签出现在 Ollama 的本地模型列表里了。整个过程完全不依赖官方模型仓库,速度取决于你本地磁盘和从 ModelScope 拷贝的速度,实际体验比在线 pull 快一个数量级。
4.3 自定义模型存储目录的完整操作
很多人到这一步才发现磁盘不够用,所以我把这个操作提前讲。Ollama 的模型存储目录由OLLAMA_MODELS环境变量控制,默认位置在/usr/share/ollama/.ollama/models,如果系统盘空间紧张,务必尽早改到数据盘。
同样是修改 systemd 配置:
systemctl edit ollama写入:
[Service] Environment="OLLAMA_MODELS=/data/ollama/models"然后设置目录权限:
mkdir -p /data/ollama/models chown -R ollama:ollama /data/ollama/models systemctl daemon-reload systemctl restart ollama注意,如果是从默认路径迁移已有模型,需要先把旧目录里的文件搬到新目录,再重启服务,否则模型列表会变空。
4.4 离线安装模式下把模型包拷进服务器
如果你连 ModelScope 也访问不了,或者服务器在隔离内网,那就只能整包搬运。这里分享一个我实际操作过的方法。
先在能联网的机器上,用任意方式把模型完整拉下来,找到ollama模型存储目录(默认~/.ollama/models),整个目录打包。然后把包拷贝到目标服务器,解压到目标位置,并确保目标服务器的OLLAMA_MODELS指向解压后的models目录。
关键点:目标服务器的 Ollama 版本最好和源服务器一致或相近,因为模型清单清单(manifest)可能会随版本变化,版本差太多容易识别失败。拷贝完成后执行ollama list,能看到模型列表就说明成功。
5. Ollama 常用命令与服务化调用
5.1 日常管理命令速记
Ollama 的日常操作命令不多,熟练了就那几条:
# 拉取模型 ollama pull <model>:<tag> # 交互式运行 ollama run <model>:<tag> # 查看已安装模型 ollama list # 查看模型详细信息 ollama show <model>:<tag> # 复制模型 ollama cp <model>:<tag> <new-model>:<tag> # 删除模型 ollama rm <model>:<tag>这里多说一句,ollama run后面直接跟模型名和问题,也可以快速测试,比如:
ollama run qwen2.5:7b "用一句话介绍你自己"5.2 HTTP API 调用方式
Ollama 服务启动后,主要的交互方式就是 HTTP API。原生接口有两个常用端点:
生成接口,适合补全场景:
curl http://localhost:8080/api/generate -d '{ "model": "qwen2.5:7b", "prompt": "为什么天空是蓝色的?", "stream": false }'对话接口,适合多轮聊天:
curl http://localhost:8080/api/chat -d '{ "model": "qwen2.5:7b", "messages": [ {"role": "user", "content": "你好,介绍一下你自己"} ], "stream": false }'如果你更习惯 OpenAI 格式,Ollama 也提供了兼容端点:
curl http://localhost:8080/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "qwen2.5:7b", "messages": [ {"role": "user", "content": "你好"} ] }'这意味着很多基于 OpenAI SDK 的脚本,只要把base_url改成http://localhost:8080/v1就能直接对接本地模型,无需改动其他代码。
5.3 环境变量参数对服务性能的影响
除了OLLAMA_HOST和OLLAMA_MODELS,有几个环境变量在性能调优时很关键:
OLLAMA_NUM_PARALLEL控制并行请求数量,默认值为 1,也就是同一时间只能处理一个请求。如果你有多个用户同时访问,可以适当调大,比如设成 4,但要注意显存占用,因为并行加载会让多个请求同时驻留模型。
OLLAMA_MAX_LOADED_MODELS控制最多同时加载几个模型,默认是 GPU 显存够就多加载。如果同时跑多个模型导致 OOM,可以限制为 1。
OLLAMA_KEEP_ALIVE控制模型在内存中保留的时间,默认 5 分钟。如果频繁有请求进来,建议设长一点,减少反复加载模型的时间浪费。
这些参数同样写在 systemd 配置里,例如:
[Service] Environment="OLLAMA_HOST=0.0.0.0:8080" Environment="OLLAMA_NUM_PARALLEL=4" Environment="OLLAMA_KEEP_ALIVE=1h"6. 常见问题与排查实录
6.1 安装时提示找不到 curl 或脚本执行失败
CentOS7 最小化安装没有curl的情况很常见。报错通常是curl: command not found,解决办法很简单:
yum install -y curl tar还有一种情况是脚本执行到一半退出,没有任何明显报错,多半是下载阶段网络失败。建议把脚本下载下来看具体是哪一步断的:
curl -fsSL -o install.sh https://ollama.com/install.sh sh install.sh6.2 服务启动失败,端口没有监听
装了服务也启动成功了,但curl localhost:11434没反应,通常从几个方向排查:
先看服务状态和日志:
systemctl status ollama journalctl -u ollama -n 50日志里经常可以看到这几类问题:
目录权限不足。特别是自定义了OLLAMA_MODELS后,目录属主不是 ollama 用户,启动时无法写入模型文件。
SELinux 拦截。日志里出现Permission denied但权限本身没问题,去/var/log/audit/audit.log看有没有 AVC 记录。
端口被占用。ss -lntp查看端口占用情况,换一个端口最省事。
6.3 模型下载到一半断了,反复失败
在线 pull 模型时断线,是最让人头疼的。Ollama 对分块下载有缓存机制,理论上重新 pull 会续传,但网络环境恶劣时经常出现 hash 校验失败,表现为进度条卡在某个百分比不动。
我实际排查遇到过几次,处理步骤是:
- 先
ollama rm删除这个半成品模型。 - 清理下载缓存目录,一般在
OLLAMA_MODELS目录下的blobs或临时文件夹里。 - 改用离线导入方案,从国内平台下载一次性到位。
6.4 局域网内其他机器访问不到服务
这是改完端口后最常遇到的问题。按以下顺序快速检查:
本机看监听地址:
ss -lntp | grep 8080如果是127.0.0.1:8080,说明OLLAMA_HOST没配上,回第 3 节看配置。如果是0.0.0.0:8080,继续查防火墙:
firewall-cmd --list-all systemctl status firewalld如果防火墙放行了,再查 SELinux:
getenforce最后再用另一台机器telnet <服务器IP> 8080测试端口通不通。这一套下来基本能定位问题。
6.5 显存不够或 CPU 环境下频繁卡死
有些机器没有 N 卡,或者显存不够跑大模型。Ollama 默认会尝试用 GPU,没有 GPU 时会退回 CPU,但 CPU 推理慢是必然的。如果出现进程被系统杀掉,先查系统日志:
dmesg | tail -20如果看到Out of memory,说明内存不够或者并发参数设置过大。调低OLLAMA_NUM_PARALLEL,或者换更小量化的模型。
另一个实用技巧是给 Ollama 服务配置系统级资源限制,防止它把整台机器内存吃满,影响同一台机器上的其他业务:
[Service] MemoryMax=8G这种方式适合多服务共存的机器,至少不会让 Ollama 把系统拖垮。
6.6 常见问题速查表
| 现象 | 可能原因 | 快速处理 |
|---|---|---|
| 安装脚本卡住/下载失败 | 网络无法访问官方源 | 手动下载离线安装包 |
| 服务启动失败 | 目录权限 / SELinux / 端口占用 | 看 journalctl 定位,改权限或换端口 |
| 局域网访问不了 | 监听地址绑定本地 / 防火墙 / SELinux | 改 OLLAMA_HOST,放行端口 |
| 模型下载慢或中断 | 官方仓库网络不稳定 | 换 ModelScope 下载,离线导入 |
| 拉取后 ollama list 为空 | OLLAMA_MODELS 指向目录不对 | 检查环境变量和目录属主 |
| 内存被吃满,进程被杀 | 并发太多 / 模型太大 | 限制并发数,加 MemoryMax |
| 模型上下文不够用 | 默认 num_ctx 太小 | 在 Modelfile 或 API 中调整 num_ctx |
7. 部署完成后的扩展建议
如果你只是需要本地跑个模型,看到这里基本够用了。但我个人建议时间允许的话,再往服务化方向走一步,体验会完全不同。
最简单的是装一个 Web UI,比如 Open WebUI,它基于 Docker 部署,连接 Ollama 的 API,提供聊天界面、历史记录、模型切换等功能。命令大概是:
docker run -d \ -p 3000:8080 \ -e OLLAMA_BASE_URL=http://主机IP:8080 \ --name open-webui \ ghcr.io/open-webui/open-webui:main如果你不用 Docker,也可以直接用 Python 写一个简单的脚本封装 Ollama API,配合消息队列做内部服务,这块各家业务差异大,就不展开了。
另外,模型选择上我个人建议先从小的开始试,qwen2.5 系列的 7B 模型在中文场景表现均衡,显存不够可以选 3B 版本,两者 API 参数完全一致,切换成本很低。
8. 最后的一些实操心得
这次在 CentOS7 上部署 Ollama,我最大的体会是:安装本身不复杂,真正的难点集中在网络和系统权限这两个环节。网络问题靠离线包和国内模型源能解决七八成,剩下的坑大多是 SELinux 和 systemd 配置细节。
最后再分享一个我自己用下来的小技巧:配置好端口和模型目录之后,第一时间把 systemd 配置复制一份存到本地维护文档里。CentOS7 这种维护周期较长的系统,过几个月再回来看,很可能你已经忘了当初改过哪些参数。把systemctl cat ollama的输出、OLLAMA_MODELS指向、防火墙放行规则这几条关键信息记下来,下次扩容或者迁移能省不少时间。