共计 1998 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点
直接调用 ChatGPT API 时,开发者常遇到几个典型问题:

- 认证泄露风险:API 密钥硬编码在客户端代码中,容易被逆向工程获取
- 突发流量问题:未做限流控制时,突发请求易触发 429 错误(Too Many Requests)
- 长响应超时:复杂问题处理时 API 响应时间可能超过 30 秒,导致客户端超时
- 地域限制:国内服务器直连 OpenAI 可能遇到网络波动
技术选型
对比主流 API 网关方案:
- Spring Cloud Gateway
- 优势:Spring 生态整合好,支持响应式编程
-
劣势:JVM 内存消耗大,长连接场景性能较差
-
Nginx/OpenResty
- 优势:基于事件驱动模型,支持 Lua 脚本扩展,内存占用低
- 劣势:动态配置需要配合 Consul 等服务发现工具
最终选择 OpenResty 方案,因其:
- Lua 脚本可实现灵活的逻辑控制
- 单机可支撑 10K+ 并发连接
- 社区有成熟的限流和缓存模块
核心实现
JWT 令牌动态注入
通过 Lua 脚本实现认证信息的安全管理:
location /v1/chat/completions {
access_by_lua_block {
local jwt = require "resty.jwt"
local token = jwt:sign(os.getenv("JWT_SECRET"),
{key = ngx.var.http_authorization}
)
ngx.req.set_header("Authorization", "Bearer"..token)
}
}
漏桶算法限流
使用 lua-resty-limit-traffic 模块:
http {
lua_shared_dict my_limit_req_store 100m;
server {
location / {limit_req zone=chatgpt_rate_limit burst=50 nodelay;}
}
}
响应缓存优化
配置多级缓存策略:
proxy_cache_path /tmp/cache levels=1:2 keys_zone=chatgpt_cache:10m inactive=60m;
location / {
proxy_cache chatgpt_cache;
proxy_cache_valid 200 302 5m;
gzip on;
gzip_types application/json;
}
完整配置示例
# nginx.conf 核心片段
upstream chatgpt_backend {
server api.openai.com:443;
keepalive 32;
}
server {
listen 443 ssl;
location /v1/ {
proxy_pass https://chatgpt_backend;
proxy_set_header Host api.openai.com;
# 安全过滤
if ($http_authorization !~* "^Bearer sk-") {return 403;}
# 流式响应配置
proxy_buffering off;
proxy_read_timeout 300s;
}
error_log /var/log/nginx/chatgpt_error.log
format=[$time_local] $status "$request" $body_bytes_sent;
}
性能调优
压测对比
使用 wrk 进行基准测试(8 线程 /100 连接):
| 方案 | QPS | 平均延迟 |
|---|---|---|
| 直连 API | 1200 | 85ms |
| 网关(无缓存) | 950 | 105ms |
| 网关(有缓存) | 2800 | 42ms |
Keepalive 优化
建议配置:
keepalive_requests 1000:单个连接最大请求数keepalive_timeout 75s:空闲连接保持时间- 连接池大小建议为并发数的 1.5 倍
常见问题处理
Streaming Response
需特别注意:
- 禁用 proxy_buffering
- 设置
chunked_transfer_encoding on - 客户端需支持 Transfer-Encoding: chunked
监控指标
关键 Prometheus 指标:
nginx_http_requests_total:请求总量nginx_http_request_duration_seconds:响应时间分布nginx_http_limit_req_rejected:被限流请求数
超时重试策略
建议配置:
proxy_next_upstream error timeout http_502 http_503;
proxy_next_upstream_tries 3;
proxy_next_upstream_timeout 2s;
延伸思考
在实现多租户场景时,如何设计用量统计系统?可以考虑:
- 基于 API Key 的请求分组
- 使用 Redis 的 INCR 命令统计调用次数
- 结合 ELK 实现日志分析与报表
- 实时配额检查的熔断机制
希望这篇指南能帮助你构建稳定的 ChatGPT 代理层。实际部署时,建议先在小流量环境验证配置效果,再逐步扩大规模。
正文完
发表至: 未分类
近三天内
