Ubuntu服务器部署Django后Nginx无法加载静态文件求助
解决Django静态文件无法加载的问题
从你的配置和报错信息来看,核心问题是Nginx的静态文件路径配置和实际请求URL不匹配,加上一些小的配置细节问题,导致静态文件请求都被转发给Django,而Django找不到这些文件返回404。下面是一步步的解决方法:
1. 确保已收集静态文件到STATIC_ROOT
首先确认你已经执行了Django的静态文件收集命令,因为STATIC_ROOT目录需要手动收集所有静态资源:
python manage.py collectstatic
执行时如果提示确认,输入yes即可,这会把STATICFILES_DIRS里的静态文件和第三方应用(比如admin)的静态文件都复制到STATIC_ROOT指定的staticfiles目录里。
2. 修正settings.py的STATIC_ROOT配置
把STATIC_ROOT改成绝对路径,避免相对路径导致的路径解析问题:
import os BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) STATIC_URL = '/static/' STATICFILES_DIRS = [os.path.join(BASE_DIR, "static"),] STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') # 改成绝对路径
3. 修改Nginx配置,匹配静态文件请求URL
你的Nginx配置里只处理了/staticfiles/开头的请求,但实际页面请求的是/static/开头的静态文件,所以需要调整Nginx的location配置:
server { server_name 138.197.172.33; access_log off; # 处理/static/开头的静态文件请求,指向实际的staticfiles目录 location /static/ { alias /path/to/your/project/staticfiles/; # 替换成你staticfiles目录的绝对路径,比如/var/www/myproject/staticfiles/ expires 30d; # 开启浏览器缓存,优化加载速度 add_header Cache-Control "public, max-age=2592000"; } location / { proxy_pass http://127.0.0.1:8001; proxy_set_header X-Forwarded-Host $server_name; proxy_set_header X-Real-IP $remote_addr; add_header P3P 'CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"'; } }
注意:这里一定要用绝对路径,否则Nginx找不到静态文件目录。如果不知道项目路径,可以在服务器上执行
pwd命令查看当前项目目录的绝对路径。
4. 修复静态文件目录权限
确保Nginx的运行用户(通常是www-data)有读取staticfiles目录的权限:
sudo chown -R www-data:www-data /path/to/your/project/staticfiles sudo chmod -R 755 /path/to/your/project/staticfiles
5. 重启Nginx生效配置
修改完配置后,重启Nginx服务:
sudo systemctl restart nginx
为什么之前会报错?
- 你的页面请求的是
/static/xxx路径的静态文件,但Nginx只配置了处理/staticfiles/xxx的请求,所以所有静态文件请求都被转发给了Django。而当Django处于生产环境(DEBUG=False)时,它不会处理静态文件请求,因此返回404错误。 - 之前的
STATIC_ROOT用了相对路径,可能导致Django收集静态文件时路径解析错误;Nginx的root配置也不正确,用alias可以更准确地指向静态文件目录,避免路径拼接错误。
内容的提问来源于stack exchange,提问作者Alireza Navaie
相关产品推荐
相关产品推荐

