WSGIアプリをPasteで組み合わせるなど ==================================== シンプルなWSGIアプリを用意 --------------------------- まずは環境構築のために以下を実行します。 .. code-block:: bash $ python bootstrap.py -d init $ bin/buildout bucho_ 0.0.5 からwsgiアプリケーション機能を提供しているので、これを使って WSGIアプリを起動します。 .. _bucho: http://pypi.python.org/pypi/bucho buildout.cfg: .. literalinclude:: code/paste-wsgi/buildout_step1.cfg :language: ini bin/buildout を実行してbucho環境を構築します。 .. code-block:: bash $ bin/buildout Pythonインタプリタを起動して、以下のようにして実際にサーバー起動させます (以下のコードはPython-2.5以降で動作します)。 .. code-block:: pycon $ bin/py >>> from wsgiref.simple_server import make_server >>> from bucho.wsgi import wsgi_app >>> make_server('', 8000, wsgi_app).serve_forever() これで http://localhost:8000/ にアクセスすると、シンプルなテキストでbucho wsgiアプリが提供している機能が表示されます。bucho-0.0.5では以下のように表示されます:: bucho provide below urls: * /show * /latest_status * /all_status * /torumemo bucho wsgiアプリが提供するURLが表示されますが、テキストなのでリンクされていません。手でURLを書き換えてアクセスするとそれぞれのページを確認することが出来ます。とりあえずbuildout paste wsgiの説明としてはトップページが表示されれば十分ですね。 `bucho.wsgi.wsgi_app` がどのような作りなのかはコードを見てください。また、Pythonのドキュメントにも有用な情報が多く掲載されています。Python-2.5から導入された wsgiref パッケージのドキュメントを参照してください。 paster から起動する -------------------- wsgiアプリを起動するために、前述のような `wsgiref.simple_server.make_server` を使った簡単なプログラムを書いても良いのですが、そのあたりもコードを書かずに手軽に動かしたいところです。そこで、PasteDeployを使用してwsgiサーバーを起動してみます(bin/pasterコマンド生成のためPasteScriptも必要)。 buildout.cfg: .. literalinclude:: code/paste-wsgi/buildout_step2.cfg :language: ini そして環境更新のために以下を実行します。 .. code-block:: bash $ bin/buildout これで bin/paster が作成されました。 bin/paster でwsgiアプリを起動するためには、設定ファイルでどのようなアプリ構成で動かすのかを指定する必要があります。とりあえず動かすために以下のようにiniファイルを作成してください。 app.ini: .. literalinclude:: code/paste-wsgi/app_step2.ini :language: ini 簡単にapp.iniの内容を説明します。 `[server:main]` は `paster serve` コマンドで実行したときのサーバー設定です。 use で記載しているのはsetuptoolsのエントリーポイントで、 `use = egg:Paste#http` と指定することでPasteパッケージのserver_runnerセクションにあるhttpエントリーポイントを使うことを宣言しています。 他のパラメータhost,portはPaste#httpで解釈され、サーバーのホスト名、ポート番号として使用されます。 設定ファイルの詳細についてはPasteの以下のドキュメントを参照してください。 * `Paste Script `_ * `Paste Deployment `_ サーバー起動は以下のように実行します。 .. code-block:: bash $ bin/paster serve app.ini Starting server in PID 6536. serving on 0.0.0.0:8000 view at http://127.0.0.1:8000 最初と同じように、 http://localhost:8000/ にアクセスすると、buchoが表示されますね。 paster の引数を設定済みの起動コマンドを作る -------------------------------------------- ところで、毎回 `bin/paster serve app.ini` と入力するのは面倒なものです。 そこで設定を追加して `bin/server` だけで起動出来るように変更します。 buildout.cfg: .. literalinclude:: code/paste-wsgi/buildout_step3.cfg :language: ini 上記のようなserverセクションを追加すると、特定のコマンド実行時の引数を指定済みの実行スクリプトをbin/serverとして生成してくれます。entry-pointsに指定している値 `paste.script.command:run` はPasteパッケージの `console_scripts` セクションからコピーして作りました。 `entry-points =` の書式については `zc.recipe.egg `_ を参照してください。 buildout.cfgを更新したら環境更新のために以下を実行します。 .. code-block:: bash $ bin/buildout これで、サーバー起動は以下のように実行できるようになりました。簡単ですね。 .. code-block:: bash $ bin/server Starting server in PID 6536. serving on 0.0.0.0:8000 view at http://127.0.0.1:8000 app.ini をbuildoutの設定から半自動生成する ------------------------------------------- .. todo:: 説明を書く apacheから接続するためのスクリプトを用意する ----------------------------------------------- .. todo:: 説明を書く apacheから接続するためのテンプレートを用意する ----------------------------------------------- .. todo:: 説明を書く まとめ ------- 最終的に以下のようになりました。 .. todo:: もうちょっと説明を書く buildout.cfg: .. literalinclude:: code/paste-wsgi/buildout.cfg :language: ini 実行すると以下のようになります: .. code-block:: bash $ touch versions.cfg $ bin/buildout サーバー起動 .. code-block:: bash $ bin/server Starting server in PID 6536. serving on 0.0.0.0:8000 view at http://127.0.0.1:8000 cat versions.cfg .. code-block:: ini [versions] collective.recipe.modwsgi = 1.2 collective.recipe.template = 1.8 distribute = 0.6.14 paste = 1.7.5.1 pastedeploy = 1.3.4 pastescript = 1.7.3 pygments = 1.4 tempita = 0.5dev weberror = 0.10.3 webob = 1.0.3 z3c.recipe.scripts = 1.0.1 zc.recipe.egg = 1.3.2 $ cat etc/apache-vhost.conf .. code-block:: apache Order deny,allow Allow from all ServerName www.example.com CustomLog /var/log/httpd/www.example.com-access.log combined ErrorLog /var/log/httpd/www.example.com-error.log WSGIDaemonProcess www.example.com processes=2 threads=2 maximum-requests=10000 user=www group=www WSGIScriptAlias / c:\Project\freia\buildout\source\code\paste-wsgi/parts/wsgiapp/wsgi WSGIProcessGroup www.example.com WSGIPassAuthorization On .. ** cat etc/app.ini .. code-block:: ini [DEFAULT] debug = true [server:main] use = egg:Paste#http host = 0.0.0.0 port = 8000 [composite:main] use = egg:Paste#urlmap /static = static / = bucho-pipeline [app:static] use = egg:Paste#static document_root = c:\Project\freia\buildout\source\code\paste-wsgi/static [pipeline:bucho-pipeline] pipeline = egg:WebError#evalerror bucho-main [app:bucho-main] use = egg:bucho#main ;##################################### ; logger setting for mod_wsgi app [loggers] keys=root [handlers] keys=hand01 [formatters] keys=form01 [logger_root] level=INFO handlers=hand01 [handler_hand01] class=FileHandler level=INFO formatter=form01 args=('python.log', 'w') [formatter_form01] format=F1 %(asctime)s %(levelname)s %(message)s datefmt= class=logging.Formatter