2012-12-03 37 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

相關問題