nginxにリバースプロキシ設定してapacheと連携させる・・・の性能測定

2014.06.13

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

前回、nginxにリパーズプロキシの設定をし、apacheと連携させrailsアプリを動かしましたが折角なので性能測定をし、それぞれ単独で動作させた場合と比較してみました。 以下、性能測定した組み合わせです。

  • nginx + unicorn
  • apache + passenger
  • nginx + apache + passenger(前回構築したもの)
  • WEBRick(おまけ)

性能テストをした環境

環境は前回構築した環境と同じで、macのvirtual box上のubuntuで動作させています。

  • ubuntu 12.04 32bit メモリ1GB
  • apache 2.2
  • nginx 1.6
  • ruby 2.00
  • rails 4.1.0

※負荷ツールの実行はmacから実行させています。

それぞれの設定

nginx + unicorn

gemファイルにunicornを追加してインストールします。
nginx,unicornの設定項目は以下になります。
/etc/nginx/conf.d/test.conf

    upstream test {
            server unix:/tmp/test.sock;
    }

    server {
            listen          80;
            root   /home/test/rails_projects/sample_app/public;

            try_files $uri @test;

            server_name     sample.jp;
            #access_log      /var/www/test/logs/access.log;
            #error_log       /var/www/test/logs/error.log;

            location @test {
                    proxy_pass http://test;
            }
            location = /robots.txt  { access_log off; log_not_found off; }
            location = /favicon.ico { access_log off; log_not_found off; }
    }

sample_app/config/unicorn.rb

worker_processes 2
listen '/tmp/test.sock'
pid '/tmp/test.pid'

nginx + unicorn

こちらは前回構築したnginx、apache連携の設定とほぼ一緒です。ポートを80に変更し、nginxは停止させapacheのみを起動させてます。
/etc/apache2/ports.conf

NameVirtualHost *:80
Listen 80

/etc/apache2/sites-available/localhost

<VirtualHost *:80>

nginx + apache + passenger

前回の設定のままです。

アプリを用意する

今回呼び出しに使用したアプリはこんな感じです。
home_controller.rb

class HomeController < ApplicationController def index end end [/ruby] index.html.erb [ruby] home [/ruby] home/indexを呼び出すと、homeという文字が表示するというシンプルなものです。home/indexが呼び出された時に生成されるhtmlはこんな感じです。 [html] RailsApp home

[/html] 画面に表示されるhtmlにはrailsのデフォルトのcssやjsファイルが呼び出されています。よってnginxをリバースプロキシとして設定しapacheと連携した場合は、railsの処理はapacheが行い(nginxがapacheを呼び出す)、cssやjsファイルはnginxが処理するようになります。

負荷ツールで性能テストをしてみる

今回使用した負荷ツールはJmeterです。
JMeterはメジャーなパフォーマンス測定用のJavaアプリケーションツールです。ここでは特に細かい使い方等の説明はしません。

JMeterの設定

今回は、Ramp-Up期間(秒)、ループ回数はそれぞれ5に固定し、スレッド数を100,150,200,250,300に変化させ、HTTPリクエストを発行しました。簡単にいうと5秒間にHTTPリクエストをそれぞれ500,750,1000,1250,1500回なげたことになります。

統計リポートの結果

Jmeterの統計リポートの結果です。
負荷試験結果

項目の説明

  • Samples・・・サンプル数(実行数)
  • Avarage・・・レスポンス時間の平均値(ミリ秒)
  • Median・・・レスポンス時間の中央値(ミリ秒)
  • 90% Line・・・レスポンス時間がこの値以下に全サンプルの90%が収まることを示す値
  • Error %・・・エラーのパーセンテージ
  • Min・・・最小レスポンス時間
  • Max・・・最大レスポンス時間
  • Throughput・・・単位時間あたりのプレビュー数(PV/単位時間)
  • KB/sec・・・1秒あたりの平均転送速度KB

まとめ

今回の設定(ほぼ初期状態)と環境からすると結果はnginxが良かったことが分かりました。apacheに関してはWEBRickと同じリクエスト数でエラーが発生してしまいました。今回、期待していたnginx + apacheの結果はエラーは発生しなかったものの思ったほど良くなく残念でした。
今回はチューニングという観点では何も行っていない状態での結果でした。今度はある程度チューニングをして実施してみたいと思います。

参考資料