From fe2202fe99ce5d869707de90633825a45eba5411 Mon Sep 17 00:00:00 2001 From: handsomezhuzhu <2658601135@qq.com> Date: Tue, 20 Jan 2026 14:17:21 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BC=BA=E5=88=B6=E6=B7=BB=E5=8A=A0=E7=A6=81?= =?UTF-8?q?=E6=AD=A2=E7=BC=93=E5=AD=98=E5=A4=B4=E4=BB=A5=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=BB=A3=E7=90=86=E8=AF=B7=E6=B1=82=E7=9A=84=E7=BC=93=E5=AD=98?= =?UTF-8?q?=E6=8E=A7=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 25 ------------------------- main.go | 14 +++++++------- 2 files changed, 7 insertions(+), 32 deletions(-) diff --git a/README.md b/README.md index 4a1d603..7237650 100644 --- a/README.md +++ b/README.md @@ -2,31 +2,6 @@ 这是一个轻量级的 API 代理服务,旨在统一和简化对各种 AI 服务 API 的访问。它使用 Go 语言编写,支持 Docker 部署。 -## 🚀 阿里云 ESA (边缘安全加速) 配置指南 (非常重要) - -如果你使用了阿里 ESA 加速本服务,**必须**在 ESA 控制台中进行以下设置,否则会出现 `Origin Time-out` (源站超时) 或 AI 回复卡顿(打字机效果失效)的问题。 - -### 1. 缓存配置 (Cache) -请进入 **站点管理** -> **缓存配置**,添加以下规则: - -| 配置项 | 推荐设置 | 说明 | -| :--- | :--- | :--- | -| **边缘缓存过期时间**
(Edge Cache TTL) | **不缓存**
(或设置为 0秒) | **核心设置**。必须禁止 CDN 节点缓存 AI 的接口响应,否则第二个用户会看到上一个用户的对话,或者直接报错。建议针对 API 目录(如 `/openai/*`)设置。 | -| **浏览器缓存过期时间**
(Browser Cache TTL) | **不缓存** | 禁止客户端浏览器缓存接口结果。 | -| **查询字符串** | **保留** (或 遵循源站) | 某些 AI API 使用 URL 参数传递版本号或签名,不可忽略。 | - -### 2. 回源配置 (Origin) - 解决超时问题的关键 -ESA 默认的连接超时时间较短(通常 30秒),而 AI 模型(特别是推理模型)可能需要 60秒+ 才能生成第一个字。 - -请进入 **站点管理** -> **回源配置**: - -* **读超时时间 (Read Timeout)**: 修改为 **120秒** 或 **300秒**。 - * *说明*: 如果不改这个,AI 思考超过 30秒时,ESA 会认为源站挂了,直接切断连接并报 `Origin Time-out`。 - -### 3. 开发模式 (Debug) -如果配置后仍然有问题,可以暂时开启 **“开发模式”**。这会强制所有请求绕过缓存节点直接回源,用于排查是否是缓存规则导致的问题。 - ---- ## 功能特性 diff --git a/main.go b/main.go index 7b4733a..6d542a2 100644 --- a/main.go +++ b/main.go @@ -311,14 +311,14 @@ func init() { // Nginx 和大部分 CDN 识别这个 Header 来禁用缓冲 res.Header.Set("X-Accel-Buffering", "no") - // 确保如果是流式传输,Cache-Control 设置正确 - // content-type 包含 event-stream 时,强制不缓存 + // [修改点] 针对经过代理的所有请求,强制添加禁止缓存头 + // 配合 CDN 的 "遵循源站" 策略,实现精细化控制 + res.Header.Set("Cache-Control", "no-cache, no-store, must-revalidate") + res.Header.Set("Pragma", "no-cache") + res.Header.Set("Expires", "0") + + // 针对流式传输的额外强化 if strings.Contains(res.Header.Get("Content-Type"), "event-stream") { - res.Header.Set("Cache-Control", "no-cache") - res.Header.Set("Connection", "keep-alive") - } - return nil - } // Optional: Custom error handler proxy.ErrorHandler = func(w http.ResponseWriter, r *http.Request, err error) {