実現したいこと
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 コンテキストによるバックエンドの指定する方法で、今回のエラーが表示されました。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。