軽量Python web framework raypheをnginx+mod_wsgiで動かす

個人的に熱いフレームワーク「rayphe」
wsgiに対応しているようなので、nginx + mod_wsgiの環境で動かしてみます。



nginx + mod_wsgiのインストール



Nginx + WSGI + Pylons環境の構築方法
ここを参考に構築します。

http://nginx.net/
ここからnginxのダウンロード。

http://hg.mperillo.ath.cx/nginx/mod_wsgi/
ここからmod_wsgiのダウンロードを行います。


以下、詳細はリンク先に譲り、手順のみ記載しています。


#RCRE、sslとzlibで必用なモジュールをインストール
# apt-get install libpcre3-dev libssl-dev

# cd /usr/local/src

### モジュールを取得
# wget http://sysoev.ru/nginx/nginx-0.6.39.tar.gz
# wget http://hg.mperillo.ath.cx/nginx/mod_wsgi/archive/tip.tar.gz

### 解凍とリネーム
# tar zxvf nginx-0.6.39.tar.gz
# tar zxvf tip.tar.gz
# mv mod_wsgi-8994b058d2db mod_wsgi

### mod_wsgiの関数を修正
# vi mod_wsgi/src/ngx_http_wsgi_handler.c
    /* XXX not sure */
    /* rc = ngx_http_discard_body(r); */
    rc = ngx_http_discard_request_body(r);


### configureとmake installの実行
# cd nginx-0.6.39
# ./configure --add-module=/usr/local/src/mod_wsgi/ --sbin-path=/sbin/nginx \
--conf-path=/usr/local/nginx/nginx.conf --pid-path=/usr/local/nginx/nginx.pid \
--with-http_ssl_module --with-md5=auto/lib/md5 --with-sha1=auto/lib/sha1

# make
# make install




これでインストールは完了です。




nginxの動作確認



ちゃんとインストールできたかnginxを起動してみます。

--sbin-pathに/sbin/nginxを指定して、./configureを実行したので、
以下のコマンドで起動できます。
# /sbin/nginx

http://[サーバーIP]/
にアクセスしてみると、こんな画面が表示されます。
04_01_20091114201246.png

インストールはうまくいったようです。

nginxを終了するには、./configureの時指定した
--pid-path=/usr/local/nginx/nginx.pid
ここにpidファイルが作成されてますので、そのIDを
指定してkillします。


kill -KILL `cat /usr/local/nginx/nginx.pid`






mod_wsgiの設定



nginxの設定ファイルに、mod_wsgiの設定を行います。

まず、サンプルとして以下のパスにraypheのサンプルプログラムを
作成しました。

/usr/local/python/raphe/index.py
内容は以下のとおり。

#!/usr/bin/env python
# -*- coding:utf-8 -*-

from raphe import *

@app.get("")
def index(c):
    return "hello world!"

# wsgiの定義 applicationにappを設定する
application = app



キモになるのは、
application = app
を追加して、wsgiで必要とされる定義名applicationに
raypheで定義しているappを設定しておく点です。

内容的には、hello world!を表示するだけです。


次に、nginxの設定ファイルを編集します。


### 設定ファイル置き場を作成
# mkdir /usr/local/nginx/conf

### デフォルトのmod_wsgiの設定をコピー
# cp /usr/local/src/mod_wsgi/conf/wsgi_vars /usr/local/nginx/conf/

### nginxの設定を変更
# vi /usr/local/nginx/nginx.conf





nginx.confの内容は、以下のように記載しました。


worker_processes 1;

events {
    worker_connections 1024;
}

http {
    include     mime.types;
    default_type application/octet-stream;
    sendfile        on;
    keepalive_timeout 65;

    server {
        listen     80;
        server_name localhost;
        include conf/wsgi_vars;

        location / {
            root html;
            index index.html index.htm;
        }

        location /raphe {
                wsgi_pass /usr/local/python/raphe/index.py;
        }
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root html;
        }
    }
}



追加した設定は二箇所。

#コピーしたwsgi_varsを指定
include conf/wsgi_vars;

#rapheにアクセスされた場合の指定
location /raphe {
    wsgi_pass /usr/local/python/raphe/index.py;
}




/sbin/nginxを実行して、nginxを起動し、
http://[サーバーIP]/raphe/
にアクセスすると、ちゃんとhello world!と表示されました。
04_02_20091114201246.png




rssマッシュアップサンプルの実行



DebianにPythonフレームワークrapheをインストールし、外部からアクセスする
ここで動かしたサンプルをnginx+mod_wsgiで動かしてみます。


#!/usr/bin/env python
# -*- coding:utf-8 -*-

from raphe import *
import xmlrpclib

def get_exist():
    #接続するURL
    xmlrpc_url = 'http://admin:@localhost:8080/exist/xmlrpc'
    #xml-rpcサービスを作成
    srv = xmlrpclib.ServerProxy(xmlrpc_url)

    #xqueryを定義
    query = """<rss version="2.0">
<channel>
<title>RSSのマッシュアップ</title>
<description>複数のRSSをXQueryを使ってマッシュアップします</description>
{
for $c in /rss/channel/item
where fn:contains($c/title, 'XML')
order by $c/pubDate descending
return $c
}
</channel>
</rss>"""

    params = {'base-uri':'/rss/'}
    result_id = srv.executeQuery(query, params)

    params = {'stylesheet':'/rss/template.xsl'}
    data = srv.retrieve(result_id, 0, params)

    #検索結果を破棄
    srv.releaseQueryResult(result_id)
    
    #コード変換
    return unicode(str(data), 'utf-8')

@app.get("")
def index(c):
    return get_exist()

# wsgiの定義 applicationにappを設定する
application = app




表示は以前と変わりませんが、狙い通りの動作です。
04_03.png



nginx + mod_wsgi + raphe、測定はしてませんが、体感は非常に高速です。

また、デバッグサーバー実行の場合は、プログラムを変更したとき
デバッグサーバーの再起動が必要ですが、この方式だとプログラムの
変更が即座に反映されます。

実際の稼働環境だけでなく、テスト時にも便利だと感じました。





関連記事

コメント

非公開コメント

プロフィール

Author:symfo
blog形式だと探しにくいので、まとめサイト作成中です。
Symfoware まとめ

PR




検索フォーム

月別アーカイブ