2
==========================
4
このドキュメントでは、Apache 2.0とFastCGIもしくはmod_pythonを利用して
5
Bazaar HTTPスマートサーバーをセットアップする1つの方法を説明します。
7
スマートサーバーに関する詳細な情報とそれを設定する他の方法に関しては、
8
メインのスマートサーバーのドキュメントを参照してください。
13
プレーンなHTTPで `/srv/example.com/www/code` を `http://example.com/code/...` として
14
すでに公開しているとします。これはbzrのブランチと `/srv/example.com/www/code/branch-one`
15
と `/srv/example.com/www/code/my-repo/branch-two` のようなディレクトリを含みます。
16
既存のHTTP形式のアクセス権限に加えてリードオンリーのスマートサーバーのアクセス権限を
17
これらのディレクトリに提供したい場合を考えます。
25
最初に、mod_fastcgiを設定します。たとえば次の行をhttpd.confに追加します::
27
LoadModule fastcgi_module /usr/lib/apache2/modules/mod_fastcgi.so
28
FastCgiIpcDir /var/lib/apache2/fastcgi
30
我々の例では、`http://example.com/code` で `/srv/example.com/www/code` をすでに提供しているので
31
既存のApacheの設定は次のようになります::
33
Alias /code /srv/example.com/www/code
34
<Directory /srv/example.com/www/code>
39
.bzr/smartの形式で終わるURLに対するすべてのリクエストを扱うために
42
Alias /code /srv/example.com/www/code
43
<Directory /srv/example.com/www/code>
44
Options Indexes FollowSymLinks
47
RewriteRule ^(.*/|)\.bzr/smart$ /srv/example.com/scripts/bzr-smart.fcgi
50
# bzr-smart.fcgiはDocumentRootの元に存在しないので、実行されるように
51
# AliasはこれをURLの名前空間のエイリアスにする。
52
Alias /srv/example.com/scripts/bzr-smart.fcgi /srv/example.com/scripts/bzr-smart.fcgi
53
<Directory /srv/example.com/scripts>
55
<Files bzr-smart.fcgi>
56
SetHandler fastcgi-script
60
この設定はFastCGIを通して `/code` 内部の `/.bzr/smart` で終わるURLに対する
61
Bazaarのスマートサーバーへのリクエストを扱うようにApacheに指示します。
63
詳細な情報は mod_rewrite_ と mod_fastcgi_ のドキュメントを参照してください。
65
.. _mod_rewrite: http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html
66
.. _mod_fastcgi: http://www.fastcgi.com/mod_fastcgi/docs/mod_fastcgi.html
71
最初に、次のようなコードをhttpd.confに追加してmod_pythonを設定します::
73
LoadModule python_module /usr/lib/apache2/modules/mod_python.so
75
FastCGIと同じ方法でmod_rewriteを用いて書き換えルールを定義します::
77
RewriteRule ^(.*/|)\.bzr/smart$ /srv/example.com/scripts/bzr-smart.fcgi
81
RewriteRule ^(.*/|)\.bzr/smart$ /srv/example.com/scripts/bzr-smart.py
83
mod_fastcgiのように、スクリプトがどのように扱われるのかも定義します::
85
Alias /srv/example.com/scripts/bzr-smart.py /srv/example.com/scripts/bzr-smart.py
86
<Directory /srv/example.com/scripts>
88
PythonPath "sys.path+['/srv/example.com/scripts']"
89
AddHandler python-program .py
90
PythonHandler bzr-smart::handler
94
この設定はmod_pythonを通して `/code` 内部の `/.bzr/smart` で終わるURLに対するリクエストを
95
Bazaarのスマートサーバーに渡すように指示します。
97
注: bzrlibがPATHの中に存在しない場合、次の行を変更する必要があります::
99
PythonPath "sys.path+['/srv/example.com/scripts']"
103
PythonPath "['/path/to/bzr']+sys.path+['/srv/example.com/scripts']"
106
詳細な情報は mod_python_ のドキュメントを参照してください。
108
.. _mod_python: http://www.modpython.org/
117
`/srv/example.com/scripts/bzr-smart.fcgi` でスマートサーバーを実行するためにApacheを設定しました。
118
これはスマートサーバーを設定するために書く必要のある単なるシンプルなスクリプトで
119
サーバーをFastCGIのゲートウェイに結びつけます。次のようになります::
122
from bzrlib.transport.http import wsgi
124
smart_server_app = wsgi.make_app(
125
root='/srv/example.com/www/code',
127
path_var='REQUEST_URI',
132
fcgi.WSGIServer(smart_server_app).run()
134
`fcgi`のモジュールはhttp://svn.saddi.com/py-lib/trunk/fcgi.pyで見つかります。
137
.. _flup: http://www.saddi.com/software/flup/
142
`/srv/example.com/scripts/bzr-smart.py` でスマートサーバーを実行するためにApacheを設定しました。
143
これはスマートサーバーを設定するために書く必要のあるシンプルなスクリプトでサーバーをmod_pythonの
144
ゲートウェイに結びつけます。次のようになります::
147
from bzrlib.transport.http import wsgi
149
smart_server_app = wsgi.make_app(
150
root='/srv/example.com/www/code',
152
path_var='REQUEST_URI',
157
def handler(request):
158
"""Handle a single request."""
159
wsgi_server = modpywsgi.WSGIServer(smart_server_app)
160
return wsgi_server.run(request)
163
`http://dev.pocoo.org/projects/pocoo/browser/pocoo/wrappers/modpy.py` で見つかります。
164
これは pocoo_ の一部です。modpywsgi.pyをbzr-smart.pyと同じディレクトリ
165
(すなわち/srv/example.com/scripts/)に設置していることを確認してください。
167
.. _pocoo: http://dev.pocoo.org/projects/pocoo/
172
これで `bzr+http://` 形式のURLを利用できます::
174
bzr log bzr+http://example.com/code/my-branch
176
プレーンなHTTP形式のアクセスも持続します::
178
bzr log http://example.com/code/my-branch
184
BazaarのHTTPスマートサーバーはWSGIアプリケーションなので、
185
WSGI標準に準拠するサードパーティのWSGIのミドルウェアもしくはサーバーで利用できます。
188
* `SmartWSGIApp` をコンストラクトするためには、それが提供する **root transport** を指定する必要があります。
189
* それぞれのリクエストの `environ` dict は **'bzrlib.relpath'** 変数の設定を持たなければなりません。
191
この例で使われている `make_app` ヘルパーは それに渡される `root` パスに基づいたトランスポートを伴う
192
`SmartWSGIApp` をコンストラクトし、引数 `prefix` と`path_var` に基づくそれぞれのリクエストに対する
193
`bzrlib.relpath` を算出します。
194
上記の例において、これは (Apacheによって設定される)'REQUEST_URI' を取り、接頭辞の '/code/' と接尾辞の '/.bzr/smart'
195
をはぎ取り、それを 'bzrlib.relpath' として設定するので、 '/code/foo/bar/.bzr/smart' に対するリクエストは
196
'foo/bzr' の 'bzrlib.relpath' になります。
198
`SmartWSGIApp` を直接コンストラクトすることで、ローカルではないトランスポートに対して
199
スマートサーバーを設定するもしくは任意任意のパスの変換を行うことは可能です。
200
詳細な情報に関しては `bzrlib.transport.http.wsgi` のdocstringsと `WSGI標準`_ を参照してください。
202
.. _WSGI標準: http://www.python.org/dev/peps/pep-0333/
205
``bzr+http://`` を通してpushする
206
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
208
httpスマートサーバーを通してデータをプッシュすることは可能です。
209
これを行うための最も簡単な方法は、 ``wsgi.make_app()`` コールに ``readonly=False`` を
210
提供するだけです。ただし、スマートプロトコルは認証機能が含まれないので注意してください。
212
実際にシステム上のデータを書き込みできる人を制限するために、 ``.bzr/smart`` URLへの権限を制限するとよいでしょう。
214
現時点では、同じURLに対して読み込み限定の人と読み込みと書き込みの人を分けることはできません。
215
(認証を行う)HTTPレイヤーにおいて、すべては単なるPOSTリクエストだからです。
216
しかしながら、HTTPSアクセスの場合に認証が必要な書き込みサーバーを使い、
217
プレーンなHTTPは読み込み限定のアクセスを許可することは確実にできます。