部署心得与性能优化
服务器配置
- 规格:阿里云轻量应用服务器 2核2G
- 系统:Ubuntu 22.04
- 磁盘:40GB ESSD
部署架构
[Nginx :80/:443]
├── /static/* → 直接返回静态文件
└── /* → Go网关 (:8080)
├── / → 首页
├── /blog* → 博客
└── /api/chat → SSE代理 → Python (:8001)
Nginx配置
server {
listen 80;
server_name your-domain.com;
# 静态文件直接由Nginx处理
location /static/ {
alias /opt/travelagent5/static/;
expires 7d;
add_header Cache-Control "public, immutable";
}
# SSE代理 - 关闭缓冲
location /api/chat {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
proxy_set_header Connection '';
proxy_buffering off;
proxy_cache off;
chunked_transfer_encoding off;
}
# 其他请求转发到Go网关
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
关键点:SSE端点必须关闭proxy_buffering,否则流式消息会被Nginx缓冲,前端收不到实时数据。
进程管理:systemd
# /etc/systemd/system/travelagent5-go.service
[Unit]
Description=TravelAgent-5 Go Gateway
After=network.target
[Service]
Type=simple
ExecStart=/opt/travelagent5/travelagent5
WorkingDirectory=/opt/travelagent5
Restart=always
RestartSec=5
# /etc/systemd/system/travelagent5-py.service
[Unit]
Description=TravelAgent-5 Python Backend
After=network.target
[Service]
Type=simple
ExecStart=/opt/travelagent5/venv/bin/uvicorn backend.main:app --host 0.0.0.0 --port 8001
WorkingDirectory=/opt/travelagent5
Restart=always
RestartSec=5
EnvironmentFile=/opt/travelagent5/.env
性能优化
1. Go端
- embed.FS:所有静态文件编译进二进制,零文件系统IO
- goldmark缓存:博客Markdown只在首次请求时渲染,后续直接返回缓存HTML
- 连接池:Go到Python的HTTP连接复用
2. Python端
- 模型选择:DeepSeek-V3,响应快、价格低
- 工具缓存:flyai-cli结果可加TTL缓存(减少重复调用)
- 超时控制:每个Agent设置30秒超时,避免阻塞
3. 前端
- CDN加载marked.js:不占用服务器带宽
- SSE而非WebSocket:更轻量,Nginx原生支持
- CSS Grid:浏览器原生布局,无JS计算开销
监控
# 查看Go网关状态
systemctl status travelagent5-go
# 查看Python后端状态
systemctl status travelagent5-py
# 查看内存使用
free -h
# 查看日志
journalctl -u travelagent5-go -f
journalctl -u travelagent5-py -f
问题优化(不断更新中)
Q: Python后端OOM怎么办?
A: 2G内存下,Python进程可能因LLM调用过多而OOM。解决方案:
- 限制并发请求数(uvicorn workers设为1)
- 每个Agent设置超时
- 监控内存使用,设置systemd的
MemoryMax
Q: SSE连接断开怎么办?
A: 前端实现自动重连:
// 断线后3秒重连
source.onerror = () => setTimeout(connect, 3000);
导航
← 上一篇:技术选型详解:为什么选这些技术栈? → 下一篇:TravelAgent-5 记忆系统:三层记忆架构与上下文管理