带有 Nginx 和 uWSGI 的 Django CDN

Posted

技术标签:

【中文标题】带有 Nginx 和 uWSGI 的 Django CDN【英文标题】:Django CDN with Nginx and uWSGI 【发布时间】: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:这根本没有意义。 【参考方案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 用户对文件具有读取权限,并对所有父目录具有执行权限。有关详细信息,请参阅此问题。 ***.com/questions/6795350/… 该问题的链接非常有帮助,谢谢。我在 nginx.conf 中添加了一个用户,并在 nonAddBoundStaticDirectory 中递归地将权限更改为 775 正在使用更多的 css,但它仍然不正确。我需要更仔细地检查 index.html。网站现在看起来像 qqiresources.com,应该像 cloud.githubusercontent.com/assets/17167992/16212578/…【参考方案2】:
    在开发服务器中工作

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

    STATIC_URL = '/static/'

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

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

    STATIC_URL = '/static/'

    STATIC_ROOT = 'nonAppBoundStaticDirectory'

别忘了运行:

    python manage.py collectstatic

【讨论】:

以上是关于带有 Nginx 和 uWSGI 的 Django CDN的主要内容,如果未能解决你的问题,请参考以下文章

Amazon EC2 上带有 Nginx + uWSGI 的 Django 应用程序

Django 部署 CentOS7+Python3+Django+uWSGI+Nginx(含Nginx返回400问题处理防火墙管理)

Django部署——uwsgi+Nginx(超详细)

带有 Nginx 的 Django 的 build_absolute_uri 中的 localhost

Django+Nginx+uWSGI = 504 网关超时

Django+nginx+uwsgi部署教程