Ollama访问限制

发布于:

Ollama访问限制 | Eucalyptushttps://blog.mingliangstar.com/2026/05/21/Ollama%E8%AE%BF%E9%97%AE%E9%99%90%E5%88%B6/

Nginx+Basic Auth认证

生成密码文件

复制代码
# 安装工具
yum install httpd-tools -y

# 创建密码文件(用户名 admin)
htpasswd -c /www/server/pass/ollama.pass admin

# 输入密码,比如 MySecurePass123

修改nginx配置文件

在之前配置ollama的反向代理的nginx配置文件中设置Basic Auth认证实现访问限制

复制代码
    #BASICAUTH START
    auth_basic "Ollama API Auth";
    auth_basic_user_file /www/server/pass/ollama.pass;
    #BASICAUTH END

重启nginx

复制代码
nginx -t
systemctl reload nginx

测试

复制代码
# 不带认证 → 401 Unauthorized
curl https://ollama.mingliangstar.com/api/tags

# 带认证 → 成功
curl https://admin:MySecurePass123@ollama.mingliangstar.com/api/tags

后端Node.js代理

但是这样的话再前端调用的时候需要把账号和密码写到前端js中,还是有泄露的风险,这时我们可以使用后端代理。前端 JS 直接调用后端代理,后端代理内部带 Basic Auth 访问 Ollama。

架构图

复制代码
用户浏览器 → Hexo 博客页面 → JS 调用 https://ollama.mingliangstar.com
                                              ↓
                                    ECS Nginx (无认证,或简单限流)
                                              ↓
                                    Node.js 代理 (localhost:3001)
                                              ↓
                                    带 Basic Auth 调 Ollama (127.0.0.1:11434)
                                              ↓
                                    frps → frp隧道 → 本地虚拟机 Ollama

部署步骤

ces安装node.js
复制代码
# CentOS 7
curl -fsSL https://rpm.nodesource.com/setup_18.x | bash -
yum install -y nodejs

# 验证
node -v
npm -v
创建代理服务
复制代码
mkdir -p /opt/ollama-proxy
cd /opt/ollama-proxy
npm init -y
npm install express node-fetch@2
创建proxy.js

记得配置CORS,不然会出现跨域访问问题

复制代码
const express = require('express');
const fetch = require('node-fetch');

const app = express();

// ========== CORS 中间件 ==========
app.use((req, res, next) => {
    res.header('Access-Control-Allow-Origin', 'https://blog.mingliangstar.com');
    res.header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
    res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept, Authorization');
    
    if (req.method === 'OPTIONS') {
        return res.sendStatus(204);
    }
    next();
});
// =================================

app.use(express.json({ limit: '10mb' }));

// Ollama 配置
const OLLAMA_HOST = 'http://127.0.0.1:11434';
const AUTH_USER = 'admin';
const AUTH_PASS = 'MySecurePass123';

// 生成 Basic Auth 头
const basicAuth = 'Basic ' + Buffer.from(`${AUTH_USER}:${AUTH_PASS}`).toString('base64');

// 健康检查
app.get('/health', (req, res) => {
    res.json({ status: 'ok' });
});

// 代理 /api/generate
app.post('/api/generate', async (req, res) => {
    try {
        const response = await fetch(`${OLLAMA_HOST}/api/generate`, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
                'Authorization': basicAuth
            },
            body: JSON.stringify(req.body),
            timeout: 60000
        });

        if (!response.ok) {
            const text = await response.text();
            return res.status(response.status).json({ error: text });
        }

        const data = await response.json();
        res.json(data);

    } catch (err) {
        console.error('Proxy error:', err);
        res.status(500).json({ error: err.message });
    }
});

// 代理 /api/tags
app.get('/api/tags', async (req, res) => {
    try {
        const response = await fetch(`${OLLAMA_HOST}/api/tags`, {
            headers: { 'Authorization': basicAuth }
        });
        const data = await response.json();
        res.json(data);
    } catch (err) {
        res.status(500).json({ error: err.message });
    }
});

const PORT = 3001;
app.listen(PORT, '127.0.0.1', () => {
    console.log(`Ollama proxy running on http://127.0.0.1:${PORT}`);
});
用PM2守护进程
复制代码
npm install -g pm2

# 启动
pm2 start proxy.js --name ollama-proxy

# 开机自启
pm2 startup
pm2 save

# 查看状态
pm2 status
pm2 logs ollama-proxy
修改ollama反向代理nginx的配置文件
复制代码
    #PROXY-CONF-START
    location ^~ / {
      proxy_pass http://127.0.0.1:3001;   # 改成代理端口
      proxy_set_header Host $http_host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Real-Port $remote_port;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_set_header X-Forwarded-Host $host;
      proxy_set_header X-Forwarded-Port $server_port;
      proxy_set_header REMOTE-HOST $remote_addr;
      
      proxy_connect_timeout 60s;
      proxy_send_timeout 600s;
      proxy_read_timeout 600s;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection $connection_upgrade;
    }
    #PROXY-CONF-END
重启nginx
复制代码
nginx -t
systemctl reload nginx
测试验证
复制代码
# 测试代理健康
curl http://127.0.0.1:3001/health

# 测试生成
curl -X POST http://127.0.0.1:3001/api/generate \
  -H "Content-Type: application/json" \
  -d '{"model":"qwen2.5:0.5b","prompt":"你好","stream":false}'
相关推荐
Elastic 中国社区官方博客4 小时前
快 12 倍的 Elasticsearch 向量索引:使用 GPU 和 CPU 分层部署 NVIDIA cuVS
大数据·人工智能·elasticsearch·搜索引擎·ai·全文检索·nvidia
绝知此事5 小时前
2026 AI 技术生态全景指南:从 LLM 到 Agent,从 MCP 到 A2A
人工智能·ai·ai编程
Canicer5 小时前
【国内安装 Claude Code CLI版本纯净完整指南】
ai·agent·claude code
@蔓蔓喜欢你5 小时前
前端性能监控体系建设:从指标到优化
人工智能·ai
ZFSS6 小时前
Midjourney Shorten API 的集成与使用
java·前端·数据库·人工智能·ai·midjourney·ai编程
SEO_juper6 小时前
CDN 地域节点优化:匹配 GEO 信号,提升加载速度
服务器·ai·php·seo·cdn·geo·谷歌优化
俊哥V6 小时前
每日 AI 研究简报 · 2026-05-20
人工智能·ai
哥布林学者6 小时前
初试 vibe coding:Tauri + React + Rust 构建的 windows 本地番茄钟
ai
陌陌卡上6 小时前
从 Vibecoding 入门,到 Agent 差点入土
ai·创意·vibecoding·想象