0

DjangoアプリをDotcloudにデプロイしました。

Geventとdjango-socketioでWebSocketを使用しているので、カスタムサービスを使用しました。今のところ、それを機能させるために「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)のために戦っている2つの異なるプロセスがあることだと思います。ポート80で一度に実行できるプロセスは1つだけです。ほとんどの人は、nginxをポート80で実行し、すべてのトラフィックを別のポートで実行される他のプロセスにリバースプロキシすることでこれを回避します。nginxはWebソケットをサポートしていないため、これは機能しません。つまり、80以外のポートでnginxまたはdjangoアプリを実行する必要があるということです。これも理想的ではありません。

この時点で、他に2つのオプションがあります

  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でSTATIC_URLを適切に設定する必要がありますsettings.py

この設定のもう1つの落とし穴は、djangoのstatic_filesアプリを使用している場合です。Djangoの静的ファイルアプリは、すべての静的メディアを1つの共通の場所にコピーします。これは静的サービスでは機能しません。静的サービスは別のものであり、他のサービスとは別のホストに存在する可能性が高いため、ファイルを自分の共通の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 に答える