uwsgi 无 uwsgi_cache_path 配置项,其缓存为内存型,需通过 --cache 启用并用 uwsgi.cache_get/set 在应用层精准控制,配合 route 自动缓存可高效规避重复渲染。

uwsgi_cache_path 并不是 uWSGI 的原生配置项 —— 它不存在于 uWSGI 的官方参数列表中。你可能混淆了 Nginx 的 proxy_cache_path 或某些第三方插件/自定义脚本中的命名。uWSGI 本身不提供磁盘级缓存路径配置(如 uwsgi_cache_path),它内置的缓存机制是内存驻留型,通过 --cache 参数启用,并由 uwsgi.cache_* Python API 操作。
要规避 Python 密集型计算服务在高负载下的重复渲染损耗,核心思路不是“配一个 cache path”,而是用对 uWSGI 缓存 + 合理触发策略 + 应用层协同。以下是具体、可落地的配置与实践方式:
✅ 正确启用 uWSGI 内置缓存(内存级)
uWSGI 缓存默认关闭,需显式声明:
[uwsgi] # 启用名为 'default' 的缓存,大小 100MB,1000 个槽位(key 数上限) cache = default:100 # 可选:启用多缓存(如区分用户/公共/临时) # cache2 = users:50 # cache2 = public:200
⚠️ 注意:该缓存完全驻留在主进程内存中,worker 进程共享访问(非每个 worker 独立一份),适合存储跨请求共享、计算代价高、更新频率低的结果(如模板渲染结果、聚合统计、静态 API 响应)。
✅ 在 Python 应用中主动缓存渲染结果
不要依赖自动缓存,而是用 uwsgi.cache_get/set 精准控制:
import uwsgi
def expensive_render(template_name, context):
# 构建稳定缓存 key(避免含动态时间戳或 session id)
cache_key = f"render:{template_name}:{hash(frozenset(context.items()))}"
# 尝试读缓存
cached = uwsgi.cache_get(cache_key)
if cached is not None:
return cached
# 执行真实渲染(如 Jinja2、Django Template、自定义 HTML 生成)
result = do_actual_render(template_name, context)
# 写入缓存,过期 300 秒(按业务调整)
uwsgi.cache_set(cache_key, result, 300)
return result
- ✅ Key 必须确定性:避免
datetime.now()、request.session.session_key等不可复现字段 - ✅ Value 是 bytes 或 str(Python 3 中推荐 bytes)
- ✅
expire单位为秒,设为0表示永不过期(慎用)
✅ 配合路由规则,让 uWSGI 自动缓存响应(免改应用代码)
适用于无状态、GET-only、幂等接口(如 /api/chart?period=week):
[uwsgi]
# 启用缓存(同上)
cache = default:100
# 对匹配 /api/chart 的 GET 请求自动缓存响应(200 状态码)
route = ^/api/chart.*\? method=GET,cache:key=${REQUEST_URI},cache:timeout=120
# 或更精细:仅缓存特定 query 参数组合
# route = ^/api/chart\?period=(day|week|month) method=GET,cache:key=chart_${period},cache:timeout=180
✅ uWSGI 会自动将响应体存入缓存,并在后续相同请求时直接返回,跳过整个 Python 应用逻辑 —— 这才是规避“重复渲染”的最高效方式。
✅ 防止缓存污染与内存失控
密集计算服务容易因 key 泛滥导致缓存 OOM:
- ❌ 避免用用户 ID、随机 UUID、毫秒时间戳作 key 主干
- ✅ 使用
uwsgi.cache_exists()和uwsgi.cache_del()主动清理失效数据 - ✅ 设置
reload-on-as = 128(单位 MB):当 uWSGI 进程 RSS 内存超限时自动重启 worker - ✅ 开启
memory-report = true,定期检查缓存占用(日志中可见cache usage行)
不复杂但容易忽略:uWSGI 缓存不是“开箱即用”的 CDN 替代品,它需要你明确界定哪些结果值得缓、怎么构造 key、何时失效。用对了,能直接砍掉 70%+ 的 CPU 渲染开销;用错了,反而增加锁竞争和内存碎片。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











