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

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

新規登録して質問してみよう
ただいま回答率
85.39%
docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

uWSGI

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

nginx

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Docker

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

Q&A

解決済

1回答

432閲覧

DockerでNginx/Python/Flask/uWSGIの環境を構築したい(upstream利用)。

moti7

総合スコア15

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

uWSGI

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

nginx

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Docker

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

0グッド

0クリップ

投稿2023/08/16 08:26

編集2023/08/17 00:41

実現したいこと

DockerでNginx/Python/Flask/uWSGIの環境を構築したい。

(Nginxで、upstream コンテキストによるバックエンドの指定する方法で、環境を構築したいです。)

[環境]
Webサーバー:NGINX
APサーバー:uWSGI
フレームワーク:Flask

動作結果について

dockerでコンテナを起動して
http://127.0.0.1:8080/」にアクセスして表示すると、
以下メッセージが表示され(「default.conf」でNginxのエラー画面表示を設定しているためこのメッセージ。設定していない場合は、502でエラー表示)、正常に表示されない。
正常な「Hello World! debug!!!」が表示されるようにしたい。

イメージ説明

発生している問題・エラーメッセージ

「Docker logs -f web-server」コマンドでログを確認すると以下、ログが出力されています。
ログの内容から、upstreamによる接続が失敗と読み取れるので、
以下を確認しました。
・コンテナが正常に起動していることの確認OK。
・upstream関連Nginxの設定の見直しをして、問題点がわからない(あっていると思っている)。

[error] 27#27: *13 connect() failed (111: Connection refused) while connecting to upstream, client: xxx.xxx.xxx.xxx, server: localhost, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:3031/", host: "127.0.0.1:8080"

ディレクトリ構成

test ├── app │   ├── Dockerfile │   └── src │   ├── .env │   ├── app.py │   ├── requirements.txt │   └── uwsgi.ini ├── docker-compose.yml └── web ├── default.conf └── nginx.conf

該当のソースコード

docker-compose.yml

version: '3' services: app: image: python:3.11 build: context: ./app container_name: ap-server hostname: ap-server volumes: - ./app/src:/var/www/html/ restart: always tty: true # expose: # コンテナ側ポート # - "8080" ports: - "3031:3031" environment: TZ: "Asia/Tokyo" command: uwsgi --ini /var/www/html/uwsgi.ini web: image: nginx:latest container_name: web-server hostname: web-server ports: - "8080:80" volumes: - ./web/nginx.conf:/etc/nginx/nginx.conf - ./web/default.conf:/etc/nginx/conf.d/default.conf environment: TZ: "Asia/Tokyo" restart: always

Dockerfile

1FROM python:3.11 2 3RUN mkdir -p /var/www/html/ 4 5WORKDIR /var/www/html/ 6COPY src . 7 8RUN pip install --upgrade pip 9RUN pip install --upgrade setuptools 10RUN pip install -r requirements.txt

app.py

1from flask import Flask 2 3app = Flask(__name__) 4 5@app.route('/') 6def hello(): 7 return "Hello World! debug!!!" 8 9if __name__ == "__main__": 10 app.run(debug=True)

requirements.txt

1Flask 2uwsgi

auwsgi.ini

1[uwsgi] 2module = app 3callable = app 4master = true 5processes = 1 6socket = 0.0.0.0:3031 7chmod-socket = 666 8vacuum = true 9die-on-term = true 10wsgi-file = /app.py

env

1HOME_PATH = './' 2ROOT_PATH = '/var/www/html/'

default.conf

1upstream backend1 { 2 # server ap-server:8080;# container_nameで指定 3 server 127.0.0.1:3031; 4} 5 6server { 7 listen 80; 8 server_name localhost; 9 10 location / { 11 proxy_pass http://backend1; 12 proxy_set_header Host $host; 13 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 14 proxy_set_header X-Forwarded-Host $host; 15 proxy_set_header X-Forwarded-Server $hostname; 16 proxy_set_header X-Real-IP $remote_addr; 17 proxy_set_header X-Forwarded-Proto $scheme; 18 } 19 20 error_page 500 502 503 504 /50x.html; 21 location = /50x.html { 22 root /usr/share/nginx/html; 23 } 24}

nginx.conf

1user nginx; 2worker_processes auto; 3 4error_log /var/log/nginx/error.log notice; 5pid /var/run/nginx.pid; 6 7 8events { 9 worker_connections 1024; 10} 11 12 13http { 14 include /etc/nginx/mime.types; 15 default_type application/octet-stream; 16 17 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 18 '$status $body_bytes_sent "$http_referer" ' 19 '"$http_user_agent" "$http_x_forwarded_for"'; 20 21 access_log /var/log/nginx/access.log main; 22 23 sendfile on; 24 #tcp_nopush on; 25 26 keepalive_timeout 65; 27 28 #gzip on; 29 30 include /etc/nginx/conf.d/*.conf; 31}

コンテナの状態

% docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 83a7717bbaf8 nginx:latest "/docker-entrypoint.…" 2 seconds ago Up 2 seconds 0.0.0.0:8080->80/tcp web-server 90cdb316e875 python:3.11 "uwsgi --ini /var/ww…" 2 seconds ago Up 2 seconds 0.0.0.0:3031->3031/tcp ap-server

試したこと

・設定ファイルの見直し
・Googleで検索して調査(同類のブログ記事で試すが成功せず)
・Windows環境下、Mac環境下で試す

補足情報(FW/ツールのバージョンなど)

・Nginxで、Unix Domina Socketでのアクセスを利用。(コンテナ間でUnixソケット通信)の環境では、正常に動作しました(今回のエラーが表示されませんでした)。
・Nginxで、upstream コンテキストによるバックエンドの指定する方法で、今回のエラーが表示されました。

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

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

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

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

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

guest

回答1

0

自己解決

Nginxの設定ファイルを見直して解消しました。

投稿2023/08/17 01:52

moti7

総合スコア15

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.39%

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

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

質問する

関連した質問