【问题标题】:Serve static files with Nginx and custom service. Dotcloud使用 Nginx 和自定义服务提供静态文件。点云
【发布时间】:2012-11-20 19:07:21
【问题描述】:

我在 Dotcloud 上部署了我的 Django 应用。

我将 websockets 与 Gevent 和 django-socketio 一起使用,所以我使用了自定义服务。目前,我仍在使用“runserver_socketio”来使其正常工作。

现在,我想使用 Nginx 来提供我的静态文件。我发现了这个:https://github.com/dotcloud/nginx-on-dotcloud

我尝试使用它。这是我的 dotcloud.yml:

    www:
       type: custom
       buildscript: nginx/builder
       processes:
          app: /home/dotcloud/env/bin/python myproject/manage.py runserver_socketio 0.0.0.0:$PORT_WWW
          nginx: nginx
       ports:
          www: http
       systempackages:
          - libevent-dev
          - python-psycopg2
          - libpcre3-dev
     db:
         type: postgresql

我在我的应用程序的根目录中添加了文件夹“nginx”。

我还在安装后的末尾添加了:

         nginx_config_template="/home/dotcloud/current/nginx/nginx.conf.in"

         if [ -e "$nginx_config_template" ]; then
               sed > $HOME/nginx/conf/nginx.conf < $nginx_config_template    \
               -e "s/@PORT_WWW@/${PORT_WWW:-42800}/g"
         else
               echo "($nginx_config_template) isn't there!!! Make sure it is in the correct location or else nginx won't be setup correctly."
         fi

但是当我去我的应用程序时,在我推送它之后,我得到了错误:

            403 Forbidden, nginx/1.0.14

Nginx 确实提供错误页面 404。

所以我不知道为什么,但我无法再访问我的应用了。您知道如何使用 Nginx 设置我的应用程序吗?

非常感谢

【问题讨论】:

  • 你想把你的应用放在 nginx 后面还是前面? - 如果你把你的应用程序放在 nginx 后面,你将无法再使用 websockets。 - 如果你把你的应用程序放在 nginx 前面,我不确定你会从 nginx 中获得什么。所以我试图理解这背后的基本原理!
  • 你的 dotcloud 应用程序或 django 应用程序的根目录下是 nginx 文件夹吗? nginx: nginx 让我相信 nginx 进程会在 nginx 用户下运行。 nginx用户是否有权限读取nginx文件夹下的文件?
  • @jpetazzo 我不想使用 nginx 来提供我的静态文件,并将我的应用程序放在 nginx 前面。我仍在使用 runserver_socketio 运行我的应用程序,所以我不能将我的 DEBUG 模式设置为 False,因为 Django 将停止为我的静态文件提供服务。所以我需要使用服务器来做到这一点。我是编程新手,所以我不知道最好的方法是什么。我会接受你能给我的任何建议!谢谢你的回答。
  • @jpetazzo 最后,我想做的是使用 nginx 提供我的静态文件并使用 Gunicorn 而不是 'runserver_socketio'
  • 如果您只想提供静态文件,那么您可以使用 nginx 服务来执行此操作。这是一项单独的服务,但很容易设置。将两种服务混合在一起会更干净。另一种选择是从 CDN 提供静态文件

标签: django nginx dotcloud


【解决方案1】:

我认为您的问题是您有两个不同的进程争夺 http 端口 (80)。一次只能在端口 80 上运行一个进程。大多数人通过让 nginx 在端口 80 上运行来解决这个问题,然后将所有流量反向代理到运行在不同端口上的另一个进程。这对你不起作用,因为 nginx 不支持网络套接字。这意味着您需要在 80 以外的端口上运行 nginx 或 django 应用程序。这也不理想。

此时你还有另外两个选择

  1. 使用 CDN,将所有文件放在 Amazon S3 上,然后从那里(或云端)提供它们。

  2. 使用 dotCloud 的静态服务,这将是一个单独的服务,只为静态文件提供服务。这是您的dotcloud.yml 的样子。

dotcloud.yml

www:
   type: custom
   processes:
      app: /home/dotcloud/env/bin/python myproject/manage.py runserver_socketio 0.0.0.0:$PORT_WWW
   ports:
      www: http
   systempackages:
      - libevent-dev
      - python-psycopg2
      - libpcre3-dev
 db:
     type: postgresql
 static:
     type: static
     approot: static_media

基本上,它添加了一个名为 static 的新服务,而这个新服务正在项目中名为 static_media 的目录中查找您的静态文件,该目录位于项目的根目录。

如果您使用静态服务,则需要从静态服务获取 URL,并在 django settings.py 中适当地设置您的 STATIC_URL。

此设置的另一个问题是,如果您使用的是 django 的 static_files 应用程序。 Django 的静态文件应用程序会将所有静态媒体复制到一个公共位置。这不适用于静态服务,因为静态服务是独立的,并且很可能与您的其他服务位于不同的主机上,因此您需要手动将文件复制到您自己的公共 static_media 目录中。

有关 dotCloud 静态服务的更多信息,请参阅以下文档:http://docs.dotcloud.com/0.9/services/static/

由于我提到的选项 2 的问题,我建议使用选项 1。如果您使用类似 https://github.com/jezdez/django_compressor 的东西,这样做非常容易。它可以为您将文件发送到 s3。

【讨论】:

  • 感谢您的回答。我尝试了第二种解决方案,它可以找到。我会尝试第一个。但是如果我不使用 static_files 应用程序,使用 S3 有什么优势吗?
  • 使用 S3 的优势在于,您的访问者可以更快地加载您的内容,因为它来自 CDN(如果您将 cloudfront 与 s3 一起使用),并且不需要静态服务在 dotcloud 上可以为您节省一点钱。
  • 好的,太好了。我将看看如何使用 cloudfront 和 S3 提供静态服务。如果您有任何关于它的好教程,它将对我有很大帮助。再次感谢您的回答。
猜你喜欢
  • 2012-11-23
  • 2017-10-18
  • 2010-12-01
  • 1970-01-01
  • 2021-09-03
  • 2015-07-30
  • 2019-02-22
  • 2018-06-06
  • 2016-05-23
相关资源
最近更新 更多