Apache+mod_wsgi+Flaskインストール

はいこんばんは。
生きてます生きてます。

ここ一週間、またPythonごりごりやってます。
今度は小さーいシステムなんでFlask (Python製マイクロフレームワーク)でさくっと作ってます。
Flaskはマイクロと名前がついているだけあって、インストールは楽だしアプリ作成手順もシンプルだし…で、触ってて楽しいですね(・∀・)。

今回、Flaskをサーバーにインストールして動かしたのでそのメモ。
環境:
サーバー: EC2, Apache + mod_wsgi
Pythonバージョン: Python2.6.6 (EC2デフォルトのバージョン)

あ、ついでなので、PythonでできたWebアプリケーションを扱う時に言われる
「ファイル更新したらApacheリロードしなきゃいかんのめんどくさー!」
って誤解も解いておきますね。

2012.5.20 追記 —-
httpd.confに「WSGIScriptReloading On」が抜けていたので追加
—- 追記ここまで

インストール・設定方法

[shell]
sudo easy_install pip
sudo pip install flask
sudo yum install httpd-devel python-devel
[/shell]
※pip使っているのは単純に好みからです

EC2のyumで入るmod_wsgiはバージョンが古くて変なエラーが出るので
最新版をソースからインストールする。

[shell]
cd /usr/local/src
sudo wget http://modwsgi.googlecode.com/files/mod_wsgi-3.3.tar.gz
tar xzvf mod_wsgi-3.3.tar.gz
cd mod_wsgi-3.3
sudo ./configure –with-apxs=/usr/sbin/apxs –with-python=/usr/bin/python
sudo make
sudo make install
[/shell]
/etc/httpd/modules
mod_wsgi.soがあるか確認。

Flaskアプリをてきとーに書く。

[python title=”flasktest.py”]
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from flask import Flask

app = Flask(__name__)

@app.route(‘/’)
def index():
return ‘Flaskいっちょあがりー’

if __name__ == ‘__main__’:
app.run()
[/python]

Flaskアプリケーションはどこに置いてもいいけど
今回は /home/foo/flask/flasktest.py に置いてみる。

次はwsgiファイルを書く。
[python title=”flasktest.wsgi”]
# -*- coding:utf-8 -*-
# Updated: 2011/11/03
# Version: 0.1.1

# Flaskアプリケーショントップのパスをpathに追加
import sys, os
sys.path.append(‘/home/foo/flask’)

from flasktest import app as application
[/python]

こいつはアプリケーショントップに置きます。
/home/foo/flask/flasktest.wsgi

httpd.confを書き書き。
基本はドキュメント( http://flask.pocoo.org/docs/deploying/mod_wsgi/ )通り。
※WSGI部分だけ書いてます

[plain title=”httpd.conf”]
LoadModule wsgi_module modules/mod_wsgi.so

WSGISocketPrefix /var/run/wsgi
<VirtualHost *:80>
ServerName example.com

DocumentRoot /var/www/html
<Directory /var/www/html>
Order allow,deny
Allow from all
</Directory>

WSGIDaemonProcess example.com user=apache group=apache threads=5
WSGIScriptAlias / /home/foo/flask/flasktest.wsgi
WSGIScriptReloading On

<Directory /home/foo/flask>
WSGIProcessGroup example.com
WSGIApplicationGroup %{GLOBAL}
Order deny,allow
Allow from all
</Directory>
</VirtualHost>
[/plain]
ここのDocumentRootは指定しなくてもいい気はするんだけど。
なんか設定しないと変な挙動になったので一応。。

で。やたらとハマるのはWSGIのDaemonモード。
EC2だと
WSGISocketPrefix /var/run/wsgi
なんだけど、
WSGISocketPrefix run/wsgi
とする環境もあるっぽい。
これをきちんと設定しないとPermission deniedほげほげ
と言われて先に進めない。

あと
WSGIDaemonProcess example.com user=apache group=apache threads=5
のuserとgroupはきちんと指定しましょう。
指定し忘れると怒られます。

WSGIDaemonProcess example.com

WSGIProcessGroup example.com
の太字部分は合わせましょう。でないと
No WSGI daemon process called ‘ほにゃらら’
と怒られます。

と、ここまで書いたら
[plain]
sudo /usr/sbin/apachectl configtest
[/plain]
で確認。

OKであればApache(リ)スタート。
[plain]
sudo service httpd restart
[/plain]

これでブラウザからアクセスすれば動くはず(・ω・)

ファイル更新時、コマンドラインを使わずにプロセスを再起動

そういえばPythonはPHPと違って、ファイル更新しただけだと反映されませんよね。
で、Apache再起動しなきゃーってなる。
これは非常に面倒くさい orz

ところがDaemonモードでmod_wsgiを動かしている場合、
SSHでコマンドを叩く必要はありません。
wsgiファイルの日付が更新されると自動でプロセス再起動が発生します。

pythonファイルを一通り更新し、最後に日付を更新したwsgiファイルをつっこむと、次回アクセス時にプロセスが再起動されて更新完了。
参考:modwsgi wiki

PythonでできたWebアプリケーションの運用は、これを知っておくと大分楽だと思いますヨ。
あ、mod_wsgiで動かすアプリケーションであれば、どれも同じ方法で更新できます。(Djangoとかもね)

環境ができあがってしまえばFlaskたのしーっす。
SNSのような、ログインが必要なアプリケーションであればDjango使ったほうが楽かもだけど、ちょっとしたアプリケーションならFlaskで十分。

…というわけで、そこのあなたもFlaskいかが(・∀・)?

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください