Skip to content
Find file
Fetching contributors…
Cannot retrieve contributors at this time
245 lines (152 sloc) 10.3 KB
layout title
default
インストールガイド

インストールガイド

web.pyをダウンロードします。

http://webpy.org/static/web.py-0.33.tar.gz

ダウンロードファイルを展開し、あなたのアプリケーションがあるディレクトリに展開したフォルダwebpyの直下にある web フォルダをコピーしてください。 もしくは以下のコマンドを実行し、すべてのアプリケーションからのアクセスを可能にします。

python setup.py install

ノート: Ubuntuなどrootを許可していない unix/linux などでは以下のコマンドで実行する必要があるかもしれません。

sudo python setup.py install

推奨セットアップを参照してください。

Easy Installを使えばワンステップでインストールすることが可能です。

easy_install web.py

開発

webpy には内蔵のウェブサーバが付属されています。 まず、チュートリアルにしたがってアプリケーションを学んでください。 チュートリアルで作成したソースコードをcode.pyと名前をつけたファイルに保存してください。以下のコマンドを実行することで、ウェブサーバーが起動します。

 python code.py

ブラウザを起動し、 http://localhost:8080/ のページを開いてください。別のポートを指定するには python code.py 1234 のようにします。

本番(公開)稼動

開発時やサンプルプログラムを実行するだけなら内蔵のウェブサーバでかまいませんが、 外部へ公開するには力不足です。本番稼動に向けたWebサーバー構築の方法を示します。

web.py はWSGIを実装していますので、互換性のあるもので実行することが可能です。

WSGIとは、ウェブサーバとアプリケーション(JavaのServletインターフェースと非常に似ています)の間で共通のAPIです。 CGI/FastCGI/SCGIを備えたweb.pyを実行するためには、flup(ここからダウンロード)をインストールする必要があります。インストールすることで、web.pyにWSGIインターフェースのAPIを提供することができます。

CGI実行を行う場合はファイルcode.pyの先頭に以下を追記してください。

#!/usr/bin/env python

また、ファイルに実行権限を付加してください。 chmod +x code.py

LightTPD

.. with FastCGI

web.pyでは、lighttpd + FastCGI方式が推奨されています。reddit.com はこの方式で何百万ものアクセスに応答しています。

lighttpdの設定は以下のようになります。

 server.modules = ("mod_fastcgi", "mod_rewrite")
 server.document-root = "/path/to/root/"     
 fastcgi.server = ( "/code.py" =>     
 (( "socket" => "/tmp/fastcgi.socket",
    "bin-path" => "/path/to/root/code.py",
    "max-procs" => 1
 ))
 )

 url.rewrite-once = (
   "^/favicon.ico$" => "/static/favicon.ico",
   "^/static/(.*)$" => "/static/$1",
   "^/(.*)$" => "/code.py/$1"
 )

lighttpdのいくつかのバージョンでは、fastcgi.serverの"check-local"の値が"false"に設定しておく必要があります。特に配置したcode.pyがドキュメントルート外に配している場合が特に注意が必要です。

もし、flupがインストールがインストールできない場合は、"easy_install flup" を実行することでインストールすることができるかもしれません。

Since revision 145, it is necessary to set a bin-environment variable on the fastcgi configuration if your code uses redirects. If when your code redirects to http://domain.com/ and in the url bar you see http://domain.com/code.py/, you'll need to set the environment variable. This will cause your fastcgi.server configuration above to look something like this:

fastcgi.server = ( "/code.py" =>
((
   "socket" => "/tmp/fastcgi.socket",
   "bin-path" => "/path/to/root/code.py",
   "max-procs" => 1,
   "bin-environment" => (
     "REAL_SCRIPT_NAME" => ""
   ),
   "check-local" => "disable"
))
)

Apache

.. with CGI

httpd.confもしくはapache2.confに以下を追記してください。

Alias /foo/static/ /path/to/static
ScriptAlias /foo/ /path/to/code.py

.. with CGI using .htaccess

CGIは以下を.htaccessに追記するだけですので構築するのは簡単ですが、高性能なウェブサイトには向いていません。

Options +ExecCGI
AddHandler cgi-script .py

and point your browser to http://example.com/code.py/. Don't forget the trailing slash, otherwise you'll see a not found message (because the urls list you defined do not match anything). To make things work without having to enter code.py, enable mod_rewrite rules (see below).

Note: The way web.py is implemented breaks the cgitb module because it captures stdout. I worked around the issue by using this:

import cgitb; cgitb.enable()
import sys

# ... import web etc here...

def cgidebugerror():
    """                                                                         
    """        _wrappedstdout = sys.stdout

    sys.stdout = web._oldstdout
    cgitb.handler()

    sys.stdout = _wrappedstdout

web.internalerror = cgidebugerror

.. with FastCGI

FastCGIを構築するのは簡単で、mod_pythonと同じ動作をします。

.htaccessに以下を追記してください。

<Files code.py>      SetHandler fastcgi-script
</Files>

残念ですが、lighttpdと異なり、apacheでは、明示的にFastCGIであることをweb.pyに教えなければなりません。code.pyif __name__ == "__main__":の後に以下を追記する必要があります。

web.wsgi.runwsgi = lambda func, addr=None: web.wsgi.runfcgi(func, addr)

and point your browser to http://example.com/code.py/. Don't forget the trailing slash, otherwise you'll see a not found message (because the urls list you defined do not match anything). To make things work without having to enter code.py, enable mod_rewrite rules (see below).

Walterからの追加のアドバイスはこちら.

.. with SCGI

https://www.mems-exchange.org/software/scgi/ download mod_scgi source here: http://www.mems-exchange.org/software/files/mod_scgi/ windows apache user: edit your httpd.conf:

LoadModule scgi_module Modules/mod_scgi.so
SCGIMount / 127.0.0.1:8080

apacheの再起動とcode.pyを以下のコマンドで起動してください。

python code.py 127.0.0.1:8080 scgi

起動後、ブラウザで 127.0.0.1を開いて確認してください。

.. with mod_python

mod_pythonは、FastCGIと同様に動作しますが、構築するのは簡単ではありません。

Python 2.5を使用している場合:

cd /usr/lib/python2.5/wsgiref
# or in windows: cd /python2.5/lib/wsgiref
wget -O modpython_gateway.py http://projects.amor.org/misc/browser/modpython_gateway.py?format=raw
# or fetch the file from that address using your browser

Python 2.5以前のバージョンを使用している場合:

cd /usr/lib/python2.4/site-packages
# or in windows: cd /python2.4/lib/site-packages
svn co svn://svn.eby-sarna.com/svnroot/wsgiref/wsgiref
cd wsgiref
wget -O modpython_gateway.py http://projects.amor.org/misc/browser/modpython_gateway.py?format=raw
# or fetch the file from that address using your browser  

code.pyのファイル名をcodep.pyに変更してください。

main = web.wsgifunc(web.webpyfunc(urls, globals()))

.htaccessに以下を追記してください。

AddHandler python-program .py
PythonHandler wsgiref.modpython_gateway::handler
PythonOption wsgi.application codep::main

さらにRewriteRuleを追加することで、//codep.py/ に向けることができます。

/codep.py/ の末尾 /(スラッシュ)を忘れると、エラー画面(Please contact the administrator.)が表示されます。

.. with mod_wsgi

mod_wsgiは、特色としてmod_pythonより性能が優れており、構築が非常に簡単な新しいApacheモジュールです。

At the end of your code.py, add:

application = web.wsgifunc(web.webpyfunc(urls, globals()))

mod_wsgi offers many possible ways to expose a WSGI application in Apache's URL hierarchy, but one simple way would be to add the following to your .htaccess:

<Files code.py>
    SetHandler wsgi-script
    Options ExecCGI FollowSymLinks
</Files>

If you get an "ImportError: No module named web" in your apache error.log file, you could try setting the absolute path in code.py before importing web:

import sys, os
abspath = os.path.dirname(__file__)
sys.path.append(abspath)
os.chdir(abspath)
import web

Also, you might want to read the "Application Working Directory" section from Common problems with WSGI applications.

It should then be accessible at http://example.com/code.py/ as usual.

mod_rewrite Rules for Apache

If you want webpy to be accessible at 'http://example.com' instead of 'http://example.com/code.py/' add the following rules to the .htaccess file:

<IfModule mod_rewrite.c>      
  RewriteEngine on
  RewriteBase /
  RewriteCond %{REQUEST_URI} !^/icons
  RewriteCond %{REQUEST_URI} !^/favicon.ico$
  RewriteCond %{REQUEST_URI} !^(/.*)+code.py/
  RewriteRule ^(.*)$ code.py/$1 [PT]
</IfModule>

If the code.py is in the subfolder myapp/, adjust the RewriteBase to RewriteBase /myapp/. If you have static files like CSS files and images to pass through, duplicate the line with the icons for each path you want to allow.

Something went wrong with that request. Please try again.