共计 1550 个字符,预计需要花费 4 分钟才能阅读完成。
背景痛点
公益站点通常面临三大技术挑战:

- 资源限制:无稳定收入来源导致服务器配置较低,需优化资源占用
- 高并发访问:突发流量可能压垮免费层服务(如 Vercel/Heroku)
- 内容合规 :用户生成内容(UGC) 需实时过滤敏感信息
技术选型
- Flask:轻量但异步支持弱,适合超小型项目
- Django:功能全面但内存占用高,自带 Admin 后台
- FastAPI:异步性能强,自动生成 API 文档(最终选择)
关键对比指标:
| 框架 | 内存占用 | QPS(测试) | 学习曲线 |
|---|---|---|---|
| Flask | 60MB | 1200 | 简单 |
| Django | 210MB | 800 | 中等 |
| FastAPI | 90MB | 3500 | 中等 |
核心实现
异步 API 调用模块
# 带指数退避的重试机制
async def chat_completion_with_retry(prompt: str, max_retries=3):
delay = 1 # 初始延迟 1 秒
for attempt in range(max_retries):
try:
return await openai.ChatCompletion.acreate(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": prompt}]
)
except Exception as e: # 实际需细化异常类型
if attempt == max_retries - 1:
raise
await asyncio.sleep(delay)
delay *= 2 # 指数退避
敏感词过滤设计
- 本地缓存:使用 LRU 缓存最近检测结果
- Redis 缓存:存储高频敏感词模式
- 最终回源:调用第三方 API(如腾讯云内容安全)
Nginx 关键配置
upstream backend {
server 127.0.0.1:8000 weight=3; # 主节点
server 192.168.1.2:8000 backup; # 备用节点
}
server {
listen 443 ssl;
`ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;`
`ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;`
location /api {
`proxy_set_header X-API-KEY $SECRET_KEY;`
proxy_pass http://backend;
}
}
避坑指南
SSL 证书自动续期
使用 Certbot 定时任务:
- 安装 certbot:
sudo apt install certbot python3-certbot-nginx - 创建续期任务:
0 0 */60 * * certbot renew --quiet
API 密钥安全
- 永远不要硬编码在代码中
- 使用
.env文件 +python-dotenv 加载 - 在 CI/CD 中配置环境变量
日志脱敏示例
def sanitize_log(text):
# 移除身份证 / 手机号等
return re.sub(r'\d{17}[\dXx]', '[ID]', text)
延伸思考:零预算弹性扩容
- Serverless 架构:AWS Lambda 按调用量计费
- P2P 网络:用户客户端分担计算压力(谨慎使用)
- 限流降级:当 QPS> 阈值时返回静态提示页
快速验证
# docker-compose.yml
version: '3'
services:
web:
image: ghcr.io/yourname/chatgpt-proxy:latest
environment:
- OPENAI_KEY=${OPENAI_KEY}
ports:
- "8000:8000"
redis:
image: redis:alpine
启动命令:OPENAI_KEY=your_key docker-compose up
实际部署时建议添加 Redis 密码和网络隔离
正文完
