nginxでリバースプロキシ その2。

昨日のnginxの話の続き。というか、実質的にはWSGIの設定がメイン。gitwebの動いているノードに、trac-gitを入れて動かす場合、tracdで動かしても良いかもしれないが、mod_python, FastCGI, WSGIのいずれかを使って、tracをApacheで動かしたいのが普通だろう。どれを選択すればよいのか?WSGIのDebianパッケージであるlibapache2-mod-wsgiのcontrolを見るとこんなことが書いてある。

The adapter provides significantly

better performance than using existing WSGI adapters for mod_python or CGI.

意訳:mod_pythonやCGIなんて目じゃないぜ。

これはWSGIを使うしかないでしょ。ということで [1] 、まず、libapache2-mod-wsgiをインストールする。

$ sudo apt-get install libapache2-mod-wsgi

インストールすると、便利なことに自動的にa2enmod wsgiも実行して、/etc/apache2/mod-enable/wsgi.{load,conf}を作成してくれるおまけ付き。気が利くね。wsgi.confの中身を見ると、全てコメントアウトされているが気にするな。全てデフォルト値が設定されている。とりあえず動かしてみることが重要なので、今は無視して構わん。

/etc/apache2/site-available/defaultの方の設定に移る。とりあえず認証が必要無ければ以下で良い。そうそう、エイリアスの”/trac”は”/trac/”じゃダメなので注意しよう。Directoryディレクティブのパスも最後に”/”を入れちゃダメだ。入れるとちゃんとリバースプロキシされなくなる。

WSGIScriptAlias /trac /var/cache/trac/trac.wsgi
<Directory /var/cache/trac>
        Order allow,deny
        Allow from all
</Directory>

/var/cache/trac/trac.wsgiには以下のコードを書いておく。

import os

os.environ['TRAC_ENV'] = '/var/cache/trac'
os.environ['PYTHON_EGG_CACHE'] = '/tmp'

import trac.web.main
application = trac.web.main.dispatch_request

認証が必要なら、ダイジェスト認証を設定しておこう。 [2]

<Directory /var/cache/trac>
        Order allow,deny
        Allow from all
        AuthType Digest
        AuthName "trac"
        AuthDigestDomain /var/cache/trac
        AuthUserFile /var/local/trac/.htpasswd
        Require valid-user
</Directory>

htdigestコマンドでユーザ、パスワードを設定しておく。Apacheはデフォルトではauth_digestモジュールは無効になっているので有効にしておく必要がある。

$ sudo a2enmod auth_digest
$ sudo mkdir /var/local/trac
$ sudo htdigest -c /var/local/trac/.htpasswd trac user
Adding password for user in realm trac.
New password:
Re-type new password:

Apacheを再起動したら、trac-gitのノードでの作業は終わりだ。

さて、一応本題のnginxでのリバースプロキシの設定はというと、実は非常に簡単。昨日のgitweb向けの設定を以下のように変更すればよい。ここでも注意が必要なのは、”/trac”や”http://git/trac”は、”/trac/”や”http://git/trac/”ではダメなので注意しよう。

upstream git {
        server 192.168.xxx.xxx;
}
server {
        listen   80;
        server_name git.hoge.org;
        location / {
                proxy_pass http://git/;
        }
        location /trac {
                proxy_pass http://git/trac;
        }
}

nginxを再起動すれば、リバースプロキシ経由でtrac-gitにアクセスできるようになる。

[1]既にtrac-gitもtracもインストールして、tracのプロジェクトも作成済みという前提で話を進める。
[2]Basic認証とかいう人は今更いないよね。