スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[python]Macでmod_wsgiを動かしてみる。

pythonのwebアプリケーションフレームワークで使用されているwsgi。
Djangoとか適当に使えば、なんとなく使えるのだろうけど、
その前に、wsgiとはなんぞや?
と気になったので、mod_wsgiを動かしてみた。

使ってみると、結構これだけでwebアプリケーション作れるんじゃ無いか?
と思ったので、使い方(Helloworldレベル)を書き残しておきます。
(結構長文になる予感orz)

環境
プロセッサ 1.7 GHz Intel Core i5
ソフトウェア Mac OS X Lion 10.7.2(11C74)
Server version Apache/2.2.20 (Unix)
python version 2.6



wsgiのインストール

まずは、portsでwsgiをインストールします。
portsの使い方は、過去の記事を参照。
portsを使うとapacheやpython26が入っていない人も勝手にインストールされると思います。

$ sudo port install mod_wsgi -python26
・・・(中略)・・・
---> Verifying checksum(s) for mod_wsgi
---> Extracting mod_wsgi
---> Configuring mod_wsgi
---> Building mod_wsgi
---> Staging mod_wsgi into destroot
Warning: mod_wsgi installs files outside the common directory structure.
---> Installing mod_wsgi @3.3_0+python26
########################################
# To enable mod_wsgi add
# LoadModule wsgi_module modules/mod_wsgi.so
# to your apache2 config file:
# /opt/local/apache2/conf/httpd.conf
########################################
---> Activating mod_wsgi @3.3_0+python26
---> Cleaning mod_wsgi


と、あっさり完了。
ここで、今回インストールされたのは、
mod_wsgi3.3.0
です。


apacheの設定

$ sudo vi /opt/local/apache2/conf/httpd.conf


にて、httpd.confにて、mod_wsgiの設定とhttpd-userdir.confをincludeするように設定します。
今回は、~/Site以下にてapache動作できるようにします。
以下を追加、コメントアウトします。

LoadModule wsgi_module modules/mod_wsgi.so

# User home directories
Include conf/extra/httpd-userdir.conf


次に

$ sudo vi /opt/local/apache2/conf/extra/httpd-userdir.conf


とし、httpd-userdir.confを変更しwsgiを設定します。
以下を<Directory "/Users/*/Sites">タグ内に記入します。

## mod_wsgi
Options Indexes FollowSymLinks ExecCGI
SetHandler wsgi-script
AddHandler wsgi-script .wsgi
AddHandler wsgi-script .py


これで、apacheにてwsgiの動作が可能となります。



wsgiの動作

wsgiを動作させるには、2種類の方法があります。
1.pythonで動作
2.apacheで動作


私もこれを発見(?)するのに結構かかりましたので、両方書きます。
今回は、以下のサンプルコードを使います。
testwsgi.py

def hellowsgi(environ, start_response):
start_response('200 OK', [('Content-type', 'text/plain')])
print "Debug test #1" # デバック用
return 'Its works by mod_wsgi!'

from wsgiref.simple_server import make_server
make_server('', 8080, hellowsgi).serve_forever()

def hellowsgi内
environは、辞書型でクライアントからのリクエスト情報が入っています。
environ Variablesを参考ください。
start_responseは、httpレスポンスです。ステータスコードやヘッダを入れます。
そして、レスポンス内容を返します。

その他
ある意味main文。(じゃぁ、main文書けよって話ですが、面倒くさいので、、、)
make_serverにてサーバを作って、レスポンスを返す関数を与えています。
serve_forever()は、死ぬまで一生続けるよ、って関数です。


1.pythonで動作
まずは、先ほど示したtestwsgi.pyを~/Site内にtestwsgi.pyにて保存します。
pythonでの動作はpythonが実行できるディレクトリであれば何処でもよいのですが、
次に紹介するapacheの動作にてSite内でなければ動作しませんのでSite内にしました。
(おそらくSite内は、Pythonも実行できると思う、、、)

$ python testwsgi.py


を実行し、testwsgi.pyを動かします。
次に任意のブラウザにて、
http://localhost:8080/
にアクセスします。ここで、実行したpythonモジュールが実行されます。
It works by mod_wsgi!
と表示されたら成功です。
また、コンソール出力に

Debug Line #1
1.0.0.127.in-addr.arpa - - [30/Nov/2011 17:32:34] "GET / HTTP/1.1" 200 21
Debug Line #1
1.0.0.127.in-addr.arpa - - [30/Nov/2011 17:32:34] "GET /favicon.ico HTTP/1.1" 200 21


と表示されます。
ここでは、httpリクエストと、任意の標準出力、エラーが出力されます。
よって、簡単なデバックはprint等を使って行う事ができます。
終了は、ctrl+Cです。


2.apacheでの確認
1にて、Site内にファイルを保存したと思いますので、そのまま実行します。
apacheを動作します。

$ sudo vi /opt/local/apache2/bin/apachectl start


次に、ブラウザにて、次のurlを打ち込みます。
http://localhost/~[ユーザ名]/testwsgi.py
エラーが出てきたと思います。
これは、pythonで実行したコードをapacheを通すと実行できない事を示しています。
では、apache用にコードを変更します。

まずは、要らないコード

from wsgiref.simple_server import make_server
make_server('', 8080, hellowsgi).serve_forever()

を削除します。apacheからアクセスする場合は、実行(main文)は必要ありません。
そうすると、def文を呼び出すものがなくなってしまいます。
どこから呼び出すのか?
ここに書いてありました。
Configuration Guidelines
application関数を勝手に呼び出すようです。
よって、hellowsgiの関数名をapplicationに変更します。
最終的に以下のようなコードになります。

def application(environ , start_response):
print "Debug Line #1"
start_response('200 OK',[('Content-Type','text/plain')])
return 'It works by mod_wsgi!'


再度、ブラウザにアクセスすると正常に表示されたと思います。
また、エラーや標準出力は、apacheのエラーログに出力されます。
httpd.confのErrorLogを確認してみて下さい。

と、このような形でwsgiの基本動作をやってみましたが、
これを理解してDjango等に取り組むと、もっと面白い開発ができるのではないか?
と思いました。

また、探しているとこんな記事がありました。
WSGIとPythonでスマートなWebアプリケーション開発を
よく書いてありますので、他のアプリケーションも試してみるといいと思います。

おわり。
スポンサーサイト

テーマ : ソフトウェア開発
ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

ss_9

名前 :ss_9
紹介 :
20代はエンジニア、30代はプロ、40代は管理、50代は人脈。

Twitterボタン

最新記事
カテゴリ
AD
月別アーカイブ
RSSリンクの表示
RSSリンクの表示
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。