Debian环境下Django+Apache+mod_wsgi的CSS文件缓存更新问题
既然你已经排除了浏览器缓存的问题,那咱们就从服务器端的配置和运行逻辑入手排查,下面是几个大概率的原因和对应的解决方法:
1. 检查Apache的静态文件缓存规则
Apache默认可能会给CSS、JS这类静态资源设置缓存策略,导致修改后的文件不会被立即读取。你可以打开站点的Apache配置文件(比如/etc/apache2/sites-available/your-site.conf),看看有没有类似下面的缓存配置:
<FilesMatch "\.(css|js|png|jpg|gif)$"> Header set Cache-Control "max-age=3600, public" </FilesMatch>
如果有这种配置,要么临时注释掉测试,要么调整缓存参数为强制不缓存:
<FilesMatch "\.(css|js|png|jpg|gif)$"> Header set Cache-Control "no-cache, no-store, must-revalidate" Header set Pragma "no-cache" Header set Expires 0 </FilesMatch>
修改后不用急着重启服务器,执行sudo systemctl reload apache2重载配置即可,再修改CSS测试效果。
2. 确认Django静态文件配置与同步步骤
Django的静态文件如果没有正确同步到STATIC_ROOT,Apache可能一直读取旧文件副本。先检查settings.py里的配置:
STATIC_URL = '/static/' STATIC_ROOT = '/绝对路径/到你的项目/static/' # 必须是绝对路径,不能用相对路径
每次修改app下static目录里的CSS后,你有没有执行python3 manage.py collectstatic?这个命令会把所有app的静态文件同步到STATIC_ROOT,只有这里的文件才会被Apache访问到。
同时要确保Apache配置里正确指向了STATIC_ROOT:
Alias /static/ /绝对路径/到你的项目/static/ <Directory /绝对路径/到你的项目/static/> Require all granted </Directory>
注意Alias末尾的斜杠要和STATIC_URL保持一致,避免路径匹配出错。
3. 调整mod_wsgi的运行模式
mod_wsgi有嵌入式和守护进程两种运行模式:
- 如果是嵌入式模式(配置里没有
WSGIDaemonProcess),Django应用会被加载到Apache主进程中,静态文件容易被缓存,而且必须重启Apache才能生效。建议改成守护进程模式,配置示例:
WSGIDaemonProcess your-site python-home=/你的虚拟环境路径 python-path=/你的项目根路径 WSGIProcessGroup your-site WSGIScriptAlias / /你的项目根路径/wsgi.py
- 如果已经用了守护进程模式,执行
sudo systemctl reload apache2就能让mod_wsgi重新加载应用,不需要重启整个Apache,修改的静态文件也会被及时读取。
4. 验证文件权限与修改时间
有时候文件权限不对,Apache无法读取新修改的CSS;或者文件修改时间没有更新(比如用同步工具导致mtime不变),也会触发缓存。你可以执行这两个命令修复:
sudo chown www-data:www-data /你的项目/static/css/*.css sudo touch /你的项目/static/css/*.css
修改权限并手动更新文件修改时间后,再测试效果。
最后测试
每次调整配置或文件后,先执行sudo systemctl reload apache2,然后用浏览器隐私模式打开站点(彻底排除浏览器缓存干扰),看看CSS是否更新。如果还是不行,去Apache错误日志(/var/log/apache2/error.log)里找线索,比如权限报错、路径匹配错误等。
内容的提问来源于stack exchange,提问作者Kaden S

