~bzr-pqm/bzr/bzr.dev

5875.1.1 by INADA Naoki
Update Japanese docs.
1
Apache を使って Bazaar サーバーをたてる
2
=========================================
4634.99.1 by Naoki INADA
import doc-ja rev90
3
5875.1.1 by INADA Naoki
Update Japanese docs.
4
このドキュメントでは、 Apache 2.0 と FastCGI, mod_python, mod_wsgi の
5
どれかを利用して Bazaar の HTTP スマートサーバーをセットアップする方法を
6
説明します。
4634.99.1 by Naoki INADA
import doc-ja rev90
7
8
スマートサーバーに関する詳細な情報とそれを設定する他の方法に関しては、
5875.1.1 by INADA Naoki
Update Japanese docs.
9
`スマートサーバーのドキュメント <server.html>`_ を参照してください。
4634.99.1 by Naoki INADA
import doc-ja rev90
10
11
12
---
13
14
プレーンなHTTPで `/srv/example.com/www/code` を `http://example.com/code/...` として
15
すでに公開しているとします。これはbzrのブランチと `/srv/example.com/www/code/branch-one`
16
と `/srv/example.com/www/code/my-repo/branch-two` のようなディレクトリを含みます。
17
既存のHTTP形式のアクセス権限に加えてリードオンリーのスマートサーバーのアクセス権限を
18
これらのディレクトリに提供したい場合を考えます。
19
20
Apache 2.0を設定する
21
--------------------
22
23
FastCGI
24
~~~~~~~
25
26
最初に、mod_fastcgiを設定します。たとえば次の行をhttpd.confに追加します::
27
28
    LoadModule fastcgi_module /usr/lib/apache2/modules/mod_fastcgi.so
29
    FastCgiIpcDir /var/lib/apache2/fastcgi
5875.1.1 by INADA Naoki
Update Japanese docs.
30
    
4634.99.1 by Naoki INADA
import doc-ja rev90
31
我々の例では、`http://example.com/code` で `/srv/example.com/www/code` をすでに提供しているので
32
既存のApacheの設定は次のようになります::
33
34
    Alias /code /srv/example.com/www/code
35
    <Directory /srv/example.com/www/code>
36
        Options Indexes
37
        # ...
38
    </Directory>
39
40
.bzr/smartの形式で終わるURLに対するすべてのリクエストを扱うために
41
次のように変更する必要があります::
42
43
    Alias /code /srv/example.com/www/code
44
    <Directory /srv/example.com/www/code>
45
        Options Indexes FollowSymLinks
46
        RewriteEngine On
47
        RewriteBase /code
5459.6.1 by Neil Martinsen-Burrell
fix documentation for apache with smart server
48
        RewriteRule ^(.*/)?\.bzr/smart$ /srv/example.com/scripts/bzr-smart.fcgi
4634.99.1 by Naoki INADA
import doc-ja rev90
49
    </Directory>
5875.1.1 by INADA Naoki
Update Japanese docs.
50
    
4634.99.1 by Naoki INADA
import doc-ja rev90
51
    # bzr-smart.fcgiはDocumentRootの元に存在しないので、実行されるように
52
    # AliasはこれをURLの名前空間のエイリアスにする。
53
    Alias /srv/example.com/scripts/bzr-smart.fcgi /srv/example.com/scripts/bzr-smart.fcgi
54
    <Directory /srv/example.com/scripts>
55
        Options ExecCGI
56
        <Files bzr-smart.fcgi>
57
            SetHandler fastcgi-script
58
        </Files>
59
    </Directory>
5875.1.1 by INADA Naoki
Update Japanese docs.
60
    
4634.99.1 by Naoki INADA
import doc-ja rev90
61
この設定はFastCGIを通して `/code` 内部の `/.bzr/smart` で終わるURLに対する
62
Bazaarのスマートサーバーへのリクエストを扱うようにApacheに指示します。
63
64
詳細な情報は mod_rewrite_ と mod_fastcgi_ のドキュメントを参照してください。
65
66
.. _mod_rewrite: http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html
67
.. _mod_fastcgi: http://www.fastcgi.com/mod_fastcgi/docs/mod_fastcgi.html
68
69
mod_python
70
~~~~~~~~~~
71
5875.1.1 by INADA Naoki
Update Japanese docs.
72
最初に、次のようなコードを httpd.conf に追加して mod_python を設定します::
4634.99.1 by Naoki INADA
import doc-ja rev90
73
74
    LoadModule python_module /usr/lib/apache2/modules/mod_python.so
75
5875.1.1 by INADA Naoki
Update Japanese docs.
76
FastCGI と同じ方法で mod_rewrite を用いて書き換えルールを定義します::
4634.99.1 by Naoki INADA
import doc-ja rev90
77
5459.6.1 by Neil Martinsen-Burrell
fix documentation for apache with smart server
78
    RewriteRule ^(.*/)?\.bzr/smart$ /srv/example.com/scripts/bzr-smart.fcgi
4634.99.1 by Naoki INADA
import doc-ja rev90
79
80
変更は次のようになります::
81
5459.6.1 by Neil Martinsen-Burrell
fix documentation for apache with smart server
82
    RewriteRule ^(.*/)?\.bzr/smart$ /srv/example.com/scripts/bzr-smart.py
4634.99.1 by Naoki INADA
import doc-ja rev90
83
5875.1.1 by INADA Naoki
Update Japanese docs.
84
mod_fastcgi のように、スクリプトがどのように扱われるのかも定義します::
4634.99.1 by Naoki INADA
import doc-ja rev90
85
86
    Alias /srv/example.com/scripts/bzr-smart.py /srv/example.com/scripts/bzr-smart.py
87
    <Directory /srv/example.com/scripts>
88
        <Files bzr-smart.py>
89
            PythonPath "sys.path+['/srv/example.com/scripts']"
90
            AddHandler python-program .py
91
            PythonHandler bzr-smart::handler
92
        </Files>
93
    </Directory>
94
5875.1.1 by INADA Naoki
Update Japanese docs.
95
この設定は mod_python を通して `/code` 内部の `/.bzr/smart` で終わるURLに対するリクエストを
96
Bazaar のスマートサーバーに渡すように指示します。
4634.99.1 by Naoki INADA
import doc-ja rev90
97
5875.1.1 by INADA Naoki
Update Japanese docs.
98
注: bzrlib が PATH の中に存在しない場合、次の行を変更する必要があります::
4634.99.1 by Naoki INADA
import doc-ja rev90
99
100
            PythonPath "sys.path+['/srv/example.com/scripts']"
101
102
変更後は次のようになります::
103
104
            PythonPath "['/path/to/bzr']+sys.path+['/srv/example.com/scripts']"
105
106
107
詳細な情報は mod_python_ のドキュメントを参照してください。
108
109
.. _mod_python: http://www.modpython.org/
110
111
5875.1.1 by INADA Naoki
Update Japanese docs.
112
mod_wsgi
113
~~~~~~~~
114
115
最初に、 a2enmod wsgi などで mod_wsgi を有効にしておきます。
116
次に、 `.bzr/smart` で終わる全ての URL に対するリクエストを mod_wsgi 経由
117
で処理するように設定します。設定例は次のようになります。 ::
118
119
    WSGIScriptAliasMatch ^/code/.*/\.bzr/smart$ /srv/example.com/scripts/bzr.wsgi
120
121
    #The three next lines allow regular GETs to work too
122
    RewriteEngine On
123
    RewriteCond %{REQUEST_URI} !^/code/.*/\.bzr/smart$
124
    RewriteRule ^/code/(.*/\.bzr/.*)$ /srv/example.com/www/code/$1 [L]
125
126
    <Directory /srv/example.com/www/code>
127
        WSGIApplicationGroup %{GLOBAL}
128
    </Directory>
129
130
この設定では、 Apache は `/code` 以下の `/.bzr/smart` で終わる URL に
131
対する全てのリクエストを WSGI 経由で Bazaar のスマートサーバーに渡し、
132
それ以外の全てのリクエストは Apache が直接扱うようにしています。
133
134
詳細は mod_wsgi_ のドキュメントを参照してください。
135
136
.. _mod_wsgi: http://code.google.com/p/modwsgi/
137
4634.99.1 by Naoki INADA
import doc-ja rev90
138
Bazaarを設定する
139
-----------------
140
141
FastCGI
142
~~~~~~~
143
144
`/srv/example.com/scripts/bzr-smart.fcgi` でスマートサーバーを実行するためにApacheを設定しました。
145
これはスマートサーバーを設定するために書く必要のある単なるシンプルなスクリプトで
146
サーバーをFastCGIのゲートウェイに結びつけます。次のようになります::
147
148
    import fcgi
149
    from bzrlib.transport.http import wsgi
150
151
    smart_server_app = wsgi.make_app(
152
        root='/srv/example.com/www/code',
153
        prefix='/code/',
154
        path_var='REQUEST_URI',
155
        readonly=True,
4853.1.1 by Patrick Regan
Removed trailing whitespace from files in doc directory
156
        load_plugins=True,
4634.99.1 by Naoki INADA
import doc-ja rev90
157
        enable_logging=True)
158
159
    fcgi.WSGIServer(smart_server_app).run()
5875.1.1 by INADA Naoki
Update Japanese docs.
160
        
4634.99.1 by Naoki INADA
import doc-ja rev90
161
 `fcgi`のモジュールはhttp://svn.saddi.com/py-lib/trunk/fcgi.pyで見つかります。
162
これは flup_ の一部です。
163
164
.. _flup: http://www.saddi.com/software/flup/
165
166
mod_python
167
~~~~~~~~~~
168
169
`/srv/example.com/scripts/bzr-smart.py` でスマートサーバーを実行するためにApacheを設定しました。
170
これはスマートサーバーを設定するために書く必要のあるシンプルなスクリプトでサーバーをmod_pythonの
171
ゲートウェイに結びつけます。次のようになります::
172
173
    import modpywsgi
174
    from bzrlib.transport.http import wsgi
175
176
    smart_server_app = wsgi.make_app(
177
        root='/srv/example.com/www/code',
178
        prefix='/code/',
179
        path_var='REQUEST_URI',
180
        readonly=True,
4853.1.1 by Patrick Regan
Removed trailing whitespace from files in doc directory
181
        load_plugins=True,
4634.99.1 by Naoki INADA
import doc-ja rev90
182
        enable_logging=True)
183
184
    def handler(request):
185
        """Handle a single request."""
186
        wsgi_server = modpywsgi.WSGIServer(smart_server_app)
187
        return wsgi_server.run(request)
5875.1.1 by INADA Naoki
Update Japanese docs.
188
        
4634.99.1 by Naoki INADA
import doc-ja rev90
189
`modpywsgi` モジュールは
5875.1.1 by INADA Naoki
Update Japanese docs.
190
http://ice.usq.edu.au/svn/ice/trunk/apps/ice-server/modpywsgi.py で見つかります。
191
これは pocoo_ の一部でした。 modpywsgi.py を bzr-smart.py と同じディレクトリ
4634.99.1 by Naoki INADA
import doc-ja rev90
192
(すなわち/srv/example.com/scripts/)に設置していることを確認してください。
193
194
.. _pocoo: http://dev.pocoo.org/projects/pocoo/
195
5875.1.1 by INADA Naoki
Update Japanese docs.
196
197
mod_wsgi
198
~~~~~~~~
199
200
We've configured Apache to run the smart server at
201
`/srv/example.com/scripts/bzr.wsgi`.  This is just a simple script we need
202
to write to configure a smart server, and glue it to the WSGI gateway.
203
Here's what it looks like::
204
205
    from bzrlib.transport.http import wsgi
206
207
    def application(environ, start_response):
208
        app = wsgi.make_app(
209
            root="/srv/example.com/www/code/",
210
            prefix="/code",
211
            readonly=True,
212
            enable_logging=False)
213
        return app(environ, start_response)
214
4634.99.1 by Naoki INADA
import doc-ja rev90
215
クライアント
216
------------
217
5875.1.1 by INADA Naoki
Update Japanese docs.
218
これで `bzr+http://` 形式のURLやただの `http://` のURLを利用できます::
4634.99.1 by Naoki INADA
import doc-ja rev90
219
220
    bzr log bzr+http://example.com/code/my-branch
221
222
プレーンなHTTP形式のアクセスも持続します::
223
224
    bzr log http://example.com/code/my-branch
225
226
227
高度な設定
228
-----------
229
230
BazaarのHTTPスマートサーバーはWSGIアプリケーションなので、
231
WSGI標準に準拠するサードパーティのWSGIのミドルウェアもしくはサーバーで利用できます。
232
唯一の要件は以下のとおりです:
233
5875.1.1 by INADA Naoki
Update Japanese docs.
234
  * `SmartWSGIApp` をコンストラクトするためには、それが提供する **root transport** を指定する必要があります。
4634.99.1 by Naoki INADA
import doc-ja rev90
235
  * それぞれのリクエストの `environ` dict は **'bzrlib.relpath'** 変数の設定を持たなければなりません。
236
237
この例で使われている `make_app` ヘルパーは それに渡される `root` パスに基づいたトランスポートを伴う
238
`SmartWSGIApp` をコンストラクトし、引数 `prefix` と`path_var` に基づくそれぞれのリクエストに対する
239
 `bzrlib.relpath` を算出します。
5875.1.1 by INADA Naoki
Update Japanese docs.
240
上記の例において、これは (Apacheによって設定される)'REQUEST_URI' を取り、接頭辞の '/code/' と接尾辞の '/.bzr/smart' 
4634.99.1 by Naoki INADA
import doc-ja rev90
241
をはぎ取り、それを 'bzrlib.relpath' として設定するので、 '/code/foo/bar/.bzr/smart' に対するリクエストは
242
'foo/bzr' の 'bzrlib.relpath' になります。
243
244
`SmartWSGIApp` を直接コンストラクトすることで、ローカルではないトランスポートに対して
245
スマートサーバーを設定するもしくは任意任意のパスの変換を行うことは可能です。
246
詳細な情報に関しては `bzrlib.transport.http.wsgi` のdocstringsと `WSGI標準`_ を参照してください。
247
248
.. _WSGI標準: http://www.python.org/dev/peps/pep-0333/
249
250
5875.1.1 by INADA Naoki
Update Japanese docs.
251
HTTP スマートサーバー経由で push する
252
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
4634.99.1 by Naoki INADA
import doc-ja rev90
253
5875.1.1 by INADA Naoki
Update Japanese docs.
254
HTTP スマートサーバーを通してデータをプッシュすることは可能です。
4634.99.1 by Naoki INADA
import doc-ja rev90
255
これを行うための最も簡単な方法は、 ``wsgi.make_app()`` コールに ``readonly=False`` を
256
提供するだけです。ただし、スマートプロトコルは認証機能が含まれないので注意してください。
257
書き込みのサポートを有効にする場合、
5875.1.1 by INADA Naoki
Update Japanese docs.
258
実際にシステム上のデータを書き込みできる人を制限するために、 ``.bzr/smart``
259
URLへの権限を制限するとよいでしょう。例えば Apache で次のような設定を
260
します。 ::
261
262
    <Location /code>
263
        AuthType Basic
264
        AuthName "example"
265
        AuthUserFile /srv/example.com/conf/auth.passwd
266
        <LimitExcept GET>
267
            Require valid-user
268
        </LimitExcept>
269
    </Location>
270
271
272
現時点では、同じURLに対して読み込み限定の人と読み込みと書き込みの人を
273
分けることはできません。
4634.99.1 by Naoki INADA
import doc-ja rev90
274
(認証を行う)HTTPレイヤーにおいて、すべては単なるPOSTリクエストだからです。
275
しかしながら、HTTPSアクセスの場合に認証が必要な書き込みサーバーを使い、
5875.1.1 by INADA Naoki
Update Japanese docs.
276
プレーンなHTTPは読み込み限定のアクセスを許可することはできます。
277
278
HTTPS サイトに対してアクセスしたときに bzr が次のようなエラーを表示する
279
場合::
280
281
  bzr: ERROR: Connection error: curl connection error (server certificate verification failed.
282
  CAfile:/etc/ssl/certs/ca-certificates.crt CRLfile: none)
283
284
You can workaround it by using ``https+urllib`` rather than ``http`` in your
285
URL, or by uninstalling pycurl.  See `bug 82086`_ for more details.
286
287
URL に ``https`` の代わりに ``https+urllib`` を使うことで問題を回避
288
できます。
289
詳細については `bug 82086`_ を参照してください。
290
291
.. _bug 82086: https://bugs.launchpad.net/bzr/+bug/82086
292
293
294
.. 
4634.99.1 by Naoki INADA
import doc-ja rev90
295
   vim: ft=rst tw=74 et