Django项目部署:无法加载静态文件

时间:2016-09-23 13:59:18

标签: django nginx static gunicorn

我正在使用以下方式部署Django项目:

  • 的virtualenv
  • nginx的
  • gunicorn

遵循本教程:https://www.digitalocean.com/community/tutorials/how-to-deploy-a-local-django-app-to-a-vps

我的配置

django设置

ClaimsPrinciple

的/ etc / nginx的/位点可用/ esmart2

STATIC_ROOT = os.path.join(BASE_DIR, "static/")
STATIC_URL = '/static/'

运行

GNU nano 2.0.9                 File: /etc/nginx/sites-available/esmart2

server {
    server_name 192.168.30.17;
    access_log off;

    location /static/ {
        alias /new_esmart/esmart2/static/;
    }

    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"';
    }
}

我的Django项目正在运行,但是:

(esmart_env) [root@eprssrv09 esmart2]# /new_esmart/esmart_env/bin/gunicorn --bind 192.168.30.17:8001 esmart2.wsgi:application

有什么建议吗?

更新1 我认为已经避免了nginx设置:

删除'sites-enabled'文件夹中的任何引用,运行django项目并保留有关静态文件的问题。

更新2 如果在Django设置Not Found: /static/admin/css/login.css 我得到

debug=True

2 个答案:

答案 0 :(得分:2)

似乎我解决了但我认为不是更好的解决方案。我的意思是,根据项目要求,这是一个很好的解决方案:我允许使用这个解决方案。

安装包

$stmt->bind_result($firstname, $lastname,...)

wsgi.py上的

我添加了:

pip install whitenoise

这样会忽略nginx site conf(但我认为他们已经忽略了!)

Django WhiteNoise documentation

  

使用几行配置WhiteNoise允许您的网络应用程序   提供自己的静态文件,使其成为一个独立的单元   部署在任何地方,而不依赖于nginx,Amazon S3或任何其他   外部服务。 (特别适用于Heroku,OpenShift等   PaaS提供商。)

     

它可以很好地与CDN一起使用,适用于高流量网站   不必为了简单而牺牲性能。

     

WhiteNoise适用于任何兼容WSGI的应用程序,但有一些特殊功能   Django的自动配置功能。<​​/ p>      

WhiteNoise会为您提供最佳实践,例如:

     

提供压缩内容(gzip和Brotli格式,处理   正确接受编码和Vary标头)设置远期缓存   内容上的标题不会改变担心服务静态   使用Python的文件是非常低效的?仍然认为你应该   使用Amazon S3?看看不常见的问题。

答案 1 :(得分:1)

在我看来,这个问题有两个方面:

  1. 您的nginx配置中可能有错误。 new_esmart/真的在您的根目录/中,还是在/home/sam/new_esmart/之类的地方?如果它不在您的根目录中,请确保提供完整路径。

  2. 您的STATIC_ROOT似乎会指向path/to/new_esmart/static/而不是/new_esmart/esmart2/static/。请注意,当您在最初创建静态文件时,STATIC_ROOT 而不是您个人放置静态文件的位置时,collectstatic是将静态文件复制到的位置。

  3. 所以您可能需要做的是确认您确实希望将静态文件收集到/actual/path/to/new_esmart/static/,然后在nginx配置中使用相同的路径。

    此外,正如评论中所讨论的,您可以尝试将listen 8001;添加到您的nginx配置中:

    server {
        listen      8001;
        server_name 192.168.30.17;
        access_log off;
        ...