Kubernetes环境下Gunicorn部署Django(DEBUG=False)时静态文件无法加载的问题求助
Kubernetes环境下Gunicorn部署Django(DEBUG=False)时静态文件无法加载的问题求助
问题描述
我现在在Kubernetes的Pod里用Gunicorn运行Django应用,当设置DEBUG=False时,静态文件(比如后台管理面板的CSS/JS)完全加载不出来。本地开发时用Django内置的runserver、DEBUG=True的状态下一切正常,但切换到生产模式后,所有静态文件请求都返回404错误。
错误日志
浏览器控制台和Django日志里都能看到类似的404记录:
GET /static/admin/css/base.efb520c4bb7c.css HTTP/1.1" 404 179 GET /static/admin/js/nav_sidebar.7605597ddf52.js HTTP/1.1" 404 179
相关Django配置(settings.py)
我当前的关键配置如下:
DEBUG = False INSTALLED_APPS = [ "django.contrib.staticfiles", # 其他应用... ] MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'whitenoise.middleware.WhiteNoiseMiddleware', # 其他中间件... ] BASE_DIR = Path(__file__).resolve().parent.parent STATIC_URL = '/static/' STATICFILES_STORAGE = "whitenoise.storage.CompressedManifestStaticFilesStorage" STATICFILES_DIRS = [ BASE_DIR / 'static', ] STATIC_ROOT = BASE_DIR / 'staticfiles'
应用启动方式(Docker Entrypoint脚本)
我的Docker启动脚本是这样的:
#!/bin/sh APP_PORT=${PORT:-8000} echo "Migrating database..." /opt/venv/bin/python manage.py migrate --noinput echo "Collecting static files..." /opt/venv/bin/python manage.py collectstatic --noinput echo "Static files collected" echo "Starting server..." /opt/venv/bin/gunicorn secureuri.wsgi:application --bind "0.0.0.0:${APP_PORT}" --workers 1 --access-logfile - --error-logfile - --log-level debug
我已经尝试过的方案
- 确认了
collectstatic命令确实在启动过程中执行了 - 进入容器内执行
ls -la staticfiles/admin/css/,能看到静态文件确实存在于容器中 - 尝试用
python manage.py runserver --insecure在DEBUG=False下启动内置服务器,问题依旧 - 检查了Gunicorn的日志,服务运行正常,没有任何和静态文件相关的错误信息
- 尝试调整Whitenoise的配置(在
INSTALLED_APPS里添加whitenoise.runserver_nostatic,并调整中间件顺序),但还是没解决问题 - 重启过Kubernetes Pod,静态文件仍然返回404
我的问题
- 不用Nginx、S3这类外部服务的前提下,怎么在
DEBUG=False时正确提供静态文件? - 是不是我的Gunicorn或者Kubernetes配置里有什么遗漏的地方?
备注:内容来源于stack exchange,提问作者Izaan
相关产品推荐
相关产品推荐

