Django能单独运行在Gunicorn上(没有Apache或者nginx)吗?

我已经在网上尝试了几乎所有的django + nginx教程,我无法获得一个图像文件显示在屏幕上。 这总是老的故事 – 404 PAGE NOT FOUND 。 网页加载正常,但我/静态/文件夹中的django.png没有。 不知道在settings.py或nginx中是否有问题。

我很沮丧,我拒绝看另一个“如何获得nginx / django教程”。 如果我在不久的将来部署一个网站,Gunicorn就足以运行一个Django站点,同时提供静态文件,而不使用Apache或nginx? 有一个逆向代理首先是一个很大的好处?

是。 Gunicorn也可以为你的静态服务。

如果一切都失败了,让django为你做(虽然,这是在挫折之前的最后一招)。要做到这一点,你只需要添加另一个url模式,如下所示:

urlpatterns = patterns('', # ... the rest of your URLconf goes here ... ) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 

虽然django服务静态比不服务它,它是值得委托给像nginx一样优化的服务器。

我建议在不同的端口上运行nginx,并将django STATIC_URL设置更改为包含端口(在确认端口服务于静态后)。 – 这样做和从nginx文件夹到MEDIA_ROOT的simlink一样简单。

如果你使用nginx,那么使用它来代理所有的请求也是很好的,只要把django请求传递给gunicorn。 所有这一切都需要添加一个conf文件来相应地告诉nginx。

我可以看到,对于那些正在开始并试图一次执行所有操作(代理请求,静态服务,配置nginx)的人来说,这会是怎样的混乱。 一个接一个地尝试。 从gunicorn获取媒体; 然后从nginx提供它,然后最终也有nginx代理。 但是,在你的应用程序正式投入使用之前,请先这样做 这种方法,我看到增加了解和减少挫折。

Gunicorn文档指出,如果没有代理缓存慢速客户端,默认的工作者容易受到拒绝服务攻击: http : //gunicorn.org/deploy.html

虽然有很多HTTP代理可用,但我们强烈建议您使用Nginx。 如果您选择其他代理服务器,则需要确保在使用默认的Gunicorn工作人员时缓存较慢的客户端。 如果没有这种缓冲,Gunicorn将容易受到拒绝服务攻击。 您可以使用slowloris来检查您的代理是否正常运行。

当使用诸如gevent或龙卷风之类的异步工作者时,情况可能并非如此。

如果您已经在使用亚马逊网络服务,您可以使用s3存储桶来托管您的静态内容,并使用gunicorn(或任何您想要的)将您的应用程序部署到ec2。 这样,您就不必担心设置您自己的静态文件服务器。

我建议在前面使用Nginx有几个原因:

  • 当gunicorn停机时,维护或内部服务器错误页面可以很容易地实现。 这意味着如果您的应用程序服务器没有运行,您将始终有一些响应。
  • 正如Gunicorn doc所说的那样,没有检测到像DOS这样的http攻击。
  • 您可能希望稍后实施自己的负载平衡策略。 随着项目规模的扩大,这对于发布工程将变得更加重要。 就我个人而言,我发现AWS ELB有点不可靠,我正在考虑这个问题。

更新

另外,请看一个由Gunicorn开发人员写的很好的答案:

为什么我需要Nginx和类似Gunicorn的东西?

我通过使用Werkzeug中间件来制作。 使用nginx服务器不是很好,也不是高性能,而是做这个工作:

在settings.py上设置STATIC_ROOT

 # project/settings.py import os BASE_DIR = os.path.dirname(os.path.dirname(__file__))) STATIC_ROOT = BASE_DIR+'/static-collected' 

告诉Werkzeug从这个文件夹提供文件

 # project/wsgi.py import os BASE_DIR = os.path.dirname(os.path.dirname(__file__)) (...) from django.core.wsgi import get_wsgi_application application = get_wsgi_application() (...) import os from werkzeug.wsgi import SharedDataMiddleware print 'Installing WSGI static files server middleware' application = SharedDataMiddleware(application, { '/static': os.path.join(BASE_DIR, 'static-collected'), }) 

当DEBUG = True时,Django会提供这些文件。 当DEBUG = False时,Werkzeug从静态收集的文件夹提供文件。 您需要在使用DEBUG = False的服务器上运行collectstatic才能正常工作。

Obs:由于某种原因,Werkzeug给出了500个未找到的文件,而不是404个。它的奇怪,但仍然有效。 如果你知道为什么,请评论。