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

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

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

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

nginx

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

Python 3.x

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

VPS

VPS(バーチャル・プライベート・サーバ)は、仮想化されたサーバをレンタルするサービスで、共有サーバでありながら専門サーバと同等の機能を果たします。物理的な専門サーバより安価で提供できるメリットがあります。

Q&A

解決済

3回答

7259閲覧

nginx + uwsgi + flask でウェブアプリを公開したいのですが...

doz13189

総合スコア38

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

nginx

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

Python 3.x

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

VPS

VPS(バーチャル・プライベート・サーバ)は、仮想化されたサーバをレンタルするサービスで、共有サーバでありながら専門サーバと同等の機能を果たします。物理的な専門サーバより安価で提供できるメリットがあります。

0グッド

1クリップ

投稿2017/05/06 16:16

編集2017/05/06 17:45

ウェブアプリを公開したいと思っています。

使用するツール等はまとめると以下になります。

使用サービス:conohaのVPS
OS:Ubuntu
webサーバー:nginx + uWSGI
webフレームワーク:Flask

現状
VPS上でnginxは正常に稼働し、静止ファイル(index.html等)はIPアドレスから閲覧可能です。

エラー
IPアドレスをうつと、index.htmlではなく、Flask製のファイル(hello.py)にとぶようにしています。
(トップページにHello World!をだしたいため)

IPアドレスをうつと、403Forbiddenが返ってきます。

hello.pyのコードは下に掲載しています。

かなり色々なサイトを調べたのですが、nginxの設定が間違っているのか、はたまた、Flaskのコードの書き方が間違っているのか、どこが間違って上手く表示できないのかがわかりません。

3つのファイルを作成したのですが、もし間違っている部分がありましたらご指摘をしてもらえないでしょうか?
とても、大雑把な質問になり大変申し訳ありません。

掲載しているファイルは以下の3つです。
0. hello.py(flask製のファイル)
0. demoapp_uwsgi.ini(uWSGIの設定ファイル)
0. myapp.conf(nginxの設定ファイル)

python

1#/var/www/demoapp/hello.py 2 3 4from flask import Flask 5app = Flask(__name__) 6 7@app.route("/") 8def hello(): 9 return "Hello World!" 10 11if __name__ == "__main__": 12 app.run() 13

python

1#/var/www/demoapp/demoapp_uwsgi.ini 2 3 4 5base = /var/www/demoapp 6 7app = hello 8 9module = %(app) 10 11home = /home/takahiro/anaconda3/bin/python 12 13pythonpath = %(base) 14 15socket = %(base)/%n.sock 16 17chmod-socket = 666 18 19#the variable that holds a flask application inside the module imported at line #6 20callable = app 21 22logto = /var/log/uwsgi/%n.log 23touch-logreopen = %(base)/.logreopen_trigger 24 25touch-reload = %(base)/.uwsgi_touch 26

python

1#/etc/nginx/conf.d/myapp.conf 2 3 4server { 5 listen 80; 6 server_name localhost; 7 charset utf-8; 8 client_max_body_size 75M; 9 10 location / { try_files $uri /var/www/demoapp; } 11 location /var/www/demoapp { 12 include uwsgi_params; 13 uwsgi_pass unix:///tmp/uwsgi.sock; 14 } 15} 16

補足すべき情報がありましたら、返信をください。
すぐに対応したいと思います。

【追記】
wwwフォルダ以下の権限は全て755です。

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

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

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

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

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

guest

回答3

0

socket ファイルを、uWSGI 側は %(base)/%n.sock で生成しているのに、nginx 側は unix:///tmp/uwsgi.sock と全く違うパスを指定してしまっているためにアクセスできないと思われます。

あと何かうまくいかなかったら、とにかくまずエラーログを見る習慣をつけましょう。

投稿2017/05/07 00:05

miyahan

総合スコア3095

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

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

doz13189

2017/05/14 05:51

回答ありがとうございます。 返信が遅くなり申し訳ありません、nginxの知識があまりにないため勉強をし直していました。 おっしゃるとおり同じパスにすることで異なるsocketを使用しているためのエラーは消えました。
guest

0

ベストアンサー

/var/www/demoapp/demoapp_uwsgi.ini の内容から /var/www/demoapp/uwsgi.sock にsocketファイルが作成されているはずです。その前提で話を進めます。

既に解答にあるように、nginxが /var/www/demoapp/uwsgi.sock ではなく /tmp/uwsgi.sock を参照しているのが問題です。
その為、/etc/nginx/conf.d/myapp.conf を以下のように書き換えてみてください。

Nginx

1upstream flask { 2 server unix:/var/www/demoapp/uwsgi.sock; 3} 4 5server { 6 listen 80; 7 root /var/www/demoapp; 8 server_name localhost; 9 charset utf-8; 10 client_max_body_size 75M; 11 12 location / { 13 try_files $uri @flask; 14 } 15 16 location @flask { 17 include uwsgi_params; 18 uwsgi_pass flask; 19 } 20}

try_files $uri @flask は指定されたpathにファイルがあったらそれを、投げれば location @flaskに飛ばす設定です。
今回はrootディレクトリとして /var/www/demoapp を指定しているので、 http://{IP Address}/image/sample.jpg へのアクセスに対して /var/www/demoapp/image/sample.jpg があればそれを返します。

location @flaskupstream flask で指定したpathに接続させています。

投稿2017/05/07 00:58

munisystem

総合スコア19

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

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

doz13189

2017/05/14 05:57

回答ありがとうございます。 返信が遅くなり申し訳ありません、nginxの知識があまりにないため勉強をし直していました。 ご丁寧にコードの解説までしていただきありがとうございます。 無事、hello worldが表示されました、ありがとうございます。
guest

0

/etc/nginx/conf.d/myapp.conf を以下にして動作しませんでしょうか。

nginx

1server { 2 listen 80; 3 server_name localhost; 4 charset utf-8; 5 client_max_body_size 75M; 6 7 location / { 8 try_files $uri /var/www/demoapp; 9 include uwsgi_params; 10 uwsgi_pass unix:///tmp/uwsgi.sock; 11 } 12}

locationブロックの条件には、URLに対する条件を指定する必要があります。
(先の設定では、http://(IPアドレス)/var/www/demoappと指定する必要があります)

また、ほかにも以下の確認をしていない場合はしてみたほうが良いかと思います。

  • 作成したアプリケーションをFlaskが持つビルトインサーバで実行したあと、Webブラウザからアクセスしてみて目的の動作をしているか確認。
  • uWSGIをTCP/IPで接続を受けるようにして作成したアプリケーションを実行し、WebブラウザからuWSGIアプリケーションサーバに直接アクセスして作成したアプリケーションからレスポンスがきていることを確認。

追記(5/7 10:10)

他の方々の回答にもありますように、nginx設定のUNIX Socketの指定先が間違っているのも原因かと思いますので、そちらもご確認ください。

投稿2017/05/07 00:00

編集2017/05/07 01:14
yukkeorg

総合スコア985

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

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

doz13189

2017/05/14 05:55

回答ありがとうございます。 返信が遅くなり申し訳ありません、nginxの知識があまりにないため勉強をし直していました。 ご指摘の部分のlocationの部分を修正し、また、他にも色々と間違っている部分を諸々修正したところ、hello worldが表示されました、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問