0

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

我正在使用带有 Gevent 和 django-socketio 的 websockets,所以我使用了自定义服务。目前,我仍在使用“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 设置我的应用程序有任何想法吗?

非常感谢

4

1 回答 1

1

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

此时,您还有另外两个选择

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

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

点云.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 中适当地设置您的 STATIC_URL settings.py

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

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

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

于 2012-12-03T16:18:47.047 回答