Elastic Beanstalk で、django+nginx+uWSGI+S3を設定してデプロイしてみた
概要
Elastic Beanstalk で、django+nginx+uWSGI+S3を設定してデプロイしてみた
やってみたこと
- S3のバケットをsettings.pyに設定(mediaとstaticを分けてみる。)
- Dockerで動くか試してみる。
- その設定に従って、nginxのstaticと、mediaのlocationも設定
S3のバケットをsettings.pyに設定(mediaとstaticを分けてみる。)
これは自分の過去記事を参考にやってみる。
pythonskywalker.hatenablog.com
必要なモジュールをinstallする。(django-storages boto)
$ pip install django-storages boto $ pip freeze > app/requirements.txt
django-storageは、storageとしてsettings.INSTALLED_APPに追加しておく。
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ... 'storages', ]
settings.pyにS3の情報をセットする。
# staticファイルの場所 STATICFILES_DIRS = ( os.path.join(BASE_DIR, "static"), ) STATIC_URL = "https://%s/%s/" % ("[バケット名].s3-website-ap-northeast-1.amazonaws.com", "static") STATICFILES_STORAGE = 'website.custom_storages.StaticRootS3BotoStorage' # localのmediaの設定 MEDIAFILES_LOCATION = 'media' MEDIA_URL = "https://%s/%s/" % ("[バケット名].s3-website-ap-northeast-1.amazonaws.com", "media") DEFAULT_FILE_STORAGE = 'website.custom_storages.MediaRootS3BotoStorage' AWS_STORAGE_BUCKET_NAME = 'バケット名' # .envなどで渡す。 AWS_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID') AWS_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY') AWS_S3_HOST = 's3-ap-northeast-1.amazonaws.com' AWS_PRELOAD_METADATA = True AWS_QUERYSTRING_AUTH = False
こんな感じで設定する。あとはcollectstaticをやってみる。
$ python manage.py collectstatic
できた!バケットに保存された!
これでローカルではとりあえず動くことが判明。あとはこれがDockerで動くかを試すのと、nginx側で処理できるように設定する。
Dockerで動かせるか試してみる。
まずはホストPCのDockerで。。。
$ docker build -t ebdjanginx10 . $ docker run -d -p 8000:80 ebdjanginx10
OK!動いた! Elastic Beanstalkでもいけるか確認
$ eb deploy
これもいけた!とりあえず、これでS3の設定も完了
課題・疑問
- nginx-app.confのlocation /static, location /mediaの設定の意味ってなんなんだろう。 今回この2つを設定しなくても普通に処理できた。 多分、nginxの方で、media, staticを扱う時に必要になってくる設定だと思うんだけど、よくわかってない(^ ^;)