文書操作
fastcgiでmercurial on nginx
mercurialには、特定のディレクトリにある複数のリポジトリをウェブに公開するためのcgi・fcgiスクリプトが付属しています。このスクリプトを使って、nginxの後ろにあるmercurialリポジトリにwebアクセスできるように設定してみたいと思いました。
複数のリポジトリを丸ごと公開するfcgi用のスクリプトはmercurialのtarballのcontribディレクトリなどにある「hgwebdir.fcgi」というスクリプトです。このスクリプトをfcgiのプロセスとして実行することで、webから公開ディレクトリにアクセスすることができるようになります。このスクリプトの設定ファイルとして「hgweb.config」というファイルを使います。
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が見えるようになりました。
ほんとにこれでいいのかなぁ…。
- 固定リンク
- ¦
- コメント (0)
- ¦
- トラックバック (0)
- トラックバック用URL:
- http://nagosui.org:8080/Nagosui/COREBlog2/mercurial-fastcgi-on-nginx/tbping

