嘿,各位技术爱好者们!👋 作为目前头部大模型厂商。谷歌是唯一提供免费API让人体验目前地球上最强大模型注之一 Gemini2.5pro 的服务商。但是作为一名深度使用的程序员来说,也是感受到了 Gemini API 那"甜蜜的负担"------每日100次使用限制😭 作为一个热衷于探索 AI 应用的开发者,这简直是不能忍!于是,我决定另辟蹊径,在 AWS 上给自己搭建一个专属的 Gemini API 中继站,不仅突破了限制,还顺带把这个小应用部署到了 HTTPS 环境下,简直一举多得!✨
这篇博客,我将以我的亲身经历,手把手教你如何从零开始,在 AWS 免费服务器上搭建一个稳定、安全的 Gemini Balance 代理服务。过程中踩过的那些坑,我都会毫无保留地分享给你,保证让你少走弯路!😉
1. 突破限制!AWS 免费服务器,你的 Gemini API 自建中继站!
解决 Gemini API 限制的第一步,是拥有一台自己的服务器。而 AWS 的免费套餐,简直是为我们量身定制的福音!
如何注册开通 AWS 免费 12 个月的服务器
AWS 提供长达 12 个月的免费 EC2 (Elastic Compute Cloud) 服务器使用权,包括 t2.micro 或 t3.micro 实例(每月 750 小时)以及每月 100GB 的出站流量。这对于我们自建一个 Gemini API 中继站来说,绰绰有余!
首先前往官网注册,需要填写一些信息。
我当时填的表单大概长这样(当然,这是个例子哈,信息最好是"真实"的):
plain
姓名:Jane Doe
国家/地区代码:+1 (美国)
电话号码:555-0100
国家/地区:美国
地址行 1:123 Main Street
地址行 2:Apartment 4B
城市:Anytown
州/省/自治区/直辖市或地区:California
邮政编码:90210
跟着 AWS 官网的引导一步步操作,选择你的 EC2 实例类型(推荐 Amazon Linux 2023 或 Amazon Linux 2),创建并下载你的 SSH 密钥对(.pem 文件),然后启动你的实例。别忘了,那个 .pem 文件是你的服务器的"钥匙",务必妥善保管!🔑
服务器启动后,你就能在 EC2 控制台看到它的公共 IP 地址和公共 DNS 名称了,比如 ec2-12352-12348.us-east-2.compute.amazonaws.com
这个后面会用到
连接你的服务器
我个人是用 MobaXterm 来管理我的 Linux 服务器,因为它集成了 SSH 客户端、SFTP、X server 等功能,非常方便。
连接步骤很简单:
- 打开 MobaXterm。
- 点击 "Session" -> "SSH"。
- 在 "Remote host" 填入你的 EC2 公共 DNS(例如 ec2-12352-12348.us-east-2.compute.amazonaws.com)。
- 勾选 "Specify username" 并填入 ec2-user(Amazon Linux 默认用户)。
- 勾选 "Use private key",然后选择你之前下载的 mySec.pem 文件。
- 点击 "OK" 就可以连接啦!
如果一切顺利,你就能看到熟悉的命令行界面了!🎉

2. 磨刀不误砍柴工:Docker 及环境配置踩坑记 🛠️
在服务器上运行应用程序,Docker 绝对是首选!它能让你的应用在一个隔离的环境中运行,移植性强,管理起来也方便。
安装 Docker
首先,连接到你的 EC2 实例。第一件事永远是更新系统包,保持最新状态:
bash
sudo dnf update -y
# 或者如果你是 Amazon Linux 2,也可以用 sudo yum update -y
接下来是安装 Docker Engine。这里我遇到了第一个小坑,因为我的系统是 Amazon Linux 2023 (AL2023),它和之前的 Amazon Linux 2 (AL2) 在包管理上有细微差别。
🔥 踩坑点 1:EPEL 仓库与 AL2023 的兼容性问题
我习惯性地尝试安装 epel-release,结果系统告诉我"不受支持":
bash
sudo yum install -y epel-release
# 报错:sudo yum install -y epel-release 这个命令在我的系统上不受支持。因为是先版本的亚马逊服务器
原来,AL2023 已经将许多常用工具直接集成到默认仓库中,或者使用 dnf 作为主要的包管理器(虽然 yum 很多时候是 dnf 的别名)。
正确的安装姿势(针对 AL2023):
bash
sudo dnf install -y docker
# 或者 sudo yum install -y docker
如果你是 Amazon Linux 2 (AL2):
bash
sudo amazon-linux-extras install docker -y
安装完成后,启动 Docker 服务并设置开机自启:
bash
sudo systemctl start docker
sudo systemctl enable docker
赋权 Docker,告别 sudo!
默认情况下,只有 root 用户才能运行 Docker 命令。每次都敲 sudo 实在太麻烦了!我们需要把 ec2-user 添加到 docker 用户组:
bash
sudo usermod -a -G docker ec2-user
⚠️ 踩坑点 2:用户组生效需要重新登录!
执行完上面那条命令,你可能立刻尝试 docker run hello-world,结果发现还得加 sudo。别急!这是因为用户组的更改需要你注销当前的 SSH 会话并重新登录才能生效。
重新登录 MobaXterm 后,不带 sudo 运行 docker run hello-world,如果看到"Hello from Docker!",恭喜你,Docker 环境已经准备就绪!🥳
bash
docker run hello-world
3. Docker Compose 登场!Gemini Balance 容器轻松跑起来 🚀
为了更优雅地管理我的 Gemini Balance 容器,我们需要 Docker Compose。它能通过一个简单的 docker-compose.yml 文件定义和运行多个 Docker 容器。
下面介绍的 .env 和 dock-compose.yaml 文件均可在仓库地址中拷贝
.env 只需要复制前11行就行了
创建项目目录和 .env 文件
首先,为你的项目创建一个专门的目录,这样所有相关文件都能整洁地放在一起:
bash
mkdir my-gemini-app
cd my-gemini-app
接着,创建一个 .env 文件。这个文件用于存放环境变量,特别是那些敏感信息,比如 API 密钥。现在可以先创建一个空文件,等拿到具体配置再填入:
bash
touch .env
将以下内容粘贴进去:
plain
# 数据库配置
DATABASE_TYPE=mysql
#SQLITE_DATABASE=default_db
MYSQL_HOST=gemini-balance-mysql
#MYSQL_SOCKET=/run/mysqld/mysqld.sock
MYSQL_PORT=3306
MYSQL_USER=gemini
MYSQL_PASSWORD=change_me
MYSQL_DATABASE=default_db
API_KEYS=["AIzaSyxxxxxxxxxxxxxxxxxxx","AIzaSyxxxxxxxxxxxxxxxxxxx"]
ALLOWED_TOKENS=["sk-123456"]
API_KEYS 记得填你自己的Gemini Api keys 你可以填很多个来进行负载轮询 达到无限爽用的体验
ALLOWED_TOKENS 记得改的复杂点 并且记住它。等下登录 web界面会用到
编写 docker-compose.yml
这是 Docker Compose 的核心!它定义了你的服务如何运行。
bash
vi docker-compose.yml
将以下内容粘贴进去:
yaml
volumes:
mysql_data:
services:
gemini-balance:
image: ghcr.io/snailyp/gemini-balance:latest
container_name: gemini-balance
restart: unless-stopped
ports:
- "8000:8000"
env_file:
- .env
depends_on:
mysql:
condition: service_healthy
healthcheck:
test: ["CMD-SHELL", "python -c \"import requests; exit(0) if requests.get('http://localhost:8000/health').status_code == 200 else exit(1)\""]
interval: 30s
timeout: 5s
retries: 3
start_period: 10s
mysql:
image: mysql:8
container_name: gemini-balance-mysql
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: your_root_password
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
# ports:
# - "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1"]
interval: 10s # 每隔10秒检查一次
timeout: 5s # 每次检查的超时时间为5秒
retries: 3 # 重试3次失败后标记为 unhealthy
start_period: 30s # 容器启动后等待30秒再开始第一次健康检查
启动容器:又一个命令坑!🤯
安装 Docker Compose(如果你的系统没有预装):
bash
sudo dnf install -y docker-compose # 针对 AL2023 或其他较新系统
# 或者 sudo yum install -y docker-compose
如果安装失败。按照下面的安装独立的 docker-compose
:
- 下载 Docker Compose 二进制文件: 你可以从 Docker Compose 的 GitHub 发布页面下载最新版本。我们下载到
/usr/local/bin
目录,并确保它有执行权限。
bash
sudo curl -L "https://github.com/docker/compose/releases/download/v2.24.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
2.添加执行权限:
bash
sudo chmod +x /usr/local/bin/docker-compose
3.验证安装:
docker-compose version
4.最终启动容器
bash
sudo docker-compose up -d
等待片刻,容器启动成功。查看容器状态
bash
docker ps

当当!!此时服务实际上已经部署成功了!我们只需要去AWS 开启 8000端口即可正常访问了!
前往 EC2 - 安全组 - 选择安全组 - 编辑规则 - 添加 8000端口的入站规则


此时复制你的EC2 公共DNS域名加上端口 类似http://ec2-52-xxsss.compute.amazonaws.com:8000
在浏览器中输入回车能看到下面的页面。就说明你配置成功啦。


4. 门面担当 Nginx:域名与反向代理的艺术 🌐
服务跑起来了,但它还在 8000 端口,而且是 HTTP 的。为了让它能通过你自己的域名访问,并且穿上 HTTPS 的"安全衣",我们需要 Nginx。
如果你对安全无所谓~ 可以直接跳到
应用落地:CherryStudio 中集成你的专属 Gemini API!
章
域名准备
首先,你需要一个自己的域名(例如 gemini.eu.cc)
- 更新 DNS: 在你的域名注册商那里,添加一条 A 记录,将你的域名(例如 geminihu.eu.cc)指向这个AWS 公网IP。
安装 Nginx
回到你的 EC2 服务器,安装 Nginx:
bash
sudo dnf install -y nginx
# 或者 sudo yum install -y nginx
启动 Nginx 服务并设置开机自启:
bash
sudo systemctl start nginx
sudo systemctl enable nginx
在 AWS 控制台,修改你的 EC2 实例的安全组:
- 入站规则 中,确保 HTTP (80 端口) 和 HTTPS (443 端口) 都对 0.0.0.0/0(所有人)开放。这是 Certbot 验证域名和用户访问 HTTPS 所必需的。
然后在浏览器中访问你的 EC2 公共 IP 地址,如果看到 Nginx 的欢迎页面,说明 Nginx 已经跑起来了!
配置 Nginx 反向代理
我们将创建一个 Nginx 配置文件来转发请求到你的 Docker 容器。
bash
sudo vi /etc/nginx/conf.d/gemini-balance.conf
输入以下基础配置(这是最初的 HTTP 配置):
nginx
server {
listen 80;
server_name geminihu.eu.cc; # 替换成你的域名
location / {
proxy_pass http://127.0.0.1:8000; # 你的 Docker 容器内部服务的端口
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;
proxy_read_timeout 90;
}
}
保存并退出。然后检查 Nginx 配置语法并重新加载:
bash
sudo nginx -t
sudo systemctl reload nginx
现在,通过 http://你的域名 访问,你应该能看到你的 Gemini Balance 应用内容了!
5. 安全第一!SSL 证书,让你的服务穿上 HTTPS 的盔甲 🔒
让你的服务从 HTTP 升级到 HTTPS,不仅更安全,也更专业!我们将使用 Certbot 和 ZeroSSL 来实现。
安装 Certbot
在 AL2023 上安装 Certbot 非常简单:
bash
sudo dnf install -y certbot python3-certbot-nginx
证书申请:又双叒叕是坑!😅
我首先尝试使用 Let's Encrypt 申请,结果遇到了速率限制!
⚠️ 踩坑点 4:Let's Encrypt 的速率限制,特别是针对公共后缀域名!
bash
An unexpected error occurred:
too many certificates (50) already issued for "eu.cc" in the last 168h0m0s, retry after 2025-07-08 10:43:06 UTC
我当时一脸懵逼:"我这域名是新买的呀!" 后来才明白,eu.cc 这种域名,被 Let's Encrypt 视为一个"公共后缀"(Public Suffix),类似于 .co.uk。这意味着所有 *.eu.cc 的子域名(包括我的 geminihu.eu.cc)的证书申请,都会计入 eu.cc 这个注册域名的整体限制!如果这个公共后缀下的子域名在一周内被申请了超过 50 个证书,那么整个域名就得排队等重置了。
解决方案:等待或更换 CA。 既然时间不多,我选择更换 CA 到 ZeroSSL。
ZeroSSL 申请证书:EAB 凭证与超时挑战
我注册了 ZeroSSL 账户,并在其面板中找到了 EAB (External Account Binding) 凭证(Key ID 和 HMAC Key)。然后尝试用 Certbot 申请:
bash
sudo certbot certonly --nginx \
--server https://acme.zerossl.com/v2/DV90 \
--eab-kid v3pJQ-kK7g \
--eab-hmac-key xxxasdf-LDxD_X7T9bczBDlqzvnm-y2Awwu2RtQAn_hK5g \
-d geminihu.eu.cc \
--email example@qq.com \
--agree-tos \
--non-interactive
eab-kid eab-hmac-key 替换为你自己的ZeroSSL的 EAB 凭证
等待几分钟后,应该就能成功看到下面的输出了了!👍
bash
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/geminihu.eu.cc/fullchain.pem
Key is saved at: /etc/letsencrypt/live/geminihu.eu.cc/privkey.pem
This certificate expires on 2025-10-06.
...
手动配置 Nginx HTTPS,解决 Certbot 遗漏问题 😵💫
正常来说 Certbot 既然成功了,Nginx 肯定已经自动配置好了 HTTPS。结果一看配置文件,傻眼了------它还停留在 HTTP 状态!
⚠️ 踩坑点 6:Certbot 有时不会自动配置 Nginx HTTPS!
这意味着我需要手动为 Nginx 添加 HTTPS 配置。Certbot 已经把证书文件放到了 /etc/letsencrypt/live/geminihu.eu.cc/ 目录下,所以我们直接引用它们就好。
编辑 gemini-balance.conf:
bash
sudo vi /etc/nginx/conf.d/gemini-balance.conf
粘贴以下完整的 Nginx 配置(它包含了 HTTP 到 HTTPS 的重定向,以及 HTTPS 的配置):
nginx
# HTTP 到 HTTPS 的重定向
server {
listen 80;
listen [::]:80; # IPv6 支持
server_name geminihu.eu.cc; # 替换成你的域名
# 永久重定向所有 HTTP 请求到 HTTPS
return 301 https://$host$request_uri;
}
# HTTPS 配置
server {
listen 443 ssl http2; # 监听 443 端口,启用 SSL/TLS 和 HTTP/2
listen [::]:443 ssl http2; # IPv6 支持
server_name geminihu.eu.cc; # 替换成你的域名
# SSL 证书和私钥路径 (Certbot 生成的)
ssl_certificate /etc/letsencrypt/live/geminihu.eu.cc/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/geminihu.eu.cc/privkey.pem;
# 额外的 SSL/TLS 安全配置 (Certbot 推荐的最佳实践)
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # DH 参数文件(如果存在)
# 反向代理到你的 Docker 容器
location / {
proxy_pass http://127.0.0.1:8000; # 你的 Docker 容器内部服务的端口
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;
proxy_read_timeout 90;
}
}
保存并退出。
权限问题:Nginx 无法读取证书!😱
当我满心欢喜地运行 sudo nginx -t
检查配置时,又一个报错给了我当头一棒:
bash
nginx: [emerg] cannot load certificate "/etc/letsencrypt/live/geminihu.eu.cc/fullchain.pem": BIO_new_file() failed (SSL: error:8000000D:system library::Permission denied
以及日志文件的权限问题:
bash
nginx: [alert] could not open error log file: open() "/var/log/nginx/error.log" failed (13: Permission denied)
⚠️ 踩坑点 7:Nginx 运行用户权限不足!
这是经典的权限问题。Nginx 的工作进程通常以一个非 root 用户(比如 nginx 用户)运行,而 Certbot 生成的证书文件和 Nginx 日志目录的权限默认可能只允许 root 用户访问。
解决方案:赋予 Nginx 用户正确的权限!
- 确定 Nginx 运行用户: 通常是 nginx。可以通过
sudo cat /etc/nginx/nginx.conf | grep user
确认。 - 调整日志目录权限:
bash
sudo chown -R nginx:nginx /var/log/nginx/
sudo chmod -R 755 /var/log/nginx/
- 调整证书目录权限(核心!): 确保 Nginx 用户可以读取证书文件。
bash
sudo chgrp -R nginx /etc/letsencrypt/archive
sudo chgrp -R nginx /etc/letsencrypt/live
sudo chmod -R g+rX /etc/letsencrypt/archive
sudo chmod -R g+rX /etc/letsencrypt/live
- 修复 Nginx http2 警告: 顺便把之前
nginx -t
看到的 http2 警告也改掉。
将listen 443 ssl http2;
拆分成:
nginx
listen 443 ssl;
listen [::]:443 ssl;
http2 on; # 单独一行
再次运行 sudo nginx -t
,这次应该会显示 syntax is ok 和 test is successful!
最后,重新加载 Nginx 配置:
bash
sudo systemctl reload nginx
现在,你的服务应该可以通过 https://geminihu.eu.cc
访问了!而且,HTTP 请求也会自动跳转到 HTTPS!🔒✨
6. 应用落地:CherryStudio 中集成你的专属 Gemini API!
终于到了最激动人心的时刻!你的 Gemini API 中继站已经上线并被 HTTPS 保护了!现在,你可以在你的应用程序中愉快地使用它,绕过那些恼人的 API 限制了。
以 CherryStudio 为例演示
配置模型供应商
- 点击左侧 设置 - 模型服务 - 添加
- 输入名称(例如 GeminiBalance)。提供商类型选择
Gemini

- 配置API密钥 与 API地址。密钥为登录设置的密钥
sk-xxx
地址为你的 https域名(或者最初的DNS域名:8000)

- 添加模型:
gemini-2.5-pro
gemini-2.5-flash

最终效果类似这样

接下来就可以在聊天页面切换到 这个模型愉快的使用啦。你可以多配置几个账户的 API KEY让 Gemini Balance 进行负载均衡轮询使用从而达到无限制使用的效果!

总结
回顾一下,我们经历了一场从零开始,在 AWS 免费服务器上搭建 Gemini API 中继站的冒险!我们:
- 🚀 成功开通了 AWS EC2 免费服务器。
- 📦 完美安装并配置了 Docker 环境,并解决了用户组权限问题。
- 🐳 运用 Docker Compose 优雅地运行了 Gemini Balance 容器,并搞定了命令语法差异。
- 🌐 巧妙地使用 Nginx 作为反向代理,并设置了自定义域名。
- 🔒 排除万难,最终为服务添加了 HTTPS 证书。
- ✨ 最终,将自建的 Gemini API 中继站集成到了应用程序中,从此告别 API 限制的烦恼!
希望我的这些经验和踩坑记录,能帮助你在自己的技术探索之路上更加顺利!如果你觉得这篇文章对你有帮助,不妨点个赞,分享给更多需要的朋友,或者在评论区留下你的想法,我们一起交流进步!
感谢你的阅读!我们下期再见!👋