hgweb on nginx - Mercurial Advent Calendar 2012

2012 年 12 月 12 日 はてなブックマークへ追加 はてなブックマーク - hgweb on nginx - Mercurial Advent Calendar 2012 Bookmark this on Delicious

正直なところ、サーバー立てるの面倒ですよね。 Bitbucket を使えれば楽なのですが、しがない会社勤めだとそうも行きません。 Mercurial Advent Calendar 2012 の 12 日目は、 nginxuWSGI の組み合わせでリポジトリサーバーをセットアップする話をします。

なぜ nginx?

Apache と mod_wsgi はもう見飽きたよ。

hgweb_wsgi.py

まず、最低限の WSGI アプリケーションを、例えば /srv/hgweb/hgweb_wsgi.py という名前で作ります。

from mercurial import hgweb
application = hgweb.hgwebdir('hgweb.config')

hgweb_wsgi モジュールの application 関数(正確に言うと callable なオブジェクト) がエントリーポイントです。

hgweb.config には、最低限こう書いておけばいいでしょう。 (詳しくは hg help hgwebhg help hgrc を見てください。)

[paths]
/ = /srv/hg/*

[web]
push_ssl = False

SSL 証明書を用意できるなら push_ssl = False は不要です。

nginx の設定

Debian の場合は、 /etc/nginx/sites-available にホスト毎の設定を置きます。 それから、 /etc/nginx/sites-enabled にシンボリックリンクを張ります。

server {
    ...
    # .css, .js, .png などは nginx に sendfile してもらう
    location /static {
        alias /usr/share/mercurial/templates/static;
        expires 30d;
    }

    location / {
        include uwsgi_params;
        uwsgi_param SCRIPT_NAME '';  # 忘れると KeyError になるよ
        #uwsgi_modifier1 30;
        uwsgi_pass unix:/run/uwsgi/app/hgweb/socket;
    }
}

サブディレクトリに hgweb をマウントする場合は、 uwsgi_param SCRIPT_NAME /mount-pointuwsgi_modifier1 30 が必要です。

uWSGI の設定

nginx で WSGI アプリケーションをホストするには、 uWSGI が良さそう です。

同じように、 /etc/uwsgi/apps-available にアプリケーション毎の設定を置いて、 シンボリックリンクを張ります。 uWSGI は様々な設定ファイル形式をサポートしていますが、 一番簡単な .ini で書きました。

[uwsgi]
plugins = python
module = hgweb_wsgi
uid = hg
gid = hg
chown-socket = www-data:www-data
chdir = /srv/hgweb
#workers = 5
#threads = 1

この例では、 hgweb を hg ユーザーで実行し、 www-data ユーザーの nginx が UNIX ドメインソケットで通信できるように設定しています。 (Linux のソケットファイルで通信するには rw 権限が必要です。)

ソケットファイル名など、基本的な設定は /usr/share/uwsgi/conf/default.ini にまとめられています。

なお、リポジトリ毎に web.encoding を切り替えたければ、 シングルスレッドにしないと上手く行きません。 グローバルな encoding 変数を書き換えているためです。

まとめ

サーバーの設定はこれで終わりです。 ここからが本題だったのですが、力尽きました。

明日は @r_rudi さんの「リビジョン番号表示について」です。よろしくお願いします。

コメント

blog comments powered by Disqus