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

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

ただいまの
回答率

90.04%

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 2,657

doz13189

score 36

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

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

使用サービス: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つです。

  1. hello.py(flask製のファイル)
  2. demoapp_uwsgi.ini(uWSGIの設定ファイル)
  3. myapp.conf(nginxの設定ファイル)
#/var/www/demoapp/hello.py


from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run()
#/var/www/demoapp/demoapp_uwsgi.ini



base = /var/www/demoapp

app = hello

module = %(app)

home = /home/takahiro/anaconda3/bin/python

pythonpath = %(base)

socket = %(base)/%n.sock

chmod-socket    = 666

#the variable that holds a flask application inside the module imported at line #6
callable = app

logto = /var/log/uwsgi/%n.log
touch-logreopen = %(base)/.logreopen_trigger

touch-reload = %(base)/.uwsgi_touch
#/etc/nginx/conf.d/myapp.conf


server {
    listen      80;
    server_name localhost;
    charset     utf-8;
    client_max_body_size 75M;

    location / { try_files $uri /var/www/demoapp; }
    location /var/www/demoapp {
        include uwsgi_params;
        uwsgi_pass unix:///tmp/uwsgi.sock;
    }
}

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+3

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/14 14:51

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

    キャンセル

checkベストアンサー

+1

/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 を以下のように書き換えてみてください。

upstream flask {
    server unix:/var/www/demoapp/uwsgi.sock;
}

server {
    listen      80;
    root /var/www/demoapp;
    server_name localhost;
    charset     utf-8;
    client_max_body_size 75M;

    location / {
        try_files $uri @flask;
    }

    location @flask {
        include uwsgi_params;
        uwsgi_pass  flask;
    }
}

 

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/14 14:57

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

    キャンセル

+1

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

server {
    listen      80;
    server_name localhost;
    charset     utf-8;
    client_max_body_size 75M;

    location / { 
        try_files $uri /var/www/demoapp;
        include uwsgi_params;
        uwsgi_pass unix:///tmp/uwsgi.sock;
    }
}

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

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

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

 追記(5/7 10:10)

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/14 14:55

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

    キャンセル

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

  • ただいまの回答率 90.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る