###前提・実現したいこと
Apache,Passenger,RailsでWebサービスを運用しております。
キャンペーンのランディングページなどで、
特定のページにアクセスが集中するケースが発生しており、
その際に、次のような挙動をさせたいと思っています。
- 特定のページに負荷が集中した場合、そのページへのアクセスの一部で503を返す(Railsに処理させない)
- 負荷が落ち着いたら、503の返却を停止する
一部ページに負荷が集中した場合に、サービス全体が影響を受けるのでなく、
負荷が集中したページだけに影響を留めるのが理想です。
ハードウェア的な解決方法ではなく、ソフトウェア的に解決したいと思っています。
- Apacheのモジュールやrack middlewareなど
よろしくお願い致します。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
HAProxyはいかがでしょうか。高性能なソフトウェアロードバランサです。
ApacheのLISTENポートを8080等に変更し、HAProxyで以下の設定を入れます。
以下の例は同時接続数を100に制限する場合です。
xxx.xxx.xxx.xxx:80
には元々ApacheがLISTENしていたアドレスを、yyy.yyy.yyy.yyy:8080
にはApacheがLISTENしているアドレスに置き換えてください。
global log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.pid maxconn 30000 user root group root daemon defaults mode http log global option httplog option dontlognull option redispatch retries 3 timeout http-request 10s timeout queue 1m timeout connect 10s timeout client 1m timeout server 1m timeout http-keep-alive 10s timeout check 10s maxconn 30000 frontend www bind xxx.xxx.xxx.xxx:80 default_backend www_backend backend www_backend mode http balance leastconn option forwardfor #option httpchk GET /path/to/health_check #http-check expect status 200 timeout server 60s server www_01 yyy.yyy.yyy.yyy:8080 weight 1 maxconn 100 check inter 10s rise 2 fall 2
負荷が集中したページ配下のみで制御するには、ある程度ディレクトリを分割してbackend www_backend
を定義します。
以下の例では、/dir1を接続数10, /dir2を接続数20、/dir3を接続数30に制限しています。
frontend www bind xxx.xxx.xxx.xxx:80 acl acl_dir1 path_beg /dir1 acl acl_dir2 path_beg /dir2 acl acl_dir3 path_beg /dir3 use_backend www_backend_dir1 if acl_dir1 use_backend www_backend_dir2 if acl_dir2 use_backend www_backend_dir3 if acl_dir3 default_backend www_backend backend www_backend mode http balance leastconn option forwardfor #option httpchk GET /path/to/health_check #http-check expect status 200 timeout server 60s server www_01 yyy.yyy.yyy.yyy:8080 weight 1 maxconn 100 check inter 10s rise 2 fall 2 backend www_backend_dir1 mode http balance leastconn option forwardfor #option httpchk GET /path/to/health_check #http-check expect status 200 timeout server 60s server www_01 yyy.yyy.yyy.yyy:8080 weight 1 maxconn 10 check inter 10s rise 2 fall 2 backend www_backend_dir2 mode http balance leastconn option forwardfor #option httpchk GET /path/to/health_check #http-check expect status 200 timeout server 60s server www_01 yyy.yyy.yyy.yyy:8080 weight 1 maxconn 20 check inter 10s rise 2 fall 2 backend www_backend_dir3 mode http balance leastconn option forwardfor #option httpchk GET /path/to/health_check #http-check expect status 200 timeout server 60s server www_01 yyy.yyy.yyy.yyy:8080 weight 1 maxconn 30 check inter 10s rise 2 fall 2
投稿2016/09/21 01:15
編集2016/09/21 01:23総合スコア6621
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/09/21 04:55