Django可以单独使用Gunicorn(没有Apache或nginx)吗?

时间:2012-06-02 12:16:19

标签: python django nginx amazon-ec2 gunicorn

我在网上尝试了几乎每个django + nginx教程,我无法在屏幕上显示图像文件。它始终是旧故事 - 404 PAGE NOT FOUND 。网页加载正常,但我的 / static / 文件夹中的django.png没有。不确定它是否在settings.py或nginx中存在问题。

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

5 个答案:

答案 0 :(得分:8)

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

  

虽然有许多HTTP代理可用,但我们强烈建议   你使用Nginx。如果您选择其他代理服务器   当你使用默认的Gunicorn时,确保它缓冲缓慢的客户端   工作人员。如果没有这个缓冲,Gunicorn很容易受到影响   拒绝服务攻击。您可以使用slowloris来检查您的身份   代理行为正常。

使用gevent或tornado之类的异步工作程序时可能不是这种情况。

答案 1 :(得分:8)

是。 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)的人感到困惑。一个接一个地尝试一下。从枪声中获取媒体;然后从nginx服务它,然后最终也有nginx代理。但是,在将应用程序投入生产之前,请执行此操作。我已经看到这种方法增加了理解并减少了挫败感。

答案 2 :(得分:5)

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

答案 3 :(得分:3)

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

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

<强>更新

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

Why do I need Nginx and something like Gunicorn?

答案 4 :(得分:1)

我使用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.它很奇怪,但仍然有效。如果您知道原因,请发表评论。