質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

uWSGI

uWSGIは、PythonでWebサービスを動かすアプリケーションサーバの一つです。WSGI(Web Server Gateway Interface)アプリケーションコンテナの一種で、WSGIに則ったDjangoやFlaskなどで動かすことができます。

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

2回答

3587閲覧

Docker上のNginxとDjangoをuwsgiで接続したい(ローカル環境)

nmty

総合スコア19

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

uWSGI

uWSGIは、PythonでWebサービスを動かすアプリケーションサーバの一つです。WSGI(Web Server Gateway Interface)アプリケーションコンテナの一種で、WSGIに則ったDjangoやFlaskなどで動かすことができます。

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

0クリップ

投稿2021/07/11 06:54

編集2021/07/11 14:14

内容

Windows10にVirtualBoxでUbuntuをインストールし、
そのUbuntu上にNginxとPython(Django)のコンテナを作成しました。

Nginxコンテナのポートは80を使用し、
Pythonコンテナのポートを8001を使用し、

http://localhost:80 にアクセスすると、Python(Django)のコンテナに接続し、
Djangoの最初の画面(ロケットの画面)を出そうとしたいのですが、うまく接続されません。

http://localhost:80 にアクセスするとNginxの画面が表示され、
http://localhost:8001にアクセスすると、**接続がリセットされました**、という
Firefoxのエラー画面が表示されている。

詳細

・今回はdocker-composeを使用せずに環境構築しており、docker-composeを使用したやり方では1度こちらの(記事)を参考にDjangoの最初の画面まで確認はしたことがありますが、

今回は特に、uwsgiあたりの設定方法がわからず、そのあたりで接続がうまくいっていないと感じており、docker-composeを使用しない場合のuwsgiの設定方法を教えていただきたく投稿いたしました。

使用しているDockerイメージ
※Nginx:alpine
※Python:Python3.7-slim-buster

少し気になるエラー
今回のuwsgiと関係があるかはわかりませんが、Pythonコンテナ上でsystemctlを起動させようとすると以下のエラーが出ていることが少し気になっています。

$ systemctl System has not been booted with systemd as init system (PID 1). Can't operate. Failed to connect to bus: Host is down

追記
uwsgiの設定ファイル、手順を追記しました。情報が少なく申し訳ございませんでした。

①Nginx側の設定
・nginx/conf.d/defalt.conf

upstream django { ip_hash; server python:8001; } server { listen 8000; server_name 127.0.0.1; charset utf-8; location /static { alias /static; } location / { uwsgi_pass django; include /etc/nginx/uwsgi_params; } } server_tokens off;

②Python側の設定
・uwsgi.service (/etc/systemd/system/uwsgi.service)

[Unit] Description = uWSGI After = syslog.target [Service] ExecStartPre =/bin/sh -c "/bin/systemctl set-environment DO_DAEMON_PROCESS=1" ExecStart = /usr/local/bin/uwsgi --ini /opt/app/myapp/uwsgi.ini --logto /var/log/wsgi/myapp.log Restart=always KillSignal=SIGQUIT Type=notify StandardError=syslog NotifyAccess=all [Install] WantedBy=multi-user.target

・uwsgi.ini(/opt/app/myapp/uwsgi.ini)

[uwsgi] socket = 127.0.0.1:8001 chdir = /opt/app/myapp module = myapp.wsgi process = 4 threads = 1

uwsgi_params(/opt/app/myapp/uwsgi_params)

uwsgi_param QUERY_STRING $query_string; uwsgi_param REQUEST_METHOD $request_method; uwsgi_param CONTENT_TYPE $content_type; uwsgi_param CONTENT_LENGTH $content_length; uwsgi_param REQUEST_URI $request_uri; uwsgi_param PATH_INFO $document_uri; uwsgi_param DOCUMENT_ROOT $document_root; uwsgi_param SERVER_PROTOCOL $server_protocol; uwsgi_param REQUEST_SCHEME $scheme; uwsgi_param HTTPS $https if_not_empty; uwsgi_param REMOTE_ADDR $remote_addr; uwsgi_param REMOTE_PORT $remote_port; uwsgi_param SERVER_PORT $server_port; uwsgi_param SERVER_NAME $server_name;

以上

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

attakei

2021/07/11 07:27

どういう設定・コマンドでnginx,uwsgiを起動しているかの情報が無いので、 答えるのがすごい困難な気がします。 以下の情報を掲載しておくと、回答が付きやすいと思います。 - nginxのconf (最低限今回設定しているserverディレクティブの部分) - uwsgiの起動時設定 (コマンド/設定ファイル)
hentaiman

2021/07/11 07:29

設定などの情報が一切掲載されていないので今のままでは何がダメなのかさっぱり分かりません 設定と設定手順と実施した手順を見易くまとめてその内容を質問文を編集して記載してみてください 回答できる人が出てくるかもしれません
nmty

2021/07/11 08:30

情報を追加致しました。アドバイスありがとうございました。
guest

回答2

0

最初に回答が間違っていたので改めて公式ドキュメントを元に手元で試して確認しました
windowsで試した手順なので、windowsじゃない場合はfindstrgrepに置き換えるなどして適当に読み替えてください
以下、docker networkを明示的に割り当てない場合

デフォルトで使っているネットワークの確認

powershell

1docker network inspect bridge 2# bridgeじゃない場合は network ls でネットワーク名を確認 3 4~~~中略~~~ 5 "Config": [ 6 { 7 "Subnet": "172.17.0.0/16", 8 "Gateway": "172.17.0.1" 9 } 10 ] 11~~~中略~~~

各コンテナに割り当てられているIPの確認

powershell

1docker container inspect pythonコンテナ名|findstr 172 2~~~中略 3 "Gateway": "172.17.0.1", 4 "IPAddress": "172.17.0.3", 5 "Gateway": "172.17.0.1", 6 "IPAddress": "172.17.0.3", 7~~~

この例で言うと172.17.0.3の部分がIPです。

nginxのconfの修正

upstream django { ip_hash; server 172.17.0.3:8001; }

旧回答

docker-composeを使用せずに環境構築しており

その場合は明示的にdocker networkを設定しないと

upstream django {

ip_hash; server python:8001;

}

のようにコンテナ名を指定しての通信は出来ません
~~のようにIPに書き換えるか、networkを設定する事で繋がるようになります
今回はIPに書き換えるのが簡単でよろしいでしょう
~~

少し気になるエラー

今回のuwsgiと関係があるかはわかりませんが、Pythonコンテナ上でsystemctlを起動させようとすると以下のエラーが出ていることが少し気になっています。
$ systemctl
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down

debian系のコンテナはsystemctlが使えません
しかしコンテナのstatusがExitedになっていないなら稼働中という事です
djangoがオフィシャルイメージを利用しているのであれば特に動作に問題はないはずです
※djangoイメージ使った事ないので正確な事は分かりません

投稿2021/07/11 09:30

編集2021/07/11 15:49
hentaiman

総合スコア6426

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nmty

2021/07/11 13:11

回答ありがとうございます。コンテナ名を指定しての通信ができない事を知りませんでした。 ただご指摘頂いた修正をしてもまだ繋がりません。他の設定ファイルなどが関係しているのかも しれませんが、もう少し調べてみます。私が提示している情報が少ない中ご回答頂きありがとうございました。
hentaiman

2021/07/11 15:53

元の回答が間違ってたので改めて公式ドキュメントを見直しながらネットワークを指定しない場合の正しい対応方法を記載しました 手元で試したので合ってると思いますが、これでもダメだったらスマンです > コンテナ名を指定しての通信ができない それはネットワークを明示的に割り当てていない場合です 改めて回答はしましたが、個人的にはネットワークを明示的に指定した方が良いと思います 今回自分が改めて調べて試す必要があった理由も、通常はdocker-composeを使ったり明示的にネットワーク指定をしておりIP指定をした事が無かった為、IPを指定する場合の正しい方法を理解していなかったからです
nmty

2021/07/12 11:10

丁寧な解説、回答ありがとうございます、非常に参考になります。ただ現状まだ上記の修正を加えても接続がうまくいきません。他の原因も考えられるため、もう少し調査して、こちらの修正分も含め、接続できましたらこちらにて報告させて頂きます。
hentaiman

2021/07/12 11:52

「接続がリセットされました」と表示されたという事はコンテナに繋がるようにはなったという事です pythonコンテナでアクセスログ(uwsgiのログ?)を見ればそれは分かるはずです uwsgiのログは分かりませんが、エラーログを出せるような設定があるならその設定を追加して問題の特定に役立てるのがよろしいと思います
guest

0

自己解決

docker-compose無しでは構築できなかったため、docker-composeで環境構築しました。ありがとうございました。

投稿2021/10/18 20:51

nmty

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問