Apache部署的Django 2.0.2网站重载时在新旧状态间反复切换
我之前在Webfaction托管Django项目时也碰到过几乎一模一样的诡异状况——修改代码重启Apache后,第一次加载能看到最新修改的内容,按F5刷新又变回旧版本,来回切换,而且不止样式,连业务逻辑代码的改动都受影响。结合踩过的坑,这大概率是Apache进程未完全重启或多进程共存导致请求分流的问题,给你几个针对性的解决方案:
彻底重启Apache,放弃优雅重启
Webfaction默认的apachectl restart是"优雅重启",旧的Apache子进程会处理完当前请求再退出,过渡阶段新旧进程会同时存在,请求可能随机命中旧进程(返回旧代码)或新进程(返回新代码)。解决方法是先彻底停服,再重新启动:apachectl stop # 等待3-5秒,确保所有进程完全终止 apachectl start你可以用
ps aux | grep httpd命令检查,确保重启后没有旧的httpd进程残留。手动清理mod_wsgi守护进程
如果你的Django是用mod_wsgi的daemon模式部署的,Apache重启可能不会自动杀掉旧的daemon进程,这些旧进程会继续运行旧版本的代码。你可以手动杀掉所有mod_wsgi相关进程:ps aux | grep mod_wsgi | awk '{print $2}' | xargs kill -9之后再重启Apache,确保新的daemon进程加载最新代码。
排查Django模板缓存(针对模板修改场景)
虽然你说问题不止于样式,但如果涉及模板改动,Django在生产环境(DEBUG=False)会自动缓存模板。你可以临时在settings.py的TEMPLATES配置里关闭模板缓存验证:TEMPLATES = [ { # ... 其他原有配置 'OPTIONS': { 'debug': True, # 暂时注释掉缓存加载器,改用直接加载 'loaders': [ 'django.template.loaders.filesystem.Loader', 'django.template.loaders.app_directories.Loader', ], }, }, ]这样每次请求都会重新读取模板文件,验证是否是缓存导致的问题。问题解决后记得改回缓存加载器,避免影响生产性能。
快速排除浏览器缓存干扰
虽然从症状看可能性不高,但可以用浏览器隐私/无痕模式打开网站,或者按Ctrl+Shift+R强制刷新(跳过浏览器缓存)验证。如果问题消失,再针对性调整静态资源的缓存头配置。
另外,你提到之前背景透明度也出现过同样问题,说明这是环境层面的共性问题,不是某次代码修改的特例,优先从Apache进程管理和mod_wsgi配置入手排查,应该能快速解决。
内容的提问来源于stack exchange,提问作者Michael S.

