cocuh's note

type(あうとぷっと) -> 駄文

debianのuwsgiでハマったこと

flaskとuwsgiとnginxでwebアプリケーションを組んでみようとした時に、
謎のエラーが出てハマったのでめも

nginxをバーチャルホストを使って次のような感じに

#/etc/nginx/site-available/hoge.conf
upstream hoge{
    server unix:///run/uwsgi/app/hoge/socket;
}
server{
    listen 80;
    server_name hogehoge.typowriter.org;
    location / {
        uwsgi_pass hoge;
        include uwsgi_params;
    }
}

/var/uwsgi/hoge/test.pyが本体スクリプトで、以下のような感じ

from flask import Flask

app=Flask(__name__)

@app.route('/')
def index():
    return 'hakase da nyan'

uwsgiのiniを次のように
virtualenv環境が/var/uwsgi/hoge/envにおいてあります。
(つまり/var/uwsgi/hoge/env/bin/python)

[uwsgi]
plugin=python
chdir=/var/uwsgi/hoge
socket=/run/uwsgi/app/hoge/socket
venv=/var/uwsgi/hoge/env

processes=1

module=test
callable=app

そうして起動して、ブラウザでアクセスすると502 Bad Gateway
nginxのlogを見ると

upstream prematurely closed connection while reading response header from upstream

???
上流でなんか起こったと、uwsgiのことかな?

uwsgi側のlogも見てみると

    • unavailable modifier requested: 0 --

うーんよくわからないのでggrと
http://stackoverflow.com/questions/10748108/nginx-uwsgi-unavailable-modifier-requested-0

uwsgi-plugin-pythonが入っていないと起こる現象のようです。

なのでaptitude installして動いた。やった。
でもそんな簡単なことだったのかいヽ(・ω・)/ズコー


反省

今回ハマったのがuwsgiのiniの書き方が悪いのかnginxの設定が悪いのかわからず、
tutorialを探りまくりlogを読まなかったのが原因です。
きちんとlogはよまないといけない(教訓)

uwsgiの書き方も何通りもあるので、
別のサイトを参考にしたりそこでエラってしまったりしたのが時間食いました、ぐぎぎ…

あとはアプリ側でエラーが起こった場合でも502を返すっぽい挙動も、
uwsgiなどを使わず直接建ててる自分には意外でした。勉強になりました。