Django部署后Nginx无法加载静态资源返回404问题求助
Django部署静态资源404问题解决
问题梳理
刚接触Django,在Linux环境用Gunicorn+Nginx部署后:
- 应用核心功能、页面导航及POST请求正常运行
- CSS、图片等静态资源返回404,但静态文件夹内的CSV文件可通过视图正常读取
- Nginx访问日志显示请求路径重复拼接,导致404
- 曾尝试修改Nginx alias、settings.py的STATIC_ROOT/STATIC_URL,设置STATIC_URL为'/'触发media URL错误,设为'/Static_File_Storage'出现权限拒绝
配置错误分析与修正
1. 修正settings.py配置
当前STATIC_URL设为本地文件路径是核心错误,STATIC_URL是浏览器请求静态资源的URL前缀,而非本地路径;STATIC_ROOT写法也有误,会生成错误的绝对路径。
修改后settings.py相关配置:
# BASE_DIR是项目根目录,直接拼接静态文件夹名称即可 STATIC_ROOT = os.path.join(BASE_DIR, 'Static_File_Storage') # STATIC_URL设为URL前缀,注意开头加/,结尾加/ STATIC_URL = '/Static_File_Storage/'
修改后必须执行静态文件收集命令,确保所有APP的静态文件同步到STATIC_ROOT目录:
python manage.py collectstatic
2. 修正Nginx配置
确保Nginx的location路径与STATIC_URL完全匹配,同时解决权限问题:
server { listen 80; server_name redacted; location = /favicon.ico { access_log off; log_not_found off; } # location路径与STATIC_URL一致,结尾保持/ location /Static_File_Storage/ { # alias指向STATIC_ROOT的绝对路径,结尾加/ alias /home/beachhouse/PycharmProjects/BH_Django_Project/BH_DJANGO/Static_File_Storage/; # 添加缓存控制配置 autoindex off; expires 30d; add_header Cache-Control "public, no-transform"; # 提前给静态文件夹设置可读权限(执行以下命令) # chmod -R 755 /home/beachhouse/PycharmProjects/BH_Django_Project/BH_DJANGO/Static_File_Storage/ # chown -R www-data:www-data /home/beachhouse/PycharmProjects/BH_Django_Project/BH_DJANGO/Static_File_Storage/ } location / { include proxy_params; proxy_pass http://unix:/run/gunicorn.sock; } }
3. 修正模板静态标签引用
模板中使用{% static %}时,文件路径不要开头加/,避免URL路径错误:
{% load static %} <link rel="stylesheet" type="text/css" href="{% static 'css/style.css' %}"/> <img class="login_img" src="{% static 'logo.png' %}" alt="logo">
4. 重启服务生效
修改配置后重启Nginx和Gunicorn:
sudo systemctl restart nginx sudo systemctl restart gunicorn
关键说明
STATIC_ROOT是Django收集所有静态文件的统一目录,必须为本地绝对路径STATIC_URL是浏览器访问静态资源的URL前缀,必须以/开头和结尾,与Nginx的location路径严格对应- 静态文件夹必须赋予Nginx进程(通常为www-data用户)可读权限,否则会触发权限拒绝错误
内容的提问来源于stack exchange,提问作者KHCJR0587
相关产品推荐
相关产品推荐

