使用Apache/Gunicorn部署Django时静态文件无法加载求助
排查Django+Gunicorn+Apache静态文件加载失败问题
我来帮你梳理下可能导致静态文件无法加载的几个关键点,结合你给出的配置逐一分析:
1. 静态文件是否已正确收集到STATIC_ROOT
Django不会自动把app内的静态文件和STATICFILES_DIRS里的文件同步到STATIC_ROOT目录,你需要手动执行收集命令:
python manage.py collectstatic
执行完后,去/var/www/media/myapp/static/目录下检查,确认CSS、JS等静态文件是否真的存在。另外还要检查该目录的权限:
- 确保Apache的运行用户(通常是
www-data)有读取权限,比如设置目录权限为755,文件权限为644 - 可以用
sudo chown -R www-data:www-data /var/www/media/myapp/static/来调整所属用户组
2. Apache配置的规则顺序错误
你的Apache VHost里,ProxyPass / 写在了ProxyPass /static/ !前面,这会导致所有请求先被转发到Gunicorn,后面的静态文件排除规则根本不会生效。必须先写排除规则,再写全局代理,调整后的配置应该是:
<VirtualHost *:80> ServerName myapp.fr ServerAlias www.myapp.fr myapp.fr DocumentRoot /home/django-project/myapp/ # 先排除静态文件请求,不转发到Gunicorn ProxyPass /static/ ! # 映射静态文件目录 Alias /static/ /var/www/media/myapp/static/ # 再把其他所有请求转发到Gunicorn ProxyPass / http://localhost:9000/ <Proxy *> Order deny,allow Allow from all </Proxy> # 给静态文件目录添加访问权限配置 <Directory /var/www/media/myapp/static/> Order deny,allow Allow from all Options Indexes FollowSymLinks </Directory> <Directory /home/django-project/myapp/> Order deny,allow Allow from all Options -Indexes </Directory> </VirtualHost>
3. 缺少静态文件目录的Directory配置
你原来的Apache配置里只给项目目录加了Directory规则,但静态文件所在的/var/www/media/myapp/static/没有对应的权限配置,这会导致Apache可能因为权限限制无法读取静态文件,所以必须加上上面配置里的<Directory /var/www/media/myapp/static/>部分。
4. ALLOWED_HOSTS配置不匹配
你的ALLOWED_HOSTS只设置了localhost,但访问时用的是myapp.fr或www.myapp.fr,虽然这不是静态文件加载的直接原因,但可能导致Django拒绝请求引发其他问题,建议更新settings.py:
ALLOWED_HOSTS = ['myapp.fr', 'www.myapp.fr', 'localhost']
最后验证步骤
- 重新运行
collectstatic确保文件同步完成 - 重启Apache服务:
sudo service apache2 restart - 重启Gunicorn服务(根据你的启动方式,比如
systemctl restart gunicorn) - 打开浏览器的开发者工具(F12),查看网络请求里静态文件的状态码:
- 如果是404:说明文件没收集到,或者Alias路径写错了
- 如果是403:说明权限配置有问题
内容的提问来源于stack exchange,提问作者GrandGTO
相关产品推荐
相关产品推荐

