fastcgiでmercurial on nginx

mercurialには、特定のディレクトリにある複数のリポジトリをウェブに公開するためのcgi・fcgiスクリプトが付属しています。このスクリプトを使って、nginxの後ろにあるmercurialリポジトリにwebアクセスできるように設定してみたいと思いました。

複数のリポジトリを丸ごと公開するfcgi用のスクリプトはmercurialのtarballのcontribディレクトリなどにある「hgwebdir.fcgi」というスクリプトです。このスクリプトをfcgiのプロセスとして実行することで、webから公開ディレクトリにアクセスすることができるようになります。このスクリプトの設定ファイルとして「hgweb.config」というファイルを使います。

081008-1

hgwebdir.fcgiを使う

hgwebdir.fcgiを使うために、hgwebdir.fcgiとhgweb.configを設定し、spawn-fcgiをインストールします。

hgwebdir.fcgiの設定

システムワイドなPythonを使わない場合はコメントアウトしてmercurialを利用できるようにパスを設定します。

#import sys
#sys.path.insert(0, "/path/to/python/lib")

設定ファイルは下記の部分で指定していますので「hgweb.config」でない名前で設定したい場合は変更します。

def make_web_app():
    return hgwebdir("hgweb.config")

hgweb.configの設定

hgweb.configには公開するディレクトリのパスなどを設定します。

  • [paths]には別名を設定します。「virtual/path = /real/path」などといったようにします。
  • [collections]には公開リポジトリディレクトリを指定します。たとえば自分のホームディレクトリ直下に「repos」というディレクトリを作り、そこにリポジトリを複数配置する場合は「/home/hoge/repos = /home/hoge/repos」といったようにします。
  • [web]には公開オプションを設定します。
[paths]

[collections]
/home/hoge/repos = /home/hoge/repos

[web]
style = gitweb
allow_archive = gz, zip, bz2

hgrc(5)も参考になります。

この状態でfcgiプロセスとしてhgwebdir.fcgiを実行したいのですが、ここで「spawn-fcgi」というソフトウェアを利用したいと思います。

spawn-fcgiのインストール

spawn-fcgiはlighttpdに同梱されているfcgi起動用の非常に優れたプログラムです。これを使えるようにするためにlighttpdをインストールします。

# wget http://www.lighttpd.net/download/lighttpd-1.4.20.tar.gz
# tar zxvf lighttpd-1.4.20.tar.gz
# ./autogen.sh
# ./configure
# make
# make install

fcgiはUNIXドメインソケットを利用して起動してもよいですし、プロセスとして起動することもできますが、ここではプロセスとして起動することにします。起動オプションについては下記の通りです。

$ /usr/local/bin/spawn-fcgi -h
Usage: spawn-fcgi [options] -- <fcgiapp> [fcgi app arguments]

spawn-fcgi v1.4.19 - spawns fastcgi processes

Options:
 -f <fcgiapp> filename of the fcgi-application
 -a <addr>    bind to ip address
 -p <port>    bind to tcp-port
 -s <path>    bind to unix-domain socket
 -C <childs>  (PHP only) numbers of childs to spawn (default 5)
 -P <path>    name of PID-file for spawed process
 -n           no fork (for daemontools)
 -v           show version
 -h           show this help
(root only)
 -c <dir>     chroot to directory
 -u <user>    change to user-id
 -g <group>   change to group-id

ということで下記のような感じで起動してやります。

/usr/local/bin/spawn-fcgi -a 127.0.0.1 -p 3033 -f /home/hoge/repos/hgwebdir.fcgi

これでmercurialのfcgiプロセスが3033ポートで起動するようになりました。

nginxの設定

mercurialの公開リポジトリディレクトリをfcgiで公開しましたので、nginxを通して見ることができるように設定します。

うちではほとんどのリクエストをZope/Ploneに投げるようにしていますが、ブラウザから「http://example.com/hg/」にアクセスしたときに公開リポジトリディレクトリが見えるようにしたいと思います。

SCRIPT_NAMEとPATH_INFOが肝になるかと思われますが、私の環境では下記のような設定で公開できるようになりました。

location /hg/ {
    include /usr/local/nginx/conf/fastcgi_params;
    fastcgi_param SCRIPT_NAME "/hg";
    set $path_info "";
    if ($fastcgi_script_name ~ "^/hg(.*)$") {
        set $path_info $1;
    }
    fastcgi_param PATH_INFO $path_info;
    fastcgi_pass 127.0.0.1:3033;
}

これで外からnginx越しにmercurialが見えるようになりました。

ほんとにこれでいいのかなぁ…。

カテゴリ
Linux Linux
Python Python
トラックバック用URL:
http://nagosui.org:8080/Nagosui/COREBlog2/mercurial-fastcgi-on-nginx/tbping
コメントを追加

下のフォームに記入してコメントを追加できます。平文テキスト形式。

(必須)
(必須)
(必須)
(Required)
Enter the word

このBlogについて
Plone, Zope, Pythonなどのトピックについてのメモです。
カテゴリ
Plone (98)
Plone Products (23)
COREBlog2 (31)
COREBlog1 (29)
ReadingCOREBlog (7)
Zope (66)
Turbogears (18)
Django (12)
Python (25)
Linux (30)
Nagosui (12)
Design (33)
Misc (48)
moblog (5)
最近のエントリ
浜松ブラスバンド定期演奏会2008 nyusuke 2008年11月24日
Glossy Horizontal Menuを使う nyusuke 2008年11月17日
第3回Python東海終了 nyusuke 2008年11月17日
Universalじゃない件 nyusuke 2008年11月15日
最近のコメント
Re:WebデザイナーのためのDjangoはじめの一歩 nyusuke 2007年06月01日
Re:WebデザイナーのためのDjangoはじめの一歩 pateo 2007年05月31日
Re:東海Python Workshop 01終了 nyusuke 2007年05月31日
Re:東海Python Workshop 01終了 kfuruhata 2007年05月30日