~bzr-pqm/bzr/bzr.dev

4634.99.1 by Naoki INADA
import doc-ja rev90
1
FastCGIでBazaarを提供する
2
==========================
3
4
このドキュメントでは、Apache 2.0とFastCGIもしくはmod_pythonを利用して
5
Bazaar HTTPスマートサーバーをセットアップする1つの方法を説明します。
6
7
スマートサーバーに関する詳細な情報とそれを設定する他の方法に関しては、
8
メインのスマートサーバーのドキュメントを参照してください。
9
10
11
---
12
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
これらのディレクトリに提供したい場合を考えます。
18
19
Apache 2.0を設定する
20
--------------------
21
22
FastCGI
23
~~~~~~~
24
25
最初に、mod_fastcgiを設定します。たとえば次の行をhttpd.confに追加します::
26
27
    LoadModule fastcgi_module /usr/lib/apache2/modules/mod_fastcgi.so
28
    FastCgiIpcDir /var/lib/apache2/fastcgi
4853.1.1 by Patrick Regan
Removed trailing whitespace from files in doc directory
29
4634.99.1 by Naoki INADA
import doc-ja rev90
30
我々の例では、`http://example.com/code` で `/srv/example.com/www/code` をすでに提供しているので
31
既存のApacheの設定は次のようになります::
32
33
    Alias /code /srv/example.com/www/code
34
    <Directory /srv/example.com/www/code>
35
        Options Indexes
36
        # ...
37
    </Directory>
38
39
.bzr/smartの形式で終わるURLに対するすべてのリクエストを扱うために
40
次のように変更する必要があります::
41
42
    Alias /code /srv/example.com/www/code
43
    <Directory /srv/example.com/www/code>
44
        Options Indexes FollowSymLinks
45
        RewriteEngine On
46
        RewriteBase /code
47
        RewriteRule ^(.*/|)\.bzr/smart$ /srv/example.com/scripts/bzr-smart.fcgi
48
    </Directory>
4853.1.1 by Patrick Regan
Removed trailing whitespace from files in doc directory
49
4634.99.1 by Naoki INADA
import doc-ja rev90
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>
54
        Options ExecCGI
55
        <Files bzr-smart.fcgi>
56
            SetHandler fastcgi-script
57
        </Files>
58
    </Directory>
4853.1.1 by Patrick Regan
Removed trailing whitespace from files in doc directory
59
4634.99.1 by Naoki INADA
import doc-ja rev90
60
この設定はFastCGIを通して `/code` 内部の `/.bzr/smart` で終わるURLに対する
61
Bazaarのスマートサーバーへのリクエストを扱うようにApacheに指示します。
62
63
詳細な情報は mod_rewrite_ と mod_fastcgi_ のドキュメントを参照してください。
64
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
67
68
mod_python
69
~~~~~~~~~~
70
71
最初に、次のようなコードをhttpd.confに追加してmod_pythonを設定します::
72
73
    LoadModule python_module /usr/lib/apache2/modules/mod_python.so
74
75
FastCGIと同じ方法でmod_rewriteを用いて書き換えルールを定義します::
76
77
    RewriteRule ^(.*/|)\.bzr/smart$ /srv/example.com/scripts/bzr-smart.fcgi
78
79
変更は次のようになります::
80
81
    RewriteRule ^(.*/|)\.bzr/smart$ /srv/example.com/scripts/bzr-smart.py
82
83
mod_fastcgiのように、スクリプトがどのように扱われるのかも定義します::
84
85
    Alias /srv/example.com/scripts/bzr-smart.py /srv/example.com/scripts/bzr-smart.py
86
    <Directory /srv/example.com/scripts>
87
        <Files bzr-smart.py>
88
            PythonPath "sys.path+['/srv/example.com/scripts']"
89
            AddHandler python-program .py
90
            PythonHandler bzr-smart::handler
91
        </Files>
92
    </Directory>
93
94
この設定はmod_pythonを通して `/code` 内部の `/.bzr/smart` で終わるURLに対するリクエストを
95
Bazaarのスマートサーバーに渡すように指示します。
96
97
注: bzrlibがPATHの中に存在しない場合、次の行を変更する必要があります::
98
99
            PythonPath "sys.path+['/srv/example.com/scripts']"
100
101
変更後は次のようになります::
102
103
            PythonPath "['/path/to/bzr']+sys.path+['/srv/example.com/scripts']"
104
105
106
詳細な情報は mod_python_ のドキュメントを参照してください。
107
108
.. _mod_python: http://www.modpython.org/
109
110
111
Bazaarを設定する
112
-----------------
113
114
FastCGI
115
~~~~~~~
116
117
`/srv/example.com/scripts/bzr-smart.fcgi` でスマートサーバーを実行するためにApacheを設定しました。
118
これはスマートサーバーを設定するために書く必要のある単なるシンプルなスクリプトで
119
サーバーをFastCGIのゲートウェイに結びつけます。次のようになります::
120
121
    import fcgi
122
    from bzrlib.transport.http import wsgi
123
124
    smart_server_app = wsgi.make_app(
125
        root='/srv/example.com/www/code',
126
        prefix='/code/',
127
        path_var='REQUEST_URI',
128
        readonly=True,
4853.1.1 by Patrick Regan
Removed trailing whitespace from files in doc directory
129
        load_plugins=True,
4634.99.1 by Naoki INADA
import doc-ja rev90
130
        enable_logging=True)
131
132
    fcgi.WSGIServer(smart_server_app).run()
4853.1.1 by Patrick Regan
Removed trailing whitespace from files in doc directory
133
4634.99.1 by Naoki INADA
import doc-ja rev90
134
 `fcgi`のモジュールはhttp://svn.saddi.com/py-lib/trunk/fcgi.pyで見つかります。
135
これは flup_ の一部です。
136
137
.. _flup: http://www.saddi.com/software/flup/
138
139
mod_python
140
~~~~~~~~~~
141
142
`/srv/example.com/scripts/bzr-smart.py` でスマートサーバーを実行するためにApacheを設定しました。
143
これはスマートサーバーを設定するために書く必要のあるシンプルなスクリプトでサーバーをmod_pythonの
144
ゲートウェイに結びつけます。次のようになります::
145
146
    import modpywsgi
147
    from bzrlib.transport.http import wsgi
148
149
    smart_server_app = wsgi.make_app(
150
        root='/srv/example.com/www/code',
151
        prefix='/code/',
152
        path_var='REQUEST_URI',
153
        readonly=True,
4853.1.1 by Patrick Regan
Removed trailing whitespace from files in doc directory
154
        load_plugins=True,
4634.99.1 by Naoki INADA
import doc-ja rev90
155
        enable_logging=True)
156
157
    def handler(request):
158
        """Handle a single request."""
159
        wsgi_server = modpywsgi.WSGIServer(smart_server_app)
160
        return wsgi_server.run(request)
4853.1.1 by Patrick Regan
Removed trailing whitespace from files in doc directory
161
4634.99.1 by Naoki INADA
import doc-ja rev90
162
`modpywsgi` モジュールは
163
`http://dev.pocoo.org/projects/pocoo/browser/pocoo/wrappers/modpy.py` で見つかります。
164
これは pocoo_ の一部です。modpywsgi.pyをbzr-smart.pyと同じディレクトリ
165
(すなわち/srv/example.com/scripts/)に設置していることを確認してください。
166
167
.. _pocoo: http://dev.pocoo.org/projects/pocoo/
168
169
クライアント
170
------------
171
172
これで `bzr+http://` 形式のURLを利用できます::
173
174
    bzr log bzr+http://example.com/code/my-branch
175
176
プレーンなHTTP形式のアクセスも持続します::
177
178
    bzr log http://example.com/code/my-branch
179
180
181
高度な設定
182
-----------
183
184
BazaarのHTTPスマートサーバーはWSGIアプリケーションなので、
185
WSGI標準に準拠するサードパーティのWSGIのミドルウェアもしくはサーバーで利用できます。
186
唯一の要件は以下のとおりです:
187
188
  *  `SmartWSGIApp` をコンストラクトするためには、それが提供する **root transport** を指定する必要があります。
189
  * それぞれのリクエストの `environ` dict は **'bzrlib.relpath'** 変数の設定を持たなければなりません。
190
191
この例で使われている `make_app` ヘルパーは それに渡される `root` パスに基づいたトランスポートを伴う
192
`SmartWSGIApp` をコンストラクトし、引数 `prefix` と`path_var` に基づくそれぞれのリクエストに対する
193
 `bzrlib.relpath` を算出します。
4853.1.1 by Patrick Regan
Removed trailing whitespace from files in doc directory
194
上記の例において、これは (Apacheによって設定される)'REQUEST_URI' を取り、接頭辞の '/code/' と接尾辞の '/.bzr/smart'
4634.99.1 by Naoki INADA
import doc-ja rev90
195
をはぎ取り、それを 'bzrlib.relpath' として設定するので、 '/code/foo/bar/.bzr/smart' に対するリクエストは
196
'foo/bzr' の 'bzrlib.relpath' になります。
197
198
`SmartWSGIApp` を直接コンストラクトすることで、ローカルではないトランスポートに対して
199
スマートサーバーを設定するもしくは任意任意のパスの変換を行うことは可能です。
200
詳細な情報に関しては `bzrlib.transport.http.wsgi` のdocstringsと `WSGI標準`_ を参照してください。
201
202
.. _WSGI標準: http://www.python.org/dev/peps/pep-0333/
203
204
205
``bzr+http://`` を通してpushする
206
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
207
208
httpスマートサーバーを通してデータをプッシュすることは可能です。
209
これを行うための最も簡単な方法は、 ``wsgi.make_app()`` コールに ``readonly=False`` を
210
提供するだけです。ただし、スマートプロトコルは認証機能が含まれないので注意してください。
211
書き込みのサポートを有効にする場合、
212
実際にシステム上のデータを書き込みできる人を制限するために、 ``.bzr/smart`` URLへの権限を制限するとよいでしょう。
213
214
現時点では、同じURLに対して読み込み限定の人と読み込みと書き込みの人を分けることはできません。
215
(認証を行う)HTTPレイヤーにおいて、すべては単なるPOSTリクエストだからです。
216
しかしながら、HTTPSアクセスの場合に認証が必要な書き込みサーバーを使い、
217
プレーンなHTTPは読み込み限定のアクセスを許可することは確実にできます。
218
219
4853.1.1 by Patrick Regan
Removed trailing whitespace from files in doc directory
220
..
4634.99.1 by Naoki INADA
import doc-ja rev90
221
   vim: ft=rst tw=74 et