【问题标题】:Django CDN with Nginx and uWSGI带有 Nginx 和 uWSGI 的 Django CDN
【发布时间】:2017-04-18 22:58:58
【问题描述】:

我在使用 Django 1.10、uWSGI 和 Nginx 提供静态文件时遇到困难。

我有一个 index.html 文件,其中包含 CDN。

Django 文档here 说“将静态文件传输到存储提供商或 CDN”。 “转移到 CDN”是什么意思? CDN不是你获取文件的地方吗?

settings.py 包含,

STATIC_URL = '/static/'

STATIC_ROOT = 'nonAppBoundStaticDirectory'

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
]

跑步

$ python manage.py collectstatic

这会将所有 CDN 都放在我的目录“nonAppBoundStaticDirectory”中吗?

如果是这样,那么我如何在模板中使用它?

摘自 index.html

  <!-- Bootstrap -->
  <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.1/css/bootstrap.min.css">

来自 /etc/nginx/nginx.conf 的摘录

server {
    # the port your site will be served on
    listen  80;
    # the domain name it will serve for
    server_name example.com;   # substitute your machine's IP address or FQDN
    charset     utf-8;

    #Max upload size
    client_max_body_size 75M;   # adjust to taste

    # Django media
    location /media  {
                alias /home/ofey/djangoForum/fileuploader/uploaded_files;      # your Django project's media files
    }

        location /static {
                alias /home/ofey/djangoForum/noAppBoundStaticDirectory;     # your Django project's static files
        }
........

谢谢,

【问题讨论】:

  • 对于较大的网站,最好也从 cdn 提供您的自定义 css、js 等,就像您使用第三方引导资产一样。但是在您的情况下,您不使用 cdn 来管理自己的静态资产。所以django存储后端只是将文件复制到应用服务器上的其他地方,nginx可以直接为它们提供服务。
  • 所以 django 不会从 CDN 中拉取任何文件来保存在本地。但是,如果您使用 CDN STATICFILE_STORAGE,django 的 collectstatic 会将您的 自己的 自定义资产从 STATICFILE_DIRS 上传到远程 CDN 服务器。例如亚马逊云端。不过,您必须使用有效的 api 密钥配置静态文件后端才能正常工作。此外,模板标签 {% static %} 将创建一个 URL,指向您的资产从 CDN 提供的位置。
  • 在这种情况下,您需要解释什么不起作用以及您希望它如何起作用。 minimal reproducible example
  • 您通常会将静态文件复制到由 nginx 提供服务的目录中。所以你的STATIC_ROOT 值应该是该目录的绝对路径(以/ 开头)。与您在 nginx 配置中使用的相同。如果 nginx 无法提供这些文件,请确保 nginx 进程对该目录具有读取权限。
  • 阅读此问题后,我觉得您对 CDN 是什么感到困惑。这是一项您付费的服务,它获取您的文件,将它们存储在自己的服务器上,并为您提供服务。您不能拥有“包含 CDN”的 index.html:这根本没有意义。

标签: django nginx cdn uwsgi django-staticfiles


【解决方案1】:

这可能只是拼写错误。在您的settings.py 中,目录名称中有一个额外的n

STATIC_ROOT = 'nonAppBoundStaticDirectory'

在您的 nginx 配置中,您有不同的拼写。

location /static {
    alias /home/ofey/djangoForum/noAppBoundStaticDirectory; 

确保路径指向确切相同的目录。在这两种情况下都使用绝对路径是个好主意。

【讨论】:

  • 在 index.html 我有 在 settings.py STATIC_ROOT = '/ home/ofey/djangoForum/nonAppBoundStaticDirectory' 在 nginx.conf 我有 location /static { alias /home/ofey/djangoForum/nonAppBoundStaticDirectory; } 这些都是绝对路径,但还是不行。
  • 这个文件存在 /home/ofey/djangoForum/nonAppBoundStaticDirectory/assets/css/main.min.css 我看不出它为什么不起作用。
  • 我访问了您的网站。对 css 文件的请求返回“403 禁止”响应。这可能意味着 nginx 没有对 staticfiles 目录的读取权限。确保 nginx 用户对文件具有读取权限,并对所有父目录具有执行权限。有关详细信息,请参阅此问题。 stackoverflow.com/questions/6795350/…
  • 该问题的链接非常有帮助,谢谢。我在 nginx.conf 中添加了一个用户,并在 nonAddBoundStaticDirectory 中递归地将权限更改为 775 正在使用更多的 css,但它仍然不正确。我需要更仔细地检查 index.html。网站现在看起来像 qqiresources.com,应该像 cloud.githubusercontent.com/assets/17167992/16212578/…
【解决方案2】:
  1. 在开发服务器中工作

如果您在开发服务器中工作,请从 settings.py 中删除 STATIC_ROOT。您的 settings.py 现在应该如下所示:

    STATIC_URL = '/static/'

    STATICFILES_DIRS = [
        os.path.join(BASE_DIR, 'static'),
    ]
  1. 生产

如果您在生产环境中工作,请从 settings.py 中删除 STATICFILES_DIRS。您的 settings.py 现在应该如下所示:

    STATIC_URL = '/static/'

    STATIC_ROOT = 'nonAppBoundStaticDirectory'

别忘了运行:

    python manage.py collectstatic

【讨论】:

    猜你喜欢
    • 2012-10-01
    • 2020-06-29
    • 1970-01-01
    • 2012-08-13
    • 2014-05-31
    • 2011-10-10
    • 2011-11-25
    • 2017-04-12
    • 2013-09-15
    相关资源
    最近更新 更多