Files

155 lines
4.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 🐞 群分析T2I渲染超时排查记录
**日期**2026-04-29
**主人**☭Kronecker
**排查者**ATRI 🥕
---
## 📋 问题描述
执行 `/群分析` 命令生成群聊分析报告后尝试通过T2I服务将其渲染为图片时失败返回 `500 Internal Server Error`。QQ收到内容为 `Internal Server Error` 的21字节文件。
---
## 🔍 排查过程
### Step 1: 查看T2I服务日志
通过 `journalctl -u t2i` 排查T2I服务端日志发现以下错误
```
playwright._impl._errors.TimeoutError: Page.goto: Timeout 100000ms exceeded.
Call log:
- navigating to "file:///opt/astrbot-t2i-service/data/rendered_xxx.html", waiting until "load"
```
**结论**Playwright浏览器在打开HTML文件时等待 `load` 事件超时100秒
### Step 2: 分析超时HTML文件
| 属性 | 值 |
|:---|:---|
| HTML文件路径 | `/opt/astrbot-t2i-service/data/rendered_xxx.html` |
| 文件大小 | 153KB |
| 行数 | 2856行 |
### Step 3: 确认外部字体是罪魁祸首
HTML模板中引用了 **3个LXGW WenKai (霞鹜文楷) web字体文件**
| 字体文件 | CDN地址 |
|:---|:---|
| LXGW WenKai Regular | `https://tc.ciallo.ccwu.cc/file/...LXGWWenKai-Regular.woff2` |
| LXGW WenKai Medium | `https://tc.ciallo.ccwu.cc/file/...LXGWWenKai-Medium.woff2` |
| LXGW WenKai Mono | `https://tc.ciallo.ccwu.cc/file/...LXGWWenKaiMono-Regular.woff2` |
**每个字体文件约8MB**3个合计 **~24MB**。
### Step 4: 检查CDN可达性
CDN服务器 `tc.ciallo.ccwu.cc` 本身可达:
- HTTP 200 ✅Cloudflare缓存命中
- 从服务器有代理无代理均可访问
- 但文件过大8MB/个)
### Step 5: 检查代理配置
**插件配置**AstrBot WebUI - T2I渲染环境切换
- 渲染环境:内地
- Google Fonts镜像`https://fonts.loli.net`
- Gstatic镜像`https://gstatic.loli.net`
**系统代理变量**
```
HTTP_PROXY=http://127.0.0.1:7890
HTTPS_PROXY=http://127.0.0.1:7890
ALL_PROXY=socks5h://127.0.0.1:7890
```
**T2I系统服务文件**`/etc/systemd/system/t2i.service`
```
[Service]
Type=simple
WorkingDirectory=/opt/astrbot-t2i-service
ExecStart=/usr/bin/python3 /opt/astrbot-t2i-service/main.py
Environment=PLAYWRIGHT_CHROMIUM_EXECUTABLE=/usr/bin/chromium-browser
Restart=always
RestartSec=5
```
⚠️ **没有配置任何代理环境变量!**
---
## 🎯 根因确认
```
群分析HTML模板 → 引用3个@font-face外部字体(各~8MB)
→ Playwright浏览器打开本地HTML → 尝试从CDN下载字体
→ 浏览器无代理配置(T2I systemd服务未继承系统代理)
→ 24MB字体下载缓慢 → 等待100秒 → 超时TimeoutError
→ 返回500 Internal Server Error
```
### 核心问题链
1. 群分析模板使用了 **外部web字体**`tc.ciallo.ccwu.cc`
2. 每个字体文件 **8MB**3个共 **24MB**
3. Playwright的 `page.goto()` 默认等待 `load` 事件
4. `load` 事件需要等到所有外部资源(包括字体)加载完毕才触发
5. T2I的systemd服务未配置 `HTTP_PROXY`/`HTTPS_PROXY` 环境变量
6. 浏览器无代理大文件下载慢100秒内未完成 → Timeout
### 为什么自我介绍的T2I渲染成功了
自我介绍的T2I渲染使用的是**行内样式HTML**(无外部资源),页面瞬间加载完成,`load` 事件即刻触发。而群分析模板依赖外部web字体因此超时。
---
## 🛠 修复方案
### 方案A推荐T2I服务添加代理环境变量
`/etc/systemd/system/t2i.service``[Service]` 区域添加:
```
Environment=HTTP_PROXY=http://127.0.0.1:7890
Environment=HTTPS_PROXY=http://127.0.0.1:7890
```
然后执行:
```bash
systemctl daemon-reload
systemctl restart t2i
```
**优点**一劳永逸所有需要外部资源的HTML都能通过代理加载
### 方案B移除外部字体引用
修改群分析HTML模板改用系统字体栈去掉 `@font-face` 引用。
**优点**:不依赖网络加载,渲染速度快
**缺点**:字体不如霞鹜文楷美观
### 方案C修改wait_until策略
T2I渲染时设置 `wait_until: "domcontentloaded"` 而不是 `"load"`,不等字体加载完就截图。
**优点**:改动最小
**缺点**:字体可能没加载完成,截图时显示备选字体
---
## 📎 相关文件
- T2I服务`/opt/astrbot-t2i-service/`
- 服务配置:`/etc/systemd/system/t2i.service`
- T2I日志`journalctl -u t2i`
- 字体CDN`https://tc.ciallo.ccwu.cc/`
- 插件配置AstrBot WebUI → 插件配置 → t2i渲染环境切换
---
*记录者ATRI 🥕 · 2026-04-29 16:45*