こんにちは、エンジニアのづやです。好きなモノは週刊少年ジャンプ、キライなものは503エラーです。
あまり大きな声では言えない話ですが、過去にLIGブログはちょこちょこサーバがダウンしていたので、休日や夜間に緊急の対応をしたことも何度かあります。そのような状態を回避するために、AWSでWebサーバを構築して負荷に応じて自由自在に拡張・運用する方法を前回まとめさせていただきました。
今回はより各論的に、AWSサーバを構築・運用する際によくあるトラブル事例・落とし穴をご紹介します。AWSでサーバを構築をして、サイトが次第に成長をしはじめて、負荷に応じた拡張・運用をする必要がでてきたサイト運営者の参考にしていただければ幸いです。
事例の収集にあたって、今回も、EC2やS3をはじめとするAWSプロダクトを完全支援するサービス「cloudpack」を運営するAWSのプロ、アイレットさんにお話を伺いました。
(おさらい)503エラーを防ぐには
サーバのトラブルとしてはあまりにも有名な503エラー。HTTPステータスコードの中でも、「5××」ではじまるエラー番号は、サーバがリクエストの処理に失敗したことを意味しています。このうち、503はサービスが一時的に過負荷やメンテナンスで使用不可能である場合に返されるエラーコードで、アクセスが集中してサーバが処理できなくなった場合によく表示されます。
【エラーコード】HTTPステータスコードの原因一覧
拡張性がないサーバを使用していると、CPUの負荷が限界を越えたときに503エラーが発生しますが、AWSの魅力はサーバリソースの拡張性が自由自在なので、本来はサーバが落ちにくいはずです。しかし、プレスリリースや広告をうったり、時季による変動でサーバへのアクセスに大きな波があったりするサービスやサイトの場合、一時的にその負荷に耐えられなくなることがあります。
最近はクラウドサービスを利用しているサイトが多いので、典型的な503エラーはサーバリソースの不足が主な原因になります。どのようにサーバリソースを拡張・撤退させるのかについては、こちらの記事をご確認ください。
アイレットさんに伺ったところ、AWSを利用している場合の、503エラーの原因は以下のように絞り込めます。それぞれの対策をまとめてみました。
AWSで構築したサーバで503エラーが発生した場合の原因と対策
Webサーバの処理能力不足
Webサーバの性能しきい値に関する設定を変更せず、インストールした初期値のままにしているケースが考えられます。初期値のままだと、高い処理性能を有するEC2を立ち上げても性能が活かしきれません。例えばApacheを利用している場合は、http.confの以下の性能しきい値を見直してみましょう。
- StartServers(Apacheを起動した際に確保されるプロセス数)
- MaxClients(確保するプロセス数の最大値)
- MinSpareServers(最低限確保するアイドルプロセス数)
- MaxSpareServers(最大限確保するアイドルプロセス数)
- ServerLimit(MaxClientsに指定可能な最大値)
- MaxRequestsPerChild(プロセス単位で処理可能なリクエスト数)→ リクエスト数に達した場合、そのプロセスは終了する。0の場合はプロセスは終了されず使いまわされるが、メモリリーク等が発生した場合そのまま蓄積してプロセス辺りのメモリの使用量が肥大化していく。
DBサーバの処理能力不足
WordPressやMovable Typeを利用している場合、アクセスが増加するとDBサーバの処理能力が不足することがあります。DBサーバのリソース(CPU、Mem、DiskのRead/Write IOPS等)が不足していないかを確認しましょう。
ロードバランサー(ELB)の処理能力不足
意外に見落としがちなのがこれ。LINE砲やYahoo!砲で一気にアクセスが増加すると、ロードバランサー(ELB)の処理能力が一時的に不足する場合があります。通常ロードバランサーは負荷状況をみて自動的にスケーリングしてくれるようになっていますが、一気にアクセスが増加する場合はスケーリングが間に合わない場合があります。このような場合は、事前にAWSに対してELBの暖気申請を行うとよいでしょう。