任意のHTTPステータスコードを任意の時間で返す
ロードバランサーなどの実験をしていると、バックエンドのweb/appサーバーから任意の時間で任意のステータスコードを返したくなることがあります。Apcheの挙動との一致を気にしたりしないという前提で、Sinatraで書くと非常にシンプルです。
プログラム
#web_test.rb require 'sinatra' get '/:code/:timeout' do status params[:code] sleep params[:timeout].to_f body "Status #{params[:code]}\n Timeout #{params[:timeout]}" end
設置〜実行方法
Amazon Linux (Redhat Enterprise Linux, CentOS互換)の場合です。
#yum install rubygems #gem install sinatra #vim webtest.rb #ruby -rubygems web_test.rb [2012-04-25 06:08:02] INFO WEBrick 1.3.1 [2012-04-25 06:08:02] INFO ruby 1.8.7 (2011-12-28) [x86_64-linux] == Sinatra/1.3.2 has taken the stage on 4567 for development with backup from WEBrick [2012-04-25 06:08:02] INFO WEBrick::HTTPServer#start: pid=1906 port=4567
デフォルトではポート番号4567が使用されるので、80番などを使いたい場合は、
#ruby -rubygems web_test.rb -p 80
などとしてください。
使用例
5秒後に400 Bad Requestを返す。
$ time wget localhost:4567/400/5 --2012-04-25 05:53:28-- http://localhost:4567/400/5 Resolving localhost... 127.0.0.1 Connecting to localhost|127.0.0.1|:4567... connected. HTTP request sent, awaiting response... 400 Bad Request 2012-04-25 05:53:33 ERROR 400: Bad Request. real 0m5.011s user 0m0.002s sys 0m0.005s
1.35秒後に500 Internal Server Errorを返す。
$ time wget localhost:4567/500/1.35 --2012-04-25 06:05:29-- http://localhost:4567/500/1.35 Resolving localhost... 127.0.0.1 Connecting to localhost|127.0.0.1|:4567... connected. HTTP request sent, awaiting response... 500 Internal Server Error 2012-04-25 06:05:30 ERROR 500: Internal Server Error. real 0m1.361s user 0m0.003s sys 0m0.003s
小数点2桁目ぐらいからは怪しいですが、数秒の精度であれば任意のステータスコードを任意の時間が経過した時刻で返すことができます。
これぞ3分クッキング・・・。