nginx + webrick でるりまを公開する方法

投稿者 okkez 2008-10-30 15:31:00 GMT

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 個も起動しているのがちょっとダサいところなんですが、まあメモリもたくさん積んでいるのでいいのかな、と。

もっといいやり方があったら教えていただけるとうれしいです。

カテゴリ ,  | タグ ,  | コメントなし | トラックバックなし

nginx + fcgi + php on Debian

投稿者 okkez 2008-10-20 12:03:00 GMT

Debian sid で nginx + fcgi + php な環境を作ったのでメモ。

インストール

Debian なので全部パッケージで手に入る。 普通に aptitude で入れれば OK

とりあえず php5-cgi を忘れなければ良い。 ついでに fcgi の起動に spawn-fcgi を使用するので lighttpd を入れておく。

ちなみに自動起動の停止は以下のコマンド。ついでに設定ファイルで listen するポートも変更しておくといいかもしれない。

$ sudo update-rc.d -f lighttpd remove

設定

まずは nginx は以下のような感じで設定します。 Debian での Apache と同じように /etc/nginx/sites-enabled と /etc/nginx/sites-available 以下に virtual host ごとの 設定ファイルを置くようになっているのでそのようにする。基本的には /etc/nginx/nginx.conf はいじらない。

注意するのは以下の点。 * SCRIPT_FILENAME がフルパスになるようにする * 行末のセミコロンを忘れない * 設定ファイルの書式チェックは sudo nginx -c nginx.conf -t で行う。 * リロードは /etc/init.d/nginx reload で。

server {
    listen 80;
    server_name xxx.okkez.net;
    access_log /var/log/nginx/xxx.okkez.net-access.log combined;

    server_name_in_redirect off;

    location / {
        index index.php index.html;
        root /var/www/xxx.okkez.net;
    }
    
    location ~ \.php$ {
        #fastcgi_pass   127.0.0.1:9000;
        fastcgi_pass   unix:/tmp/php.fastcgi.socket;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /var/www/xxx.okkez.net$fastcgi_script_name;
        include /etc/nginx/fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }

    location ~ /\.git {
        deny all;
    }

}

次に spawn-fcgi を用いて fcgi の起動停止スクリプトを書きます。 私は FreeBSD: Nginx FastCGI PHP Configuration を参考にして UNIX Socket を使用して fcgi を起動するようにしました。

オリジナルとの違いは以下。 * pcgi_restart で stop -> start の間に sleep を入れた ** 入れないとたまにエラーメッセージを吐くことがあったため * fcgi の起動方法を socket にした * コマンドのパスを自分の環境に合わせた

#!/bin/sh
# NGINX FastCGI php5 startup shell script
# Feedback <vivek@nixcraft.com>
# http://bash.cyberciti.biz/web-server/fastcgi-php-server-start-stop-script/
# Set ME #
PROVIDES=php-cgi
SPAWN_FCGI=/usr/bin/spawn-fcgi
SERVER_IP=127.0.0.1
SERVER_PORT=9000
SERVER_USER=www-data
SERVER_GROUP=www-data
SOCKET_PATH=/tmp/php.fastcgi.socket
PHP_CGI=/usr/bin/php-cgi
PGREP=/usr/bin/pgrep
KILLALL=/usr/bin/killall
### No editing below ####
cmd=$1
 
pcgi_start(){
  echo "Starting $PROVIDES..."
  #$SPAWN_FCGI -a $SERVER_IP -p $SERVER_PORT -u $SERVER_USER -g $SERVER_GROUP -f $PHP_CGI
  $SPAWN_FCGI -s $SOCKET_PATH -u $SERVER_USER -g $SERVER_GROUP -f $PHP_CGI
}
 
pcgi_stop(){
  echo "Killing $PROVIDES..."
  $KILLALL $PROVIDES
}
 
pcgi_restart(){
  pcgi_stop
  sleep 2
  pcgi_start
}
 
pcgi_status(){
  $PGREP $PROVIDES > /dev/null
  [ $? -eq 0  ] && echo "$PROVIDES running" || echo "$PROVIDES NOT running" 
 
}
 
pcgi_help(){
  echo "Usage: $0 {start|stop|restart|status}"
}
 
case ${cmd} in
[Ss][Tt][Aa][Rr][Tt]) pcgi_start;;
[Ss][Tt][Oo][Pp]) pcgi_stop;;
[Rr][Ee][Ss][Tt][Aa][Rr][Tt]) pcgi_restart;;
[Ss][Tt][Aa][Tt][Uu][Ss]) pcgi_status ;;
*)      pcgi_help ;;
esac

こんな感じです。 ローカルでの体感速度はかなり上がった気がします。(サーバもパワーアップしているので一概には言えませんが。。。)

カテゴリ  | タグ  | コメントなし | トラックバックなし

nginx で combined な log を書く

投稿者 okkez 2008-09-06 11:38:00 GMT

NginxHttpLogModule - Nginx Wiki に書いてあるんだけど、ちゃんと読まなくてハマったのでメモ。

log_format  combined  '$remote_addr - $remote_user [$time_local] '
                      '"$request" $status $body_bytes_sent '
                      '"$http_referer" "$http_user_agent"';

って書いてあるけど、直前の行に書いてある通り元から定義されているので nginx.conf に書いてはいけない。 書くとエラーになります。

カテゴリ  | タグ  | コメントなし | トラックバックなし