15

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

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

4

5 回答 5

15

是的。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 代理。但是,在您将应用程序投入生产之前,请完成所有这些操作。我已经看到这种方法增加了理解并减少了挫败感。

于 2012-06-02T19:25:40.797 回答
13

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

尽管有许多 HTTP 代理可用,但我们强烈建议您使用 Nginx。如果您选择另一个代理服务器,则需要确保在使用默认 Gunicorn 工作程序时它缓冲慢速客户端。如果没有这种缓冲,Gunicorn 很容易受到拒绝服务攻击。您可以使用 slowloris 检查您的代理是否正常运行。

当使用 gevent 或 tornado 等异步工作器之一时,情况可能并非如此。

于 2012-06-02T13:53:31.820 回答
7

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

于 2012-06-02T13:46:17.450 回答
5

我推荐在前面使用 Nginx 有几个原因:

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

更新

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

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

于 2013-07-20T17:01:54.593 回答
2

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

于 2013-06-11T20:14:03.180 回答