管理しているサイトの記事がバズって常に1000人がアクセスしているような状態になった。メモリは2GBでCPUも普通のVPSを使っていたので、すぐにサーバーが死んでしまった。
今回はそんなバズによる急激なアクセス増を処理する対応を行ったので、まとめておく。ちなみに環境はApache+PHP。
1. Apacheのhttped.confをチューニング
vi /etc/httpd/conf/httpd.conf
httpd.confを開き、以下の値に設定した。
StartServers 8 # Apache起動時に起動するプロセス数
MinSpareServers 5 # 最低待機プロセス数
MaxSpareServers 50 # 最大待機プロセス数
MaxClients 120 # 最大起動するプロセス数(これ以上は起動しない)
ServerLimit 120 # MaxClientsに指定可能な値の上限。基本は同じにする
MaxRequestsPerChild 10 # 子サーバープロセスが扱うことの出来るリクエストの総数
今回はMaxClientsとMaxRequestsPerChildの値を以下のように修正した。
MaxClients
256 > 120
MaxRequestsPerChild
4000 > 10
MaxClientsの値が256になっていてhttpdがCPUリソースを専有していた。
そのため、最大起動のプロセス数を120に調整した。
MaxRequestsPerChildは大きすぎるとプロセスがいつまでも死なないので、
メモリを専有してしまっていた。
そのため、10リクエストをさばいたらプロセスが死ぬようにした。
2. PHPのメモリ利用を制限
次にPHPの利用するメモリの制限を行った。
php.iniのmemory_limitが1024MBになっていたので、128MBにした。
vi /etc/php.ini
memory_limit = 1024MB → 128MB
最後にhttpdを再起動して反映して終了。
上記の対策により合計約4万PVのアクセスがきてもCPUもメモリも問題なく、
リクエストをさばけるようになった。2GBメモリのVPSでもチューニングすれば、意外と何とかなるものですね。勉強になりました。
参考にした記事
さくらVPSで一日6万PVを処理するためにしたこと - 新卒インフラエンジニア2年目 http://d.hatena.ne.jp/koujirou6218/20101129/
Apacheのチューニングメモ - Qiita http://qiita.com/nownabe/items/1111cc32da9fe63289f0