Ubuntu Server生产环境部署:Nginx反向代理保护你的Ollama API服务
Ubuntu Server生产环境部署:Nginx反向代理保护你的Ollama API服务
引言
在AI应用开发中,Ollama作为本地运行大型语言模型的工具越来越受欢迎。但在生产环境中直接暴露Ollama API会带来安全隐患。本文将教你如何使用Nginx作为反向代理来保护Ollama API服务,同时提高系统的可靠性和安全性。
准备工作
环境要求
- Ubuntu Server 22.04 LTS (推荐)
- 已安装的Ollama服务(默认运行在11434端口)
- sudo权限的用户账户
- 基础命令行操作知识
前置知识
- 基本的Linux命令操作
- 对HTTP协议有基本了解
- 简单的网络概念(端口、IP等)
第一步:安装Nginx
# 更新软件包列表
sudo apt update
# 安装Nginx
sudo apt install nginx -y
# 启动Nginx并设置开机自启
sudo systemctl start nginx
sudo systemctl enable nginx
验证安装:
访问服务器IP地址,应该能看到Nginx欢迎页面。
注意事项:
– 如果遇到端口冲突,检查是否有其他服务占用了80端口
– Ubuntu默认使用ufw防火墙,确保放行HTTP(80)和HTTPS(443)端口
第二步:配置Nginx作为反向代理
创建配置文件
# 为Ollama创建专用配置文件
sudo nano /etc/nginx/sites-available/ollama-proxy
将以下配置粘贴到文件中:
server {
listen 80;
server_name your-domain.com; # 替换为你的域名或服务器IP
location / {
proxy_pass http://localhost: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;
# WebSocket支持(如果Ollama使用WebSocket)
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# 客户端最大body大小(调整根据需求)
client_max_body_size 100M;
}
# 限制请求速率防止滥用(可选)
limit_req_zone $binary_remote_addr zone=ollamalimit:10m rate=5r/s;
access_log /var/log/nginx/ollama_access.log;
error_log /var/log/nginx/ollama_error.log;
}
配置说明:
1. proxy_pass
:将所有请求转发到本地的Ollama服务(11434端口)
2. proxy_set_header
:传递必要的头部信息给后端服务
3. WebSocket部分:确保WebSocket连接能正常工作(如果API使用)
4. client_max_body_size
:调整上传文件大小限制
启用配置
# 创建符号链接启用站点配置
sudo ln -s /etc/nginx/sites-available/ollama-proxy /etc/nginx/sites-enabled/
# 测试Nginx配置是否正确
sudo nginx -t
# 重启Nginx使配置生效
sudo systemctl restart nginx
第三步:安全加固(推荐)
HTTPS加密(使用Let’s Encrypt)
# 安装Certbot工具和Nginx插件
sudo apt install certbot python3-certbot-nginx -y
# 获取并安装SSL证书(需要有已解析的域名)
sudo certbot --nginx -d your-domain.com
# Certbot会自动修改你的Nginx配置并设置自动续期
IP访问限制(可选)
编辑之前的配置文件,在server
块内添加:
location / {
# ...原有配置...
# IP白名单示例(替换为你允许的IP)
allow xxx.xxx.xxx.xxx;
deny all;
}
API密钥验证(高级安全)
# 生成htpasswd文件用于基本认证(需要apache2-utils)
sudo apt install apache2-utils -y
sudo htpasswd -c /etc/nginx/.ollama-auth api-user
#然后在Nginx配置中添加:
auth_basic "Restricted Access";
auth_basic_user_file /etc/nginx/.ollama-auth;
第四步:测试与验证
-
测试API访问:
代码片段curl http://your-domain.com/api/generate -d '{"model": "llama2", "prompt": "Hello"}'
-
检查日志:
代码片段sudo tail -f /var/log/nginx/ollama_access.log /var/log/nginx/ollama_error.log
-
性能测试(可选):
代码片段ab -n1000 -c10 http://your-domain.com/api/generate
常见问题解决
Q1: Nginx报错502 Bad Gateway怎么办?
A:
1. 检查Ollama服务是否正常运行:systemctl status ollama
2. Ollama是否监听11434端口:netstat -tulnp | grep ollama
3. SELinux或AppArmor可能阻止了连接,检查相关日志
Q2: WebSocket连接失败怎么处理?
A:
1. Nginx必须正确配置WebSocket代理头(如教程所示)
2. Ollama客户端也需要指定正确的WebSocket URL格式
Q3: HTTPS证书不生效?
A:
1. Certbot需要域名正确解析到服务器IP
2. ufw防火墙需要放行443端口
3. Nginx必须监听443端口
Nginx优化建议
-
性能调优:
“`nginxworker进程数设置为CPU核心数
worker_processes auto;
Keepalive连接设置
keepalivetimeout 65;
keepaliverequests 1000;Buffer大小优化
clientbodybuffersize 10K;
clientheaderbuffersize 1k;
clientmaxbodysize 8m;
largeclientheaderbuffers 4 8k;Gzip压缩
gzip on;
gzipminlength 1000;
gzipproxied expired no-cache no-store private auth;
gziptypes text/plain application/json;TLS优化
sslprotocols TLSv1.2 TLSv1.3;
sslpreferserverciphers on;
sslciphers ‘EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH’;
sslsessioncache shared:SSL:10m;
sslsession_timeout 10m;
“`
总结
通过本文的步骤,你已经成功:
✅使用Nginx作为反向代理保护Ollama API
✅实现了HTTPS加密传输
✅设置了基础的安全防护措施
✅学会了基本的性能调优方法
这种架构的好处是:
🔹隐藏了后端服务的真实端口和细节
🔹可以轻松添加负载均衡和多实例部署
🔹便于后续添加WAF、限流等安全功能
后续可以考虑:
🔸添加更精细的API路由控制
🔸实现基于JWT的认证授权系统
🔸结合Prometheus监控API调用情况