nginx + webrick でるりまを公開する方法
投稿者 okkez
nginx と webrick を使用してるりまを公開しているので手順と使っているスクリプトを公開しときます。
nginx の設定は以下。
Debian 風に設定ファイルが分かれているのでそれ以外の人は適当に想像して読み替えてください。
server {
listen 80;
server_name doc.okkez.net;
access_log /var/log/nginx/doc.okkez.net-access.log combined;
root /var/www/doc.okkez.net;
index index.html;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
#proxy_redirect off;
location / {
root /var/www/doc.okkez.net;
index index.html;
}
location /archives {
autoindex on;
}
location /180 {
include maintenance;
proxy_pass http://localhost:8180;
break;
}
# ... 180 から 191 までの設定がありますが略
}以下の点に注意します。
- location /archives は月次リリースのファイル置き場です
- location /180 は Ruby1.8.0 用のパスです
- location は バージョン番号からドットを取り除いたもの
- proxy_pass の最後に指定しているポート番号は 8000 + 上で作成した数値
webrick 起動スクリプト
書いてあるとおりなんですが、ポイントは以下。
- DB の作成場所などを工夫してパラメタライズしやすくした
- –baseurl オプションを指定すると CGI で作成されるパスがそのパスを起点にしたパスになる
- バインドされる IP アドレスは localhost なので安全
- port は nginx の設定で使用したものを使う
#!/bin/sh
DB_BASE=$HOME/ruby/rubydoc/refm/api
BITCLUST_DIR=$HOME/ruby/bitclust
for v in 180 181 182 183 184 185 186 187 188 191
do
ruby ${BITCLUST_DIR}/standalone.rb \
--baseurl=http://doc.okkez.net/${v} \
--port=8${v} \
--pid-file=${DB_BASE}/pids/standalone-${v}.pid \
--database=${DB_BASE}/db${v}
doneこんな感じです。
DB を全て再作成するスクリプト
#!/usr/bin/ruby
BITCLUST = '/home/xxxx/bin/bitclust'
VERSIONS = %w[
1.8.0 1.8.1 1.8.2 1.8.3 1.8.4 1.8.5 1.8.6 1.8.7 1.8.8
1.9.1
]
REF_BASE='/home/xxxx/ruby/rubydoc/refm/api'
def setup_db(version)
db = "#{REF_BASE}/db#{version.gsub(/\./, '')}"
`rm -rf #{db}`
`#{BITCLUST} -d #{db} init version=#{version} encoding=euc-jp`
`#{BITCLUST} -d #{db} update --stdlibtree=#{REF_BASE}/src`
puts "#{version} is done"
end
system "svn up -q #{REF_BASE}"
VERSIONS.reverse_each do |version|
setup_db(version)
endなんとなく Ruby で書いてみた。
cron に登録してるスクリプト
- このスクリプトが動いている間はメンテナンス中の画面になるようにあらかじめ nginx にも設定しておく
- あとは上で作ったスクリプトの組み合わせ
- メンテ中でも archives 以下はアクセス可能
#!/bin/sh
DOC_BASE=/var/www/doc.okkez.net
mv ${DOC_BASE}/system/maintenance.html.no ${DOC_BASE}/system/maitenance.html
for f in $(find $HOME/ruby/rubydoc/refm/api/pids -name '*.pid' -print)
do
kill $(cat ${f})
done
$HOME/bin/bc-setup-all
$HOME/bin/bc-view-all
mv ${DOC_BASE}/system/maintenance.html ${DOC_BASE}/system/maitenance.html.no
こんな感じです。
まとめ
webrick を 10 個も起動しているのがちょっとダサいところなんですが、まあメモリもたくさん積んでいるのでいいのかな、と。
もっといいやり方があったら教えていただけるとうれしいです。


