Djangoプロジェクトをデプロイする「正しい」方法は何なのか頭がわからない(私はまだ何を使用するのかまだ決めていません。おそらくuwsgiがあるからです)より良いパフォーマンス、提案?)とDockerを使用したnginx。
何人かがすべてを同じ容器に入れているのを見ました。私はDockerの専門家ではありませんが、コンテナは1つのことを行うだけで十分です。つまり、Django + nginxは1ではなく2のようです。
今、私の展開のアイデアは:
それを行う他の方法はありますか?このケースをもう少し詳しく説明するチュートリアルはありますか? PCでいくつかのコードをテストするだけでなく、しっかりした製品が必要です。
私は現在、Djangoアプリをあなたが望む方法で構築しています。
これを行うにはdocker-composeを使用します。これは私のdocker-compose.ymlです
version: '2'
services:
nginx:
container_name: nginx-container
links:
- uwsgi
build: ./nginx
ports:
- "8888:80"
volumes_from:
- uwsgi
uwsgi:
container_name: uwsgi-container
build: ./uwsgi
expose:
- "8001"
volumes:
- ./code/conf:/opt/conf
- ./code/app:/opt/app
UWSGIのDockerfile:
FROM python:3.5
RUN ["pip", "install", "uwsgi"]
CMD ["uwsgi", "--master", "--ini", "/opt/conf/uwsgi.ini"]
NginxのDockerfile:
FROM nginx
RUN ["rm", "/etc/nginx/conf.d/default.conf"]
RUN ["ln", "-s", "/opt/conf/nginx.conf", "/etc/nginx/conf.d/"]
CMD ["nginx", "-g", "daemon off;"]
そして、これは私のディレクトリツリーです:
├── README.md
├── code
│ ├── app
│ └── conf
├── collectstatic.sh
├── docker-compose.yml
├── install.sh
├── migrate.sh
├── nginx
│ └── Dockerfile
├── restart.sh
├── upgrade.sh
├── uwsgi
│ └── Dockerfile
したがって、docker-compose build
を使用してイメージを作成し、docker-compose up -d
を使用してバックグラウンドで新しいコンテナーを起動します。次に、Djangoのインストール、シークレットキーの生成など、コンテナーの準備を整えたいものをセットアップできます。
nginxおよびuwsgiコンテナーは、共有ボリュームを使用して構成ファイルを読み取り、ファイルソケットと通信します。
まあ、それが最善の方法かどうかはわかりませんが、それは進行中の作業です。
私はこの答えを Michael Hampton から見つけました:
「これは、プロセスが同じホスト、VMまたはコンテナーにある場合にのみ機能します。同じマシンに接続しようとするためです。異なるコンテナーにある場合、機能しません。
Uwsgiコンテナーの内部IPアドレスを使用するように、nginx構成を変更する必要があります。」
また、別のコンテナにNginxを配置する場合は、覚えておく必要があります。また、nginx.confを設定して、静的ファイルディレクトリをエイリアスとして指定し、セキュリティの問題を回避する必要があります。
このコードがすべての人に役立つことを願っています。Gunicorn、Docker、Nginxの構成方法を理解するのに数時間かかりました。
# nginx.conf
upstream djangoA {
server $DOCKER_CONTAINER_SERVICE:9000 max_fails=3 fail_timeout=0;
# In my case looks like: web:9000
}
Server {
include mime.types;
# The port your site will be served on
listen 80;
# the domain name it will serve for
server_name $YOUR_SERVER_NAME;# substitute your machine's IP address or FQDN
charset utf-8;
#Max upload size
client_max_body_size 512M; # adjust to taste
location /site_media {
alias $DIRECTORY_STATIC_FILES/site_media;#your Django project's media files have to be inside of the container have nginxs, you can copy them with volumes.
expires 30d;
}
location / {
try_files $uri @proxy_to_app;
}
# Finally, send all non-media requests to the Django server.
location @proxy_to_app {
proxy_set_header X-Real-IP $remote_addr;
proxy_redirect off;
proxy_set_header Host $Host;
proxy_pass http://djangoA;
}
}
そしてdocker-composeの場合:
#production.yml
version: '2'
services:
db:
extends:
file: base.yml
service: db
nginx:
image: nginx:latest
volumes:
- ./nginx:/etc/nginx/conf.d/
- ./$STATIC_FILE_ROOT/site_media:/$STATIC_FILE_ROOT/site_media
ports:
- "80:80"
depends_on:
- web
web:
extends:
file: base.yml
service: web
build:
args:
- Django_ENV=production
command: bash -c "python manage.py collectstatic --noinput && chmod 775 -R project/site_media/static && gunicorn project.wsgi:application"
volumes:
- ./$DIRECTORY_APP:/$DIRECTORY_APP
ports:
- "9000:9000"
depends_on:
- db
volumes:
db_data:
external: true
このチュートリアル のおかげで、(主に)Django、Gunicorn、Nginx、Postgresのdocker-composeをビルドすることができました。
基本的に、Nginx用のコンテナが1つ、Django + Gunicorn用のコンテナが1つ、Postgres用のコンテナが1つ(複数のデータベースが必要な場合はさらに)あります。
Django + Gunicornを2つのコンテナーに分割することもできますが、1つのGunicornプロセスが常に1つのDjango wsgiアプリケーションを実行するため、両方を1つのコンテナーに含める方が理にかなっていると思います。私は使用しません。 N Dunigoを実行するN Gunicorn、N Djangoを実行する1 Gunicorn、またはN Djangoを実行するN Gunicornのいずれかを使用できるため、N Gunicorn + Djangoコンテナーをスケーリングする以外に、スケーリングの可能性はありません。
ボリュームは、データベースのデータ(およびオプションでDjangoの静的/メディアファイル)を永続的に保持するために使用されます。
あなたはそれを行うためのチュートリアルまたは他の方法を求めていたので、私はここに私のdocker-compose.ymlの内容を投稿しません(Dockerfile、Nginx confファイル、Gunicorn confファイル、データベースのenvファイルも必要になるため、 Python DATABASES設定のようなコード)の多くのスニペットですが、時間があるときにチュートリアルを作成し、編集/コメントにリンクを投稿します。
一方、上記で提供したリンクは非常に良い出発点です。
編集:これで、この docker setup example および関連する blog post を確認できます。