本地跑着 Ollama,想在别的机器或容器里调它,结果 curl 一发就 connection refused;或者改了环境变量重启,地址还是老样子。这篇不聊模型选型,只把「地址从哪来、怎么改、改完怎么验」这条链路走一遍,顺带给你一份连不上时的排查顺序。
本地跑着 Ollama,想在另一台机器、容器或者局域网里的应用里调它,结果 curl 一发就是 connection refused。也有另一种情况:明明改了环境变量、重启过了,地址看上去还是老样子。这篇不聊模型选型,只把「地址从哪来、怎么改、改完怎么验」这条链路完整走一遍,最后给一份连不上时的排查顺序。
读之前先明确一点:地址问题九成不是 Ollama 的问题,而是「谁在监听、监听在哪、有没有放行」这三件事没对齐。下面按默认地址、怎么改、怎么验、客户端怎么写四步讲,每一步都带能直接照着做的动作。
默认地址长什么样,分几段看
一个 API 地址可以拆成协议、主机、端口三段。默认情况下 Ollama 只监听本机回环地址,所以同一台机器上的脚本能用,隔壁机器用不了。这就是最典型的「地址没错但连不上」——你复制的地址本身没写错,错的是它压根没对外开门。
- 协议
- 调用时写全 http 或 https,别指望客户端帮你猜
- 主机
- 回环地址只对本机可见;换成实际网卡地址或 0.0.0.0 才允许外部连入
- 端口
- Ollama 有默认端口,冲突或想统一管理时改这一段比改主机省事
想确认你机器上实际生效的地址,别只看文档默认值,去两个地方看:启动时的服务日志,以及进程的监听状态(比如用 netstat 或 ss 看这个进程绑在哪个地址和端口上)。各家版本默认值可能不同,具体数值到 /tools 里的本地工具箱对照当时的说明。
# 看进程实际监听在哪个地址和端口
ss -lntp | grep ollama
# 或
netstat -lntp | grep ollama怎么改:环境变量与启动参数两条路
改地址本质上只有两件事:让它监听在哪张网卡上,以及监听在哪个端口上。主机变量决定前者,只给回环就只有本机能访问,给到全部网卡才允许外部连入;端口变量决定后者。两个变量要成对确认,只改一个,很容易出现「以为改了其实没改」。
- 确认服务怎么被拉起来的是手动前台跑、systemd 托管,还是 Docker 容器?这决定你改的是当前 shell、服务单元,还是容器启动参数。
- 改对应的来源,不是改当前终端systemd 托管就去改服务单元里的环境变量;容器就改启动配置或容器编排文件。当前 shell 里 export 一下只对前台进程有效。
- 重启服务,别只重连客户端环境变量在进程启动时读取,不重启服务,改了也不生效。重启后再去看监听状态确认一次。
- 三种方式各测一次本机环回、本机实际网卡地址、另一台机器,逐个测。只测通一种不算改成功。
改主机时要权衡:监听全部网卡方便外部接入,但也意味着同网段里谁都能试;如果你的机器直接暴露在公网,别图省事就开全部网卡,先想清楚访问控制怎么做。这一点在共享办公网络或云主机上尤其重要。具体的安全组、访问控制配置差异很大,拿不准时到 /guides 看站内的接入类指南。
改完怎么验证,连不上按什么顺序查
验证的核心思路是逐层往外推:先本机环回,再本机实际网卡地址,最后跨机器。哪一层断掉,问题就出在那一层,不用一上来就怀疑模型或者密钥。
| 测试层 | 怎么测 | 不通说明什么 |
|---|---|---|
| 本机环回 | 在本机用回环地址请求一次 | 服务本身没起来或端口写错 |
| 本机网卡地址 | 用本机实际 IP 请求一次 | 服务没监听外部地址 |
| 跨机器 | 从另一台机器请求 | 监听、防火墙、网段三者之一有问题 |
| 云主机外部 | 从公网访问 | 安全组或端口映射没开 |
- 跨机器不通,优先查服务是否真的监听了外部地址,而不是回环地址
- 再查系统防火墙是否放行该端口,很多系统默认是拦的
- 第三查两台机器是否在同一网段,能不能互相 ping 通
- 云主机要单独看安全组,安全组不开的话本机怎么测都通、外面始终连不上
- 容器场景里,容器内回环和宿主机回环是两个世界,要么用宿主网络,要么走容器网络里的服务名加内部端口
这套顺序能挡掉绝大多数「看起来像 Ollama 坏了」的误判。如果你排查到怀疑是中转或第三方接入层的问题,而不是本地监听的问题,那就不属于这篇的范围了,可以到 /sites 看站内的服务目录和可信度检测说明。
客户端那边怎么写地址
服务端监听对了,客户端填错照样连不上。填地址时优先写完整形式,把协议和端口都写全,少留靠默认值猜测的空间。同一台机器上的脚本用回环地址最稳,跨机器再换成实际网卡地址或域名。
如果你的程序是通过环境变量读地址配置的,要搞清楚它是覆盖还是追加——很多「改了没生效」其实是旧变量优先级更高。多环境切换时,把地址写进配置文件而不是硬编码在代码里,连不上时改一处就能立刻复测。
- 验证顺序:先服务端监听状态,再客户端地址拼接,最后再看网络链路
- 同一台机器优先回环,跨机器才用网卡地址或域名
- 环境变量改完记得新开一个终端或重启进程,旧进程读的还是旧值
- 地址写进配置文件,别散落在多个脚本里
- 怀疑是接入层的地址问题时,对照 /tools/speed-test 的测试方式自己复测一次
常见问题
为什么本机能调通,别的机器连不上?
大概率是服务只监听了回环地址。回环地址只对本机可见,外部流量根本到不了进程。把主机变量改成允许外部访问并重启,再用另一台机器测一次;同时确认防火墙或云安全组放行了对应端口,这两步缺一个都还是连不上。
改了环境变量,为什么地址没变?
常见三种情况:服务没重启,变量只在启动时读取一次;变量写在当前 shell 里,但服务实际由 systemd 或容器托管,读的是另一份环境;或者同时存在多处配置,旧的那份优先级更高。改完去 /tools 里用本地工具箱确认实际监听状态,比看配置文件靠谱。
端口被别的程序占了怎么办?
先把监听状态查出来,看这个端口上到底是谁。能换端口就换个不冲突的,改完客户端地址记得同步改。不方便换端口就停掉占用它的进程,但要确认那个进程是不是别的服务在用,别顺手把线上东西关掉了。