今天早上我醒来时收到sentry的警告,说我的生产服务器空间完全用完了。我花了一些时间通过ncdu
找出原因,结果是我的静态文件夹使用了超过60 GB的空间,特别是django-compressor正在使用的CACHE/js
。
我不完全确定发生了什么,或者为什么有超过500,000个js文件,每个文件都遵循这种格式:output.<random string>.js
。据我理解,不应该只缓存少量的js文件吗?我的项目甚至没有那么多脚本!
在我看来,每个用户都得到了自己的输出文件,而不是共享给每个人的相同的缓存文件。
基本设置:
# STATIC
# ------------------------------------------------------------------------------
# https://docs.djangoproject.com/en/dev/ref/settings/#static-root
# STATIC_ROOT = str(ROOT_DIR / "static")
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
# https://docs.djangoproject.com/en/dev/ref/settings/#static-url
STATIC_URL = "/static/"
# https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/#std:setting-STATICFILES_DIRS
# STATICFILES_DIRS = [os.path.join(BASE_DIR, "static")]
# https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/#staticfiles-finders
STATICFILES_FINDERS = [
"django.contrib.staticfiles.finders.FileSystemFinder",
"django.contrib.staticfiles.finders.AppDirectoriesFinder",
"compressor.finders.CompressorFinder",
]
COMPRESS_ENABLED = True
COMPRESS_PRECOMPILERS = (
('text/x-scss', 'django_libsass.SassCompiler'),
)
COMPRESS_FILTERS = {
"css": [
'compressor.filters.css_default.CssAbsoluteFilter',
# 'compressor.filters.cssmin.CSSMinFilter',
'core.CSSMinFilter.CSSMinFilter',
]
}
生产设置:
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.PyMemcacheCache',
'LOCATION': '127.0.0.1:11211',
}
}
我最初安装django-compressor(https://django-compressor.readthedocs.io/en/stable/quickstart/)是为了解决用户必须手动清除浏览器缓存才能看到模板正确更改的问题。
有什么想法是怎么回事,或者如何解决这个问题?
编辑:
我运行以下命令rm -rf js
来删除所有文件,在一分钟内已经创建了200个文件。
1条答案
按热度按时间cvxl0en21#
在你的代码库中搜索“compress js”。它应该存在于你的django模板(.html文件)中。下面还应该有一个“endcompress”标签。如果在这些标记之间传递了任何上下文变量,请尝试将它们放在外部。例如,在下面的代码中,{{ username }}和{{ userid }}位于压缩标签内。
之前:
之后:
正如@user12758446评论的那样,这些上下文变量在每个请求中都在变化。每次,django-compressor模块都会为更改后的值创建一个新文件。你可以在这里查看它的文档。因此,只要确保您在{% compress js %}和{% endcompress %}中放置的任何内容都是静态的。