Ollama搭配Nginx做Basic鉴权
Ollama 是本地部署大语言模型的常用推理服务,默认启动后只监听 127.0.0.1,但很多人通过 Nginx 反代把它暴露到公网使用。
如果直接暴露且没有鉴权,任何知道地址的人都能调用你的 GPU 跑推理,轻则消耗显存,重则被刷爆账单。
本文用 Nginx 的 Basic Auth 给 Ollama 加上访问密码,让匿名请求直接返回 401,操作过程适合零基础用户照做。
动手前需要准备什么
- 一台 Linux 服务器(本文以 Ubuntu 22.04 为例,Debian/CentOS 命令类似)
- 已安装 Ollama 并确认正常启动
- 已安装 Nginx(未安装的话执行
sudo apt install nginx -y) - 有 root 或 sudo 权限
第一步:确认 Ollama 监听地址
Ollama 默认只允许本机访问,先检查当前监听:
sudo ss -lntp | grep 11434
如果看到 127.0.0.1:11434,说明没有向外网暴露,可以放心继续。
如果显示 0.0.0.0:11434,说明已经对全网开放,需要立刻修改。
修改监听地址的方法是编辑 systemd 服务:
sudo systemctl edit ollama
写入:
[Service]
Environment="OLLAMA_HOST=127.0.0.1:11434"
保存后重启:
sudo systemctl restart ollama
再次用 ss 确认监听地址变成 127.0.0.1。
第二步:生成 Basic Auth 密码文件
Nginx 的 auth_basic 模块需要借助 htpasswd 生成账号密码文件。
先安装工具:
sudo apt install apache2-utils -y
创建用户,比如用户名为 ollama:
sudo mkdir -p /etc/nginx/conf.d
sudo htpasswd -c /etc/nginx/conf.d/ollama.htpasswd ollama
输入两次密码即可。
以后要加新用户,去掉 -c 参数避免覆盖旧密码:
sudo htpasswd /etc/nginx/conf.d/ollama.htpasswd another_user
第三步:配置 Nginx 反向代理
在 /etc/nginx/conf.d/ollama-proxy.conf 新建配置文件,写入:
server {
listen 80;
server_name your.domain.com;
auth_basic "GPU Inference Service";
auth_basic_user_file /etc/nginx/conf.d/ollama.htpasswd;
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;
}
}
注意把 server_name 换成自己的域名或 IP。
检查配置并重载:
sudo nginx -t
sudo systemctl reload nginx
如果用了 HTTPS,还需要在 server 块里加证书配置,并建议将 HTTP 请求 301 跳转到 HTTPS,避免密码被明文抓包。
验证是否生效
本机直接请求 Ollama 端口,应该没有鉴权(因为走的是本机回环,Nginx 没有介入):
curl http://127.0.0.1:11434/
通过 Nginx 域名访问,不带密码应返回 401:
curl -i http://your.domain.com/
输出里应该有 HTTP/1.1 401 Unauthorized。
带用户名密码再试:
curl -i -u ollama:你的密码 http://your.domain.com/
此时能看到 Ollama 返回的 Ollama is running 或 200 状态。
如果返回 200,说明 Basic 鉴权已生效。
几个容易踩的坑
auth_basic设置在server层时,会对所有 location 生效,包括/api等接口,正好符合需求。- 反向代理必须把
Host等请求头传给 Ollama,否则部分 API 可能报错。上面配置已包含,不要删。 - 不要在
/etc/nginx/sites-enabled/default里直接改,容易和已有站点冲突,独立配置文件更清晰。 - 如果 Ollama 已经通过 Docker 部署,容器端口映射要改成
127.0.0.1:11434:11434,否则 Nginx 和外部网络都能直连容器,鉴权形同虚设。 - Basic Auth 的账号密码只是 base64 编码,不是加密,线上环境必须加 HTTPS,否则密码等于明文传输。
关于是否需要担心 Basic Auth 不适合服务间调用,如果程序需要带密码访问,可以在请求头里加上 Authorization: Basic base64(user:pass),各语言 HTTP 库基本都支持。
如果未来要接入 API Token 或 JWT,也可以先把 Nginx 这层鉴权换成自定义模块,但 Basic Auth 依然是阻止匿名调用的最快方案。
实施时先按上面步骤做通,再考虑 HTTPS 收紧。
遇到 502 通常是 Nginx 无法连接 11434,检查 Ollama 进程和防火墙;
遇到 404 则看 location 路径有没有写错。
整体配置完成后,匿名访问已经无法触碰推理接口,GPU 资源真正掌握在自己手里。