~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to doc/ja/user-guide/http_smart_server.txt

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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
 
29
    
 
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>
 
49
    
 
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>
 
59
    
 
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,
 
129
        load_plugins=True, 
 
130
        enable_logging=True)
 
131
 
 
132
    fcgi.WSGIServer(smart_server_app).run()
 
133
        
 
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,
 
154
        load_plugins=True, 
 
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)
 
161
        
 
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` を算出します。
 
194
上記の例において、これは (Apacheによって設定される)'REQUEST_URI' を取り、接頭辞の '/code/' と接尾辞の '/.bzr/smart' 
 
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
 
 
220
.. 
 
221
   vim: ft=rst tw=74 et