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

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

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

Posted in , | コメントはありません |

nginx + fcgi + php on Debian

Posted by okkez Mon, 20 Oct 2008 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 # 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

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

Posted in | コメントはありません |

nginx で combined な log を書く

Posted by okkez Sat, 06 Sep 2008 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 に書いてはいけない。 書くとエラーになります。

Posted in | コメントはありません |