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

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

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

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

Docker

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

3440閲覧

nginxのあるDockerコンテナからuWSGIのある別コンテナにあるアプリケーションを起動させたい

sequelanonymous

総合スコア123

nginx

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

Docker

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/11/09 00:29

編集2018/11/09 05:28

現状:
docker-compose でlinkもはってビルドしたDockerコンテナがmysql、nginx,uwsgiとそれぞれ3つのコンテナがあります。

こうありたい:
ローカルからcurl http://127.0.0.1:8080でコンテナ上のnginxにアクセスしてuwsgi上で動くはずのアプリがレスポンスを返してくれると言う状況にしたいです。

問題:
502Gatewayエラーがでている。
nginxからwsgiまでのネットワークがちゃんとはられているのは、確認済み。
psコマンドでuwsgiサーバーも起動していることを確認ずみ。
そうすると、起動したときに最初に読み込む、以下のモジュールになにか問題があるのでないかと疑っています。
何かお気づきな点ありましたらご教示頂けませんでしょうか?

flask

1import os 2import logging 3from xxx import create_app 4 5if os.environ.get("DEBUG"): 6 logging.basicConfig(level=logging.DEBUG) 7 8if __name__ == '__main__': 9 config = os.environ.get("CONFIG", "local") 10 app = create_app(config) 11 app.run(host='127.0.0.1', port=8080, debug=True) 12

追記
docker-compoposeファイル

version: "3" services: uwsgi: build: ./ volumes: - ~/local/xxx/work:/code/log/ ports: - "3031:3031" links: - mysql:mysql environment: TZ: "Asia/Tokyo" DATABASE_URL: "mysql+mysqldb://root:password@mysql/test_db?charset=utf8" DEBUG: 1 CONFIG: local nginx: build: ./nginx/local/ volumes: - ./nginx/local/nginx.conf:/etc/nginx/nginx.conf links: - uwsgi ports: - "9080:80" environment: TZ: "Asia/Tokyo" mysql: image: mysql volumes: - ~/local/xxx/work:/code/log/ ports: - "13306:3306" environment: MYSQL_ROOT_PASSWORD: password MYSQL_USER: test MYSQL_PASSWORD: test MYSQL_DATABASE: test_db

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

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

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

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

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

mather

2018/11/09 01:41

docker-composeの設定も公開してください。
sequelanonymous

2018/11/09 05:28

ご指摘ありがとうございます。追記しました。
guest

回答2

0

自己解決

エラーログは、以下。

*** Operational MODE: single process *** unable to find "application" callable in file wsgi.py unable to load app 0 (mountpoint='') (callable not found or import error) *** no app loaded. going in full dynamic mode *** *** uWSGI is running in multiple interpreter mode *** spawned uWSGI master process (pid: 49992) spawned uWSGI worker 1 (pid: 50010, cores: 1) spawned uWSGI http 1 (pid: 50011)

問題点:

if os.environ.get("DEBUG"): logging.basicConfig(level=logging.DEBUG) if __name__ == '__main__': config = os.environ.get("CONFIG", "local") app = create_app(config) app.run(host='127.0.0.1', port=8080, debug=True)

uwsgiサーバーで起動した場合、__main__をよみこんでいないため、if文内を通らずappがないと言われてしまう。

解決策は、以下。

https://stackoverflow.com/questions/12030809/flask-and-uwsgi-unable-to-load-app-0-mountpoint-callable-not-found-or-im

投稿2018/11/09 06:40

sequelanonymous

総合スコア123

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

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

0

アプリケーションは 8080 ポートで待ち受けていますよね。

python

1 app.run(host='127.0.0.1', port=8080, debug=True)

しかしdocker-composeの設定上は 3031 ポートでアプリケーションを公開しています。ポート番号が違うのでずれていますね。

yaml

1 uwsgi: 2 build: ./ 3 volumes: 4 - ~/local/xxx/work:/code/log/ 5 ports: 6 - "3031:3031"

そして実際にはポートを設定しなくても links で設定されていれば nginx.conf の設定で対応可能なはずです。

参考 : https://qiita.com/cortyuming/items/25e3e19beb1516e1d0be

再度設定を確認してみてください。

投稿2018/11/09 05:58

mather

総合スコア6753

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

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

sequelanonymous

2018/11/09 06:37

ご回答ありがとうございます! 原因は、uwsgiサーバーで立ち上げた場合、if __name__ == '__main__':でmainをよみこんでいないため、かつ、appをよみこんでいないためでした。
sequelanonymous

2018/11/09 06:49 編集

すみません、追加でご質問させてください。もしご存知でしたら、お答え頂けると助かります。 上記、解決策をみつけたので追記しました。そして、以下のように書き直しました。この書き方だと少し違和感があるのですが(恐らく見慣れていないだけかもしれない。)、何か同じ違和感を感じましたら、この書き方だとこういう問題があるなどお気づきな点ありましたらご教示頂けませんでしょうか? if os.environ.get("DEBUG"):   logging.basicConfig(level=logging.DEBUG) config = os.environ.get("CONFIG", "local") app = create_app(config) if __name__ == '__main__':    app.run(host='127.0.0.1', port=8080, debug=True)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問