2016-12-05 37 views
1

我试图在配置nginx作为反向代理之前使用gunicorn来提供静态文件,并且我有点困惑。Gunicorn如何收集静态?

当我运行我的应用程序时,它似乎像gunicorn无法找到应用程序中的静态文件夹。

我有以下脚本来运行我的Django应用程序。

#!/bin/bash 

# Start with development server 
# echo Start server. 
# python manage.py runserver 0.0.0.0:8000 

# python manage.py collectstatic --noinput # Collect static files 

# # Prepare log files and start outputting logs to stdout 
touch /srv/logs/gunicorn.log 
touch /srv/logs/access.log 
tail -n 0 -f /srv/logs/*.log & 

# # Start Gunicorn processes 
echo Starting Gunicorn. 
exec gunicorn django_project.wsgi:application \ 
    --name ds4dems \ 
    --bind 0.0.0.0:8000 \ 
    --workers 3 \ 
    --log-level=info \ 
    --log-file=/srv/logs/gunicorn.log \ 
    --access-logfile=/srv/logs/access.log \ 
    "[email protected]" 

结果是样式和图像不是从main_app静态文件夹收集的。

文件夹结构如下。

django_project 
---- django_project 
---- main_app 
-------- static 

以下我试图用开发服务器运行相同的应用程序,并收集静态数据。然后,我再次与Gunicorn合作,并将样式和图像传送给浏览器而不会出错。

究竟发生了什么?

这是否与this?是唯一可用的选项来设置nginx让他看到文件?

+1

我有一张你可能会觉得有用的图画:http://djangodeployment.com/2016/11/21/how-django-static-files-work-in-production/。它假设你使用'nginx'或'apache',但即使使用whitenoise,它也可能是有用的,因为原理是相同的。 –

+0

太好了。我会为此制作一张海报。 :) – sparaflAsh

回答

2

通过使用额外的中间件库可以为gunicorn提供静态文件:Whitenoise。正如该文档所示,几乎所有您需要做的就是将其包含在MIDDLEWARE_CLASSES设置中。

但请注意,仍然最好直接通过nginx提供文件,而不是沿着这条路线。

另请注意,您似乎对收集静态文件和提供服务之间的区别感到困惑。 “收集”指的是进入所有你个人的静态目录和复制/链接文件进行服务的过程。这是manage.py collectstatic命令的工作:它与gunicorn或nginx无关,您将始终需要运行该命令。一旦你这样做了,你将能够直接或通过whitenoise为他们服务。

+0

我很困惑。我不得不注释'python manage.py collectstatic --noinput',因为它似乎无法找到静态。为什么开发服务器成功并且应用程序不成功? – sparaflAsh

+1

糟糕。我想我只需要设置STATIC_ROOT和STATIC_URL。在settings.py中使用collectstatic应用程序。 – sparaflAsh

0

Gunicorn本身只提供动态文件。您可以使用AWS S3RawGit来为静态资产提供服务。

相关问题