動かざることバグの如し

近づきたいよ 君の理想に

NGINX UnitでPython+Flaskを動かしてみる

つい先日、NginxがNGINX Unitと呼ばれる新しいアプリケーションをオープンソースとしてリリースした。

www.publickey1.jp

これを使うと、PHP、Go、Python、さらにはJava、Node.jsのアプリケーションとNginxの連携が楽になる(らしい

ということで実際にpythonの軽量WEBフレームワークことFlaskで試してみた。

環境

  • Ubuntu Server 16.04
  • Pyhton 3.5
  • NGINX Unit 0.1

構成

いままでは

Nginx ----- uWSGI ---- server.py(Flask)

だったのが

Nginx ----- NGINX Unit ---- server.py(Flask)

になる。

手順

まずはインストール。認証鍵のインストールを適当なところにダウンロードして追加

wget http://nginx.org/keys/nginx_signing.key
apt-key add nginx_signing.key

でインストール

apt update
apt install unit -y

flask入ってなかったら入れておくこと

pip install flask

次にサンプルのFlaskコードを用意する。今回は /home/ubuntu/wsgi.py に以下を記述

#!/usr/bin/env python

from flask import Flask

application = Flask(__name__)

@application.route("/")
def index():
    return "<h1>Hello World!!!!!!!!!</h1>"

次にNGINX Unitにロードさせるための設定ファイルを作成。今風というべきか形式はJSON形式。今回は同ディレクトリの /home/ubuntu/start.jsonに記述

{
    "applications": {
        "hello": {
            "type": "python",
            "workers": 2,
            "path": "/home/ubuntu",
            "module": "wsgi"
        }
    },
    "listeners": {
        "*:8400": {
            "application": "hello"
        }
    }
}

module": "wsgi"となっているがPythonのファイル名と合わせること。ポート番号8400は任意。

いざ設定 rootで

curl -X PUT -d @start.json --unix-socket /var/run/control.unit.sock http://localhost/
service unitd restoreconfig /home/ubuntu/start.json

のあとに以下を叩いて記述したJSONが返ってきたら成功

sudo curl --unix-socket /var/run/control.unit.sock http://localhost/

これで http://localhost/:8400を開くとHello worldがお出迎えしてくれる

現状の問題点

  • 設定項目がUwsgiより圧倒的に少ない
  • pyenv、virtualenvなどといった仮想python環境に対応できていない
  • これについてはすでにIsuueが上がってる https://github.com/nginx/unit/issues/15

まぁ時間が解決してくれるでしょと気長に待つことにした