Django-compressor CACHE/js目录占用空间过大 重复生成JS文件求助
问题根因
- 未开启
COMPRESS_OFFLINE离线压缩模式,默认使用在线实时压缩。如果你的{% compress js %}模板块中包含动态可变内容(比如嵌入了用户ID、请求时间戳、单次有效的随机值、动态拼接的脚本路径,或者存在和用户/请求上下文相关的条件判断逻辑,如{% if user.is_authenticated %}等),每次请求的压缩源内容不一致,compressor会计算不同的哈希值,每次都生成新的output js文件,这是核心问题。 - 没有执行离线压缩预生成静态资源,所有压缩操作都在用户请求时触发,高并发场景下如果多个请求同时命中未缓存的资源,也可能出现重复生成的情况,但该场景不会生成几十万量级的文件。
- 虽然你配置了memcached作为默认缓存,但如果memcached内存占满触发LRU淘汰,compressor的缓存key被清理后会重复生成已有的资源文件,放大存储空间占用。
修复步骤
- 首先排查模板压缩块:把
{% compress js %}块里的所有动态内容、和请求/用户上下文相关的逻辑全部移到压缩块外面,压缩块内仅保留完全静态的JS文件引用、固定不变的JS代码,确保所有请求命中的压缩源内容完全一致,不会生成不同哈希的资源文件。 - 开启离线压缩模式:在生产环境配置中增加以下配置:
COMPRESS_OFFLINE = True
开启后django-compressor只会读取预先生成的压缩文件,不会在用户请求时实时生成新文件,从根源上避免动态生成文件的问题。
3. 调整部署流程:每次上线部署时,在执行完python manage.py collectstatic命令后,新增执行python manage.py compress命令,预生成所有需要的压缩静态资源,生成的文件会直接存入CACHE/js目录,运行时直接读取不会再生成新文件。
4. 临时紧急处理:当前先删除CACHE/js下的所有文件,执行完预生成压缩文件的命令后,可临时将CACHE/js目录权限设为只读,防止程序写入新文件,避免磁盘再次被快速打满。
5. 如果你确实需要保留在线压缩模式,可增加以下优化配置:
# 压缩文件缓存过期时间设为30天,避免缓存key频繁被淘汰 COMPRESS_REBUILD_TIMEOUT = 2592000 # 开启旧缓存文件自动清理 COMPRESS_CLEANUP_OLD = True # 旧压缩文件保留时长,默认30天 COMPRESS_CLEANUP_AGE = 2592000
内容的提问来源于stack exchange,提问作者user12758446
相关产品推荐
相关产品推荐

