Hatena::ブログ(Diary)

130単位

2011-12-23

ApacheとRailsのリダイレクト比較

PCサイトと携帯サイトを端末ごとに振り分けるのに、jpmobileの判定メソッドがお手軽なのでRailsのredirect_toを当初利用していました。が、おそらくApacheリダイレクトさせたほうがパフォーマンスはいいはずです。ただ確信はなく、「推測するな、計測せよ」ということで調べてみました。

環境

Apache Bench

ab -n 100 -c 10 http://example.com/m/
結果サマリー
項目RailsApache
Requests per second63.3579.57
Time per request157.850125.677

というわけで単純な比較ではありますが、やはりApacheリダイレクトしたほうが2割ほど速いようです。

Rails
Server Software:        Apache/2.2.16
Server Hostname:        example.com
Server Port:            80

Document Path:          /m/
Document Length:        96 bytes

Concurrency Level:      10
Time taken for tests:   1.578500 seconds
Complete requests:      100
Failed requests:        0
Write errors:           0
Non-2xx responses:      101
Total transferred:      54338 bytes
HTML transferred:       9696 bytes
Requests per second:    63.35 [#/sec] (mean)
Time per request:       157.850 [ms] (mean)
Time per request:       15.785 [ms] (mean, across all concurrent requests)
Transfer rate:          33.58 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       10   61  48.7    101     119
Processing:    22   86  52.9    117     303
Waiting:       21   85  52.6    117     295
Total:         33  147 100.1    218     420

Percentage of the requests served within a certain time (ms)
  50%    218
  66%    230
  75%    237
  80%    239
  90%    251
  95%    263
  98%    274
  99%    420
 100%    420 (longest request)
Apache
Server Software:        Apache/2.2.16
Server Hostname:        example.com
Server Port:            80

Document Path:          /m/
Document Length:        302 bytes

Concurrency Level:      10
Time taken for tests:   1.256765 seconds
Complete requests:      100
Failed requests:        0
Write errors:           0
Non-2xx responses:      100
Total transferred:      52000 bytes
HTML transferred:       30200 bytes
Requests per second:    79.57 [#/sec] (mean)
Time per request:       125.677 [ms] (mean)
Time per request:       12.568 [ms] (mean, across all concurrent requests)
Transfer rate:          39.78 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       10   57  49.5     13     122
Processing:    11   60  49.9     17     139
Waiting:       10   58  49.9     15     138
Total:         21  118  99.4     28     245

Percentage of the requests served within a certain time (ms)
  50%     28
  66%    212
  75%    218
  80%    221
  90%    235
  95%    242
  98%    244
  99%    245
 100%    245 (longest request)

レスポンスヘッダ

参考までにレスポンスヘッダも。Railsのほうはすこし付加されています。

Rails
Cache-Control:no-cache
Connection:close
Content-Length:96
Content-Type:text/html; charset=utf-8
Date:Fri, 23 Dec 2011 16:07:36 GMT
Location:http://example.com/
Server:Apache/2.2.16 (Amazon)
Status:302
X-Powered-By:Phusion Passenger (mod_rails/mod_rack) 3.0.7
X-Runtime:0.068700
X-UA-Compatible:IE=Edge,chrome=1
Apache
Connection:close
Content-Length:302
Content-Type:text/html; charset=iso-8859-1
Date:Fri, 23 Dec 2011 16:12:57 GMT
Location:http://example.com/
Server:Apache/2.2.16 (Amazon)

開発効率

サーバーとしてのパフォーマンスはApacheが優れていますが、開発も含めて考えると、Railsにも利点があります。まず、記述が簡潔かつ柔軟なこと。jpmobileの判定メソッドなら携帯キャリアを羅列する必要はありませんし、params[:controller]やparams[:action]を使ったりもできます。それから、テストがしやすいこと。他と同じようにRSpec/Capybaraのintegration testで書けるのは保守もしやすいのではないかと思います*1

ステータスコード

ちなみに、

デスクトップ用ページから従来のモバイル端末用ページにGooglebot-Mobileをリダイレクトするなら、301か302のどちらを使っても構わない

no title

とのことです。UAの条件のもとで恒久的なものなので、個人的には301かなと思う次第です。


4774142239
Apacheポケットリファレンス (POCKET REFERENCE)

関連記事

*1Apacheでもできなくはないですが、外との通信となるためcapybara-webkitを使うなど工夫が必要です