Flask uWSGI Nginx

Dec 30, 2016   #Python  #Nginx  #Web 

概要

  • これまでgunicornを使っていたが、uWSGIの方が良さげ12なのでMacOSにインストールしてみた。

インストール

Flask(0.12), uWSGI(2.0.14), Nginx(1.10.2)を、それぞれpipとbrewでインストールした。 uWSGIは、以下のエラーでこけたが、僕の場合は単にlibxmlがインストールされていなかったことが原因だった。

$ pip install uwsgi
...
ld: file not found: /usr/lib/system/libsystem_symptoms.dylib for architecture x86_64
  clang: error: linker command failed with exit code 1 (use -v to see invocation)
  *** error linking uWSGI ***
...

Flask - uWSGI - Nginx

全く公式ドキュメント3通りで上手くいったが、日本語記事の情報が古くて少しハマった。単に、公式日本語サイトだと思ってたら、第三者サイトで、情報が古かったことが原因。Sphinxドキュメントだと、デザインが公式と同じで気づきにくい。すぐに陳腐化するだろうけど、簡単に解説。

Flask

FlaskのHello Worldそのまま。

# app.py

from flask import Flask
app = Flask(__name__)

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

if __name__ == "__main__":
    app.run()

Flask - uWSGI

uWSGIのApplication serverでFlaskアプリを起動。

$ uwsgi -s /tmp/yourapplication.sock --manage-script-name --mount /yourapplication=myapp:app --http :9090

みたままだが、--mount PATH=FILENAME:APPLICATIONで、PATHにきたリクエストをFILENAME.pyのAPPLICATIONに渡している。またここでは、確認のためPortを明示的に指定している。 http://localhost:9090/yourapplicationにアクセスして、Hello Worldが表示されていれば、正常に動作している。

Flask - uWSGI - Nginx

Nginxの設定ファイルに以下を追加し、再起動する。

location = /yourapplication { rewrite ^ /yourapplication/; }
location /yourapplication { try_files $uri @yourapplication; }
location @yourapplication {
  include uwsgi_params;
  uwsgi_pass unix:/tmp/yourapplication.sock;
}

Nginxが8080でListenしている場合、今度はhttp://localhost:8080/yourapplicationにアクセスして、Hello Worldが表示されていれば、正常に動作している。

おわりに

急がば回れ

参考

関連記事