2017-02-25 9 views
6

昨日、私はこの記事を作成しました:localDjangoアプリをデプロイするときにAWSに静的ファイルを提供する方法( `python manage.py collectstatic`が機能しませんでした)?

しかし、私はAWS(eb deploy)にそれを展開した後、これは、私がアクセスしたときに、私が見たものである:私はpython manage.py runserverをしたときDjangoRestFramework browsable api looks different locally vs when deployed on server?

は基本的に、これが現れましたサイト:on deploy

私の静的ファイルが欠落していたため、上記のポストへの回答になりました。だから私は、AWS上で静的ファイルを展開する方法を検索し、このチュートリアルに出くわした:「サイト管理者を作成する」セクションでhttp://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create-deploy-python-django.html#python-django-update-app

、それは静的なファイルを提供するために、私が最初にそう(STATIC_ROOTsettings.pyに定義しなければならないことに言及します私はした:STATIC_ROOT = os.path.join(BASE_DIR, "ebdjangoapp/static/"))し、eb deployした。ただし、サイトは2番目の画像と同じように見えます(スタティックファイルなし)。私はpython manage.py collectstaticcssファイルなどを含むrest_frameworkディレクトリの静的フォルダを作成しました)を実行してからもう一度eb deployを実行しましたが、サイトstilは2番目の画像と同じように見えます。

どうして静的ファイルが表示されないのですか?

注意、私の周りを検索し、この記事に出くわした:Django app deployment not loading static filesと答えは言う:

「あなたはその後、非常に一般的にnginxのあなたの背後にあるリバースプロキシとして、任意のWebサーバーを経由してsettings.STATIC_URLsettings.STATIC_ROOTにサービスを提供する必要がありますApache-mod_wsgiアプリケーションサーバー。

しかし、Webサーバ(nginx、リバースプロキシ、Apache-mod_wsgi)がどのように動作するかはわかりません。私はpython manage.py runserverでローカルに実行するDjangoアプリを持っています。私はAWSの弾薬を持っています。 eb deployを実行して、私のDjangoアプリをAWSにデプロイします。どのような手順は、(私はnginx、リバースプロキシなどを設定する方法がわからないと仮定して)配置に静的ファイルが表示されるために取る必要があります。

+0

いつでも '' python manage.py collectstatic''を実行していますか? –

+0

@GrahamDumpletonはい、私は 'eb deploy'を行う前にそれをしました。 (基本的にはローカルで行い、すべてのファイルを静的フォルダに入れてから展開しました)。 – user2719875

答えて

9

RealPythonのAWS Elastic Beanstalkにdjangoアプリケーションをデプロイするための決定的なガイドがあります。here it is それは静的ファイルとどのようにEBとそれを構成する方法についてのセクション全体を持って、あなたはnginxの/ apacheのなど

基本的に

あなたはEBの設定でcontainer_commandsを定義する必要があり、これらのコマンドは後に実行されますについて何を知っている必要はありません。アプリケーションのデプロイが完了しました。 aws:elasticbeanstalk:container:python:staticfiles部分に

container_commands: 
    01_migrate: 
    command: "source /opt/python/run/venv/bin/activate && python iotd/manage.py migrate --noinput" 
    leader_only: true 
    02_collectstatic: 
    command: "source /opt/python/run/venv/bin/activate && python iotd/manage.py collectstatic --noinput" 

option_settings: 
    "aws:elasticbeanstalk:application:environment": 
    DJANGO_SETTINGS_MODULE: "iotd.settings" 
    "PYTHONPATH": "/opt/python/current/app/iotd:$PYTHONPATH" 
    "ALLOWED_HOSTS": ".elasticbeanstalk.com" 
    "aws:elasticbeanstalk:container:python": 
    WSGIPath: iotd/iotd/wsgi.py 
    NumProcesses: 3 
    NumThreads: 20 
    "aws:elasticbeanstalk:container:python:staticfiles": 
    "/static/": "www/static/" 

ご注意:例migrateの場合とcollectstatic、これはEB設定ファイルのようなセクションの一例です。 そしてまた、あなたのDjangoの設定ファイルにこの部分を定義する必要があります。

STATIC_ROOT = os.path.join(BASE_DIR, "..", "www", "static") 
STATIC_URL = '/static/' 

私はあなたが本当にそれを確認する必要があり、上記の記事からほぼ完全にこの例をコピーし、それは素晴らしいです。

UPD:欠落したstaticfilesをデバッグする方法。 私は通常、これは(それはあなたのEBインスタンスにsshingを伴う)実行します。

  1. django.contrib.staticfilesが私INSTALLED_APPSに含まれていることを確認してください。
  2. ブラウザのコンソールURLにファイルが見つからないことを確認します。 /static/js/somefile.js
  3. 私のdjangoの設定では、STATIC_URLが同じであることを確認してください。 /static/
  4. STATIC_ROOTで実際の値を確認し、このフォルダに実際に運用サーバーに静的ファイルが含まれていることを確認します。
  5. (configにごoption_settingsセクションの下)私のEBの設定は、フォルダを修正するために指していることを確認し

また、あなたは、本番サーバー上で/staticディレクトリに静的を収集しようとすることができます(EBがデフォルトでそれらを検索する場所それはです)。突然起動した場合は、設定がデフォルトの設定を上書きできなかったことを意味し、定義されているその他の場所を確認する必要があります。

私はこれらのステップが正しい方向を見つけるのに役立つことを願っています。

+0

リンクをありがとう。そこで、 'settings.py'を編集して、' STATIC_ROOT'と 'STATIC_URL'をあなたが言及したものにしました。 '.ebextensions'フォルダの中に' 02_python.config'というファイルを作成し、ここに投稿した内容をコピーしてコピーしました。私は 'iotd'を' ebdjango'に変更しました(私のプロジェクトの名前..私のアプリ名は 'ebdjangoapp'です)。その後、私は 'python ebjango/manage.py collectstatic --noinput'を' python manage.py collectstatic --noinput'に変更しました。(pythonのパスは既に 'ebdjango'につながっています。しかし、それはまだ動作しません(サーバーはまだ2枚目の画像のように見えます)。どのようにこの問題をデバッグするか考えていますか? – user2719875

+0

可能なデバッグステップで回答が更新されました。 – valignatev

+0

アップデートが大いに役立った!さて、私は 'STATIC_ROOT = os.path.join(BASE_DIR、" static ")'を 'option_settings'設定ファイルに' staticfiles'を付けないようにしました。私が '' aws:elasticbeanstalk:container:python:staticfiles "'への絶対パスまたは相対パスを 'option_settings'に与えると、うまく動作します。しかし、私が 'STATIC_ROOT'を' os.path.join(BASE_DIR、 ".."、 "www"、 "static") 'に変更し、"/static/":" www/static/option_settings'を実行すると、静的ファイルに対して404が与えられます。 ''/static/":" ../ www/static/"'と同じにすると、静的には403が返されます。 – user2719875

関連する問題