ラベル uWSGI の投稿を表示しています。 すべての投稿を表示
ラベル uWSGI の投稿を表示しています。 すべての投稿を表示

2015年4月5日日曜日

Python ファイルが更新されたら uWSGI サービスを自動的にリロード

uWSGI で動く Python アプリを開発しているのですが、開発中に Python ファイルを更新する度に uWSGI サービスをリロードするのは手間がかかります。そこで、Python ファイルが更新されたら uWSGI サービスを自動的にリロードするようにしてみました。

環境
Ubuntu 14.04 (Trusty Tahr) Server

まず、uWSGI Python アプリのファイル名を WsgiApp.py とします。

WsgiApp.py を監視し、更新されたら uWSGI をリロードするモジュール mFileMon.py を作成

$ cat mFileMon.py
#!/usr/bin/env python3

import uwsgi
from uwsgidecorators import filemon

filemon('/some/where/WsgiApp.py')(uwsgi.reload)

mFileMon.py はモジュール検索パスが通っているどこか適当な場所に設置します。

uWSGI の WsgiApp 設定ファイルで、import に mFileMon を指定します。

$ cat /etc/uwsgi/apps-available/WsgiApp.ini
[uwsgi]
plugins = python3
pythonpath = /some/where
module  = WsgiApp
import = mFileMon

念のため、uWSGI をリスタートします。

$ sudo service uwsgi restart

以降は WsgiApp.py が更新されると uWSGI サービスが自動でリロードされます。

なお、mFileMon.py で filemon() に渡しているパスを以下のようにすると /some/where/ ディレクトリを監視し、このディレクトリに設置されたどんなファイルが更新されても uWSGI サービスをリロードするようにできるようです。

$ cat mFileMon.py
#!/usr/bin/env python3

import uwsgi
from uwsgidecorators import filemon

filemon('/some/where')(uwsgi.reload)

参考


2013年4月11日木曜日

Ubuntu12.0 で Enginx で uWSGI で python3

Ubuntu12.0 で Enginx で uWSGI で python3 やってみました。

パッケージインストール
$ sudo apt-get install nginx
$ sudo apt-get install uwsgi
$ sudo apt-get install uwsgi-plugin-python3

Nginx 設定
$ pwd
/etc/nginx/sites-available

$ diff -u default.Org default
--- default.Org  2012-07-13 03:55:30.000000000 +0900
+++ default      2013-04-11 17:49:41.267955155 +0900
@@ -43,6 +43,11 @@
                deny all;
        }
 
+       location /MyApp/ {
+               include uwsgi_params;
+               uwsgi_pass unix:/var/run/uwsgi/app/MyApp/socket;
+       }
+
        # Only for nginx-naxsi used with nginx-naxsi-ui : process denied requests
        #location /RequestDenied {
        #       proxy_pass http://127.0.0.1:8080;    

ソケットファイルでなく、TCP ソケットで uWSGI サーバーと通信する場合は uwsgi_pass を以下のようにします。(対応する uWSGI サーバーの設定も変更必要です。)
- uwsgi_pass unix:/var/run/uwsgi/app/MyApp/socket;
+ uwsgi_pass 127.0.0.1:9090;

uWSGI 設定
アプリケーション用ファイル設置
$ pwd
/etc/uwsgi/apps-available

$ cat MyApp.ini 
[uwsgi]
plugins = python3
python-path = /usr/share/nginx/www/MyApp
file = /usr/share/nginx/www/MyApp/MyApp.py
TCP ソケットを使う場合は以下も追加
socket = :9090
apps-enabled にシンボリックリンク作成
$ pwd
/etc/uwsgi/apps-enabled

$ sudo ln -s ../apps-available/MyApp.ini ./

Python スクリプト設置
$ pwd
/usr/share/nginx/www
$ sudo mkdir MyApp

$ pwd
/usr/share/nginx/www/MyApp
$ cat MyApp.py 
import sys

def GetContents(dEnviron):
        yield sys.version + '\n'
        yield '\n'

        for sName, xValue in dEnviron.items():
                yield '{}: {}\n'.format(sName, xValue)

def application(dEnviron, cStart_response):
        sStatus = '200 OK'
        lHeaders = [('Content-type', 'text/plain')]

        cStart_response(sStatus, lHeaders)

        for sLine in GetContents(dEnviron):
                yield sLine.encode()
sLine.encode() というように、バイト文字列に変換しないとうまくブラウザで表示されませんでした。
http://ja.wikipedia.org/wiki/Web_Server_Gateway_Interface の「WSGIとPython 3」が関係してる気がします。
(GetContents() をイテレートするような面倒くさい作りにしたのは、将来バイト文字列に変換しなくても良くなったときに簡単に対応できるようにするためです。)

各サービス起動
$ sudo service nginx start
$ sudo service uwsgi start

ブラウザで http://Server/MyApp/ にアクセスすると Python のバージョンと環境変数が表示されます。