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_PASSWORDSECRET_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_varygzip_proxiedgzip_comp_level 6gzip_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 --versiongit loglscpu 等) 首次计算后缓存 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.htmldemo11.htmldemo_archive.htmlpltrack.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 locationadd_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 条路由通过回归验证。