Railsアプリをmod_proxy_balancerで負荷分散しつつ、ちょっとYSlow対策
2008-07-28 00:05:47
社内システムにはRailsを使ってるシステムがあったりするんですが、バージョンアップのタイミングで大幅にアクセス数が増えたらパフォーマンスが出なくなったので、同じサーバーの違うポートでmongrelを複数動かすようにして、Apacheのリバースプロキシで負荷分散させつつ、アプリ側の負荷を少しでも下げる為にmod_deflateとmod_expireを使って少しYSlow対策を施してみました。
設定はこんな感じ。
<VirtualHost *:80>
ServerName proxy.example.net
# バランサーの設定(個々のアプリをバランサーのメンバーとして定義)
<Proxy balancer://apps/>
BalancerMember http://app.example.net:9001 loadfactor=10 keepalive=On
BalancerMember http://app.example.net:9002 loadfactor=10 keepalive=On
BalancerMember http://app.example.net:9003 loadfactor=10 keepalive=On
</Proxy>
# バランサーの管理ツールの設定
<Location /balancer-manager>
SetHandler balancer-manager
</Location>
# 管理ツールはプロキシしない
ProxyPass /balancer-manager !
# mod_deflateで"/"以下の画像以外を圧縮する設定
<Location />
<IfModule mod_deflate.c>
SetOutputFilter DEFLATE
SetEnvIfNoCase Request_URI \
\.(?:gif|jpe?g|png)$ no-gzip dont-vary
Header append Vary User-Agent env=!dont-vary
</IfModule>
</Location>
# "/"以下のリクエストをバランサーにプロキシさせる
ProxyPass / balancer://apps/ timeout=300
ProxyPassReverse / balancer://apps/
# js, css, gif, jpg, png のexpire
<IfModule mod_expires.c>
<LocationMatch "\.(js|css)?\.*$">
ExpiresActive On
ExpiresDefault "access plus 1 years"
</LocationMatch>
<LocationMatch "\.(gif|jpg|png)$">
ExpiresActive On
ExpiresDefault "access plus 1 years"
</LocationMatch>
</IfModule>
</VirtualHost>
効果はなかなか。バランサーでバランスするようにしたことでリクエストはだいぶはけるようになりました。そして、mod_deflateとmod_expireはproxyのapacheとmongrelが別のサーバーで動いていても、体感できるぐらい効果アリでした。
Rail以外でもこの手は結構使えるハズなので、既に動いてるアプリの方をなるべく変更したくない時にも良いかもしれません。
※このエントリは builder メンバーにより投稿されたものです。朝日インタラクティブ および builder編集部の見解・意向を示すものではありません。
- trashtalk 最新エントリ
- ホワイトペーパー
