venxine.vip 全站优化报告
日期:2026-07-02 ~ 2026-07-03
目标:安全加固、性能提升、工程优化
总完成:16 项(另有 2 项经排查为误报/低收益,已跳过)
这篇是什么:16 项优化的速查报告,重表格和数字,适合当 checklist 回查。想看同一件事的叙事复盘(怎么排优先级、一个人扛运维的心态),看 一个人的全栈运维。其中几项另有独立深挖:Nginx 210→62 行、Tailwind CDN 瘦身、SQLite + Flask g。
一、安全加固(4 项)
| # |
优化项 |
优化前 |
优化后 |
效果 |
| 1 |
Nginx 代理块合并 |
210 行配置,26 个独立 location 块 |
62 行,1 个正则 location 块 |
减少 70%,新增路由无需改 Nginx |
| 2 |
TLS 协议升级 |
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3 |
ssl_protocols TLSv1.2 TLSv1.3 |
TLSv1.0/1.1 已拒绝,符合 PCI DSS |
| 3 |
安全响应头 |
无任何安全头 |
HSTS + X-Frame-Options + X-Content-Type-Options + Referrer-Policy,全路由覆盖 |
防点击劫持、MIME 嗅探、中间人攻击 |
| 4 |
硬编码移除 |
DEMO_PASSWORD 和 SECRET_KEY 明文写死在 app.py |
移至 .env 文件,SECRET_KEY 随机化(openssl rand -hex 24) |
源码零敏感信息泄漏 |
二、性能提升(5 项)
| # |
优化项 |
优化前 |
优化后 |
效果 |
| 5 |
Flask → gunicorn |
python3 app.py(Werkzeug 单线程开发服务器) |
gunicorn 2 sync workers + systemd 托管 + 开机自启 |
并发能力翻倍,进程崩溃自动重启 |
| 6 |
浏览器缓存 |
无 Cache-Control,每次请求全量传输 |
静态资源 immutable, max-age=2592000(30 天) 首页 public, max-age=3600(1 小时) 动态路由 no-store |
二次访问秒开,节省带宽 |
| 7 |
Gzip 压缩 |
仅 gzip on,其余参数全被注释 |
开启 gzip_vary、gzip_proxied、gzip_comp_level 6、gzip_types |
28,625B → 5,491B,压缩 80.8% |
| 8 |
DB 连接复用 |
每个路由函数内多处 sqlite3.connect(),每次请求打开 5-12 次 |
Flask g 对象缓存 + _get_state_db() / _close_state_db() |
每请求最多 1 次 connect |
| 14 |
/system/ 子进程缓存 |
每次请求 fork 10+ 条 subprocess.run()(hermes --version、git log、lscpu 等) |
首次计算后缓存 5 分钟,后续请求直接读内存 |
避免并发 fork 风暴,响应更稳定 |
三、工程优化(7 项)
| # |
优化项 |
优化前 |
优化后 |
效果 |
| 9 |
app.py 模块拆分 |
单文件 3,983 行 / 148KB / 66 条路由 |
提取 utils.py(595 行 / 32KB 工具函数),app.py 减至 3,367 行 |
减少 616 行(15.5%),utils 可独立测试 |
| 10 |
Tailwind 本地构建 |
CDN <script> JSONP 运行时(~300KB,依赖外部) |
本地 <link> 静态 CSS,仅含实际使用的 165 个 class |
首屏 328KB → 46KB,减少 86%,离线可用 |
| 11 |
favicon 瘦身 |
2 个文件:favicon.ico 1.6KB + favicon.png 135KB(512px,无引用) |
favicon.ico 634B(16/32/48/64px 四合一)+ favicon-64.png 5.2KB |
136KB → 5.9KB,节省 95.7%,新增 apple-touch-icon |
| 12 |
worker_connections |
worker_connections 768 |
worker_connections 2048 |
并发连接上限提升 2.7 倍 |
| 13 |
超时参数调优 |
无显式超时设置 |
keepalive_timeout 65 · send_timeout 10 · client_body_timeout 12 · client_header_timeout 12 |
慢客户端更快释放,避免连接堆积 |
| 16 |
render_template_string 移除 |
顶层 import 中存在但全代码零次调用 |
从 import 行移除 |
import 干净,无死引用 |
| 18 |
裸 except: 修复 |
34 处 except:(裸吞异常,出问题无日志) |
全部改为 except Exception: |
语义明确,为后续加 traceback 打基础 |
四、排查后跳过的项(2 项)
| # |
项目 |
原因 |
| 15 |
死模板清理 |
demo10.html、demo11.html、demo_archive.html、pltrack.html 经排查 均有 render_template 调用,非死模板 |
| 17 |
40 处内部 import 上移 |
函数内 import os as _os2 等属于命名空间隔离风格,改动量大、风险高,收益低(不影响性能) |
五、关键数字
| 指标 |
优化前 |
优化后 |
变化 |
| Nginx 配置行数 |
210 行 |
62 行 |
-70% |
| app.py 行数 |
3,983 行 |
3,367 行 |
-15.5% |
| 全站总代码 |
— |
11,725 行 |
30 模板 + 2 模块 + 5 JS + 前端 |
| 首屏加载 |
~328KB |
~46KB |
-86% |
| 首页 Gzip 后 |
28,625B |
5,491B |
-80.8% |
| favicon 体积 |
136KB |
5.9KB |
-95.7% |
| 裸 except 残留 |
34 处 |
0 处 |
全部修复 |
| 每请求 DB 连接 |
5-12 次 |
1 次 |
Flask g 复用 |
| 并发连接上限 |
768 |
2,048 |
+2.7x |
| 安全头覆盖 |
0 |
4 个 |
HSTS + X-Frame + X-Content + Referrer |
| TLS 协议 |
1.0/1.1/1.2/1.3 |
1.2/1.3 only |
PCI DSS 合规 |
| 进程守护 |
无(裸 python3) |
systemd 开机自启 |
崩溃自动重启 |
| 运行模型 |
Werkzeug 单线程 |
gunicorn 2 workers |
并发处理 |
| 根因修复 |
— |
daily-analysis.json 截断修复 |
/chinastock/ 500 → 200 |
六、踩坑记录
| 坑 |
表现 |
解决 |
| gunicorn gthread workers OOM |
3.6GB 内存机器反复 exit code 3 |
降级为 sync workers |
@app.teardown_appcontext 过早关闭 DB |
请求中间阶段连接被回收,后续查询报 closed database |
改为显式 _close_state_db() + g.pop() |
Nginx location 级 add_header 覆盖 server 级 |
添加缓存 location 后安全头丢失 |
每个 location 块显式重复声明四件套 |
systemd-run --collect venv 路径问题 |
Flask module not found |
使用 /etc/systemd/system/ service 文件 + 明确指定 User/WorkingDirectory/ExecStart |
utils.py 提取后缺失全局常量 |
cryptonews/token-stats 500 → NameError: CRON_OUTPUT_DIR |
在 utils.py 中同步常量定义 |
daily-analysis.json JSON 截断 |
/chinastock/ 500 → JSONDecodeError line 13 |
补全截断的 closing 字符串 |
七、当前架构总览
用户请求
│
├─ / → Nginx 静态 serve index.html (46KB)
├─ /favicon.ico, *.css, *.png → Nginx 静态 + Cache-Control immutable 30d
│
└─ /system/ /fundtracker/ 等 → Nginx 反向代理
└─ gunicorn (127.0.0.1:5000, 2 workers)
└─ app.py (3,367行) + utils.py (595行)
├─ Jinja2 模板 ×30 (6,556行)
├─ SQLite (Flask g 复用, 1次/请求)
├─ 硬编码 ↘ .env (零泄漏)
└─ /system/ 子进程结果缓存 5分钟
systemd: venxine-gunicorn.service
Restart=always, 开机自启
八、日常维护速查
# 查看服务状态
systemctl status venxine-gunicorn
# 查看错误日志
tail -f /tmp/gunicorn_error.log
# 修改 Nginx 配置后
sudo nginx -t && sudo nginx -s reload
# 修改 app.py 后
sudo systemctl restart venxine-gunicorn
# 修改 index.html Tailwind class 后
cd /tmp/tw-build && npx tailwindcss -i input.css -o /var/www/venxine.vip/tailwind.min.css --minify
# 恢复备份
cp /home/agentuser/fund-web/app.py.bak.* /home/agentuser/fund-web/app.py
📊 16 项优化,全部 13 条路由通过回归验证。