Rubyリファレンスマニュアル閲覧環境構築メモ

Rubyリファレンスマニュアル刷新計画 からリリースされたリファレンスマニュアル1.9.0 (動的HTML版) を閲覧するための環境を構築してみました。
基本的には http://doc.loveruby.net/wiki/ReleasePackageHowTo.html に書かれている手順の通りですが、Apacheと統合して "http://localhost/ruby-refm/" のようなURLでアクセスできるようにするために一工夫してみました。

# CGI/FastCGIを使った方法も試してみたいところですが、まだbitclustの動作を把握していないので、こちらの方がお手軽にできると判断しました。

動作環境

Apache リバースプロキシの設定

Apache HTTP Serverに対する特定のアクセスをbitclustサーバに転送するために、リバースプロキシの設定を行いました。

  • mod_proxy, mod_proxy_httpのロード: /etc/apache2/mods-enabled/ の中に、/etc/apache2/mods-availabe/{proxy.load, proxy_http.load} へのシンボリックリンクを張る。
  • プロキシの有効化: Apacheのマニュアルと /etc/apache2/mods-available/proxy.conf を参考に、以下のような設定ファイル reverse-proxy.conf を作成し、mods-enabled/ からリンクを張る。
<IfModule mod_proxy.c>
    ProxyRequests Off
    <Proxy *>
       AddDefaultCharset off
       Order deny,allow
       Allow from all
    </Proxy>
</IfModule>
  • bitclustサーバへの転送: /etc/apache2/sites-available/ruby-refm として、以下の内容のファイルを作成し、sites-enabled/ からリンクを張る。
<IfModule mod_proxy.c>
    ProxyPass /ruby-refm http://localhost:10080/ruby-refm
    ProxyPassReverse /ruby-refm http://localhost:10080/ruby-refm
</IfModule>

ポイントは、転送元のパス (/ruby-refm) と転送先のパス (/ruby-refm) を一致させること。bitclustの仕様上、このようにしないと、bitclustにより生成されるリンクをApache経由でたどることができないようです。

bitclustの設定

Apacheのリバースプロキシの設定に対応して、Rubyリファレンスマニュアルを "http://localhost:10080/ruby-refm/" のようなURLで提供する必要があります。これは、server.rb中の

ARGV.unshift "--baseurl="

という記述を、以下のように書き換えれば良いようです。

ARGV.unshift "--baseurl=http://localhost/ruby-refm"

このようにすると、以下の効果があります。

  • bitclustにより生成されるリンクのURLが、"http://localhost/ruby-refm/..." という形になる。
  • WEBrickサーバにマウントされるパスが、"/ruby-refm/..." という形になる。

Webブラウザから "http://localhost/ruby-refm/..." のリンクをたどると、Apache側の設定により、"http://localhost:10080/ruby-refm/..." にリクエストが転送され、期待通りにマニュアルを参照することができるようになります。

なお、もし --baseurl の設定をしないと、href="/theme/default/style.css" のようなリンクが生成されてしまうので、Apache側からリンク先を正常に参照できないという結果になります。

これだけの設定でも "http://localhost/ruby-refm/1.8.6/" のようなURLを指定することでマニュアルを参照できますが、"http://localhost/ruby-refm/" ではNot foundとなってしまうので、bitclust/server.rbの内容を以下のように書き換えることで、トップページが表示されるようになりました。

変更前:

server.mount_proc(File.join(basepath, '/')) do |req, res|
  raise WEBrick::HTTPStatus::NotFound if req.path != '/'

変更後:

server.mount_proc(File.join(basepath, '/')) do |req, res|
  raise WEBrick::HTTPStatus::NotFound if req.path != File.join(basepath, '/')