2012-12-03 38 views
0

我在Dotcloud上部署了我的Django应用程序。使用Nginx和自定义服务来提供静态文件。 Dotcloud

我正在使用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/@[email protected]/${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设置我的应用程序有任何想法吗?

非常感谢您

+0

你想把你的应用放在nginx的后面,还是放在它的前面? - 如果你把你的应用放在nginx之后,你将无法再使用websockets。 - 如果你把你的应用放在nginx前面,我不确定你会从nginx中获得什么。 所以我想了解背后的理由! – jpetazzo

+0

nginx文件夹位于dotcloud应用程序或django应用程序的根目录下吗? 'nginx:nginx'让我相信nginx进程将在nginx用户下运行。 nginx用户是否有权读取nginx文件夹中的文件? – Enrico

+0

@jpetazzo我不想用nginx来提供我的静态文件,并把我的应用放在nginx前面。我仍然使用runserver_socketio运行我的应用程序,所以我不能将我的DEBUG模式设置为False,因为Django将停止提供我的静态文件。所以我需要使用服务器来做到这一点。我是编程新手,所以我不知道做什么是最好的方法。我会采取任何建议,你可以给我!谢谢您的回答。 – Marcolac

回答

1

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

此时,您有其他两个选项

  1. 使用CDN,把所有在亚马逊S3您的文件,并从那里(或CloudFront的)为他们服务。

  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_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。

+0

谢谢你的回答。我尝试了第二种解决方案,它可以发现。我会尝试第一个。但是如果我不使用static_files应用程序,使用S3有什么优势? – Marcolac

+0

使用S3的好处在于,您的内容将为您的访问者加载更快,因为它将来自CDN(如果您在s3中使用cloudfront),并且它将消除对dotcloud上的静态服务的需求,这将为您节省一点钱。 –

+0

好的,太好了。我会看看我如何通过cloudfront和S3服务我的静态。如果你有什么好的教程,它会帮助我很多。再次感谢您的回答。 – Marcolac

相关问题