サーバーがだんだん重くなっていって、ついにはwordpressのページがまともに見れなくなった話(原因はapacheでもMySQLでもない)

今日午前中に相変わらずwebアプリケーションの開発をしていた。
最初は調子が良かったが、なんだかだんだんサーバーからの返事が重くなってきて、ついには返事を返してくれなくなった……。

なんでだろう?と疑って半日かけて解決した悲しいお話です。
本当に状況が悪かった。MySQLとMojoliciousを連携するアプリケーションの開発中にwordpressのページが見れなくなったもんだから、てっきりMySQLの触っちゃいけない設定をいじったのかと思ってたのに、まさかそんなのが原因だなんて……。

MySQLを疑う

まず、サーバーが重くなった段階ですべてのMojoliciousアプリを停止して(停止しても困る人だれもいないので)、その語freeコマンドなんかでメモリ使用量の確認をした。
このサーバーはsakuraの1GBプラン、サーバーが激重状態の時にはこんなメモリ使用量だった。

$ free -h
f             total       used       free     shared    buffers     cached
Mem:          993M       925M        68M        39M       164K        50M
-/+ buffers/cache:       874M       119M
Swap:         1.0G       205M       815M

ひどいことに、Mem:のフリーが60MB程度で、Swapをほとんど使い切っている。完全にメモリ不足だし、これじゃあwordpressを出すとかそれ以前の話になる。

この状況に陥るまでしばらくMySQLとperlをいじっていたので、MySQLが原因じゃないかと考え、下のページなんかを参考にして設定の切り替えを色々と試した

しかし何しても直らない。MySQLは原因ではなかったのか??疑問は残るが一旦保留にした。

Apacheを疑う

Webで「Apache 重い」などと調べると、様々な軽量化設定の方法が出てくる。

preforkされるプロセスの数なんかをいじったり、メモリをOSに還元する設定(そんなのあるんだ)を変えたり、目立つ設定はかたっぱしからいじった。
余談だが、ubuntuにおける<IfModule mpm_prefork_module>の設定は「/etc/apache2/mods-available/mpm_prefork.conf」に書くことになっている。
いろいろ試しても、やっぱりサーバーは相変わらず激重のまま。Apacheも原因ではなかったのか??もう分からんわって感じ。

Nginxに頼る

もうApacheはオワコンなんだ。時代はNginxだ、軽いし。とか言いながらApacheのプロセスを止め、aptでnginxをインストールした。
nginxのインストールって難しそう。。。とか言いながら敬遠していたが、やってみたらめちゃ簡単だった。みんなにもやってほしい。

nginxでwordpressのトップページを出したら……ちゃんと表示された!!!

だけれども やっぱり なんだか 重かった。

ここまで試すのにかれこれ6時間はかけてる。ほとんどはMySQLとApacheの設定いじり。ときにはSSHも重くなってシェルが固まることもあった。そんな中の最後の頼みの綱のnginxも思いだなんて俺はもう才能がないんじゃないかと悲しくなってきた。

ただ、そのときパーミッションの関係か、wp-adminがちゃんと見れなかった。それの設定を変えようとして、Nginxのログを見た時、俺はやっと気づいた。

本当の原因

紆余曲折様々なこと経て、最後にはもうやる気も削がれてなんだか悲しくなってきた頃、乱心気味にインスコしたNginxのログにその答えがあった。

2017/03/13 21:10:46 [error] 15019#0: *3 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 191.96.249.53, server: localhost, request: "POST /xmlrpc.php HTTP/1.0", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "153.126.204.66"
2017/03/13 21:10:46 [error] 15019#0: *5 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 191.96.249.54, server: localhost, request: "POST /xmlrpc.php HTTP/1.0", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "153.126.204.66"
2017/03/13 21:10:46 [error] 15019#0: *7 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 191.96.249.53, server: localhost, request: "POST /xmlrpc.php HTTP/1.0", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "153.126.204.66"
2017/03/13 21:10:46 [error] 15019#0: *9 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 191.96.249.54, server: localhost, request: "POST /xmlrpc.php HTTP/1.0", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "153.126.204.66"
2017/03/13 21:10:46 [error] 15019#0: *11 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 191.96.249.53, server: localhost, request: "POST /xmlrpc.php HTTP/1.0", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "153.126.204.66"
2017/03/13 21:10:46 [error] 15019#0: *13 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 191.96.249.54, server: localhost, request: "POST /xmlrpc.php HTTP/1.0", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "153.126.204.66"
2017/03/13 21:10:46 [error] 15019#0: *15 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 191.96.249.54, server: localhost, request: "POST /xmlrpc.php HTTP/1.0", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "153.126.204.66"
2017/03/13 21:10:46 [error] 15019#0: *17 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 191.96.249.54, server: localhost, request: "POST /xmlrpc.php HTTP/1.0", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "153.126.204.66"
2017/03/13 21:10:47 [error] 15019#0: *19 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 191.96.249.53, server: localhost, request: "POST /xmlrpc.php HTTP/1.0", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "153.126.204.66"
2017/03/13 21:10:47 [error] 15019#0: *21 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 191.96.249.54, server: localhost, request: "POST /xmlrpc.php HTTP/1.0", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "153.126.204.66"
2017/03/13 21:10:47 [error] 15019#0: *23 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 191.96.249.53, server: localhost, request: "POST /xmlrpc.php HTTP/1.0", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "153.126.204.66"
2017/03/13 21:10:47 [error] 15019#0: *25 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 191.96.249.54, server: localhost, request: "POST /xmlrpc.php HTTP/1.0", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "153.126.204.66"
2017/03/13 21:10:47 [error] 15019#0: *27 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 191.96.249.53, server: localhost, request: "POST /xmlrpc.php HTTP/1.0", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "153.126.204.66"
2017/03/13 21:10:47 [error] 15019#0: *29 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 191.96.249.53, server: localhost, request: "POST /xmlrpc.php HTTP/1.0", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "153.126.204.66"
2017/03/13 21:10:48 [error] 15019#0: *31 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 191.96.249.54, server: localhost, request: "POST /xmlrpc.php HTTP/1.0", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "153.126.204.66"
2017/03/13 21:10:48 [error] 15019#0: *33 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 191.96.249.53, server: localhost, request: "POST /xmlrpc.php HTTP/1.0", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "153.126.204.66"
2017/03/13 21:10:48 [error] 15019#0: *35 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 191.96.249.54, server: localhost, request: "POST /xmlrpc.php HTTP/1.0", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "153.126.204.66"
2017/03/13 21:10:48 [error] 15019#0: *37 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 191.96.249.53, server: localhost, request: "POST /xmlrpc.php HTTP/1.0", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "153.126.204.66"

DOS攻撃されとるやないか!!!

もうびっくりした。だってこのブログに今までお客さん来たことないんやで。検索しても出てこやへんし。こんな弱小ブログ攻撃何が面白いんやドアホ > 191.96.249.53。って取り乱した。
ログを良く見たら分かるけど、1秒間に5回も/xmlrpc.phpにアクセス要求されてることもあるし、そりゃ重くもなるわと納得がいく。
これを調べてみるとXMLRPC Pingingと呼ばれる立派なDOS攻撃らしい。そんなのはもっと大手のブログにやってさ……。

俺の大事な半日を そっくり返してほちいめろ。

悲しんでも仕方ないので、この招かれざる客を早々に排す。対策は一瞬で決めた。IPアドレスで弾く。

対策を打つ

XMLRPC Pingingの対策方法を調べて下記のサイトがヒットしたので、そこから引用させて頂く。

下記のコードを.htaccesに追加したらOK.(Ubuntuはデフォでは.htaccessを読みに行かないので、この辺(Ubuntu 11.10:apache2の.htaccessを有効にする方法)で対策が必要)

#xmlrpc無効化
<Files "xmlrpc.php">
order deny,allow
deny from all
</Files>

書いたらapache2をrestart。するとメモリ使用量がこうなった。

$ free -h
             total       used       free     shared    buffers     cached
Mem:          993M       215M       778M        38M       5.9M        86M
-/+ buffers/cache:       123M       870M
Swap:         1.0G       215M       805M

ログファイルを見ても、もう攻撃者からのアクセスは表示されない。どうやら除外がうまくいってApacheの高負荷が解消されたようだ。
これで直った。綺麗さっぱり直った。ッン、モウ 冗談ヤメテクレヨ。

最後に

今日は半日、DOS攻撃のせいでえらい目にあった。
教訓として「サーバーが重くなったら、Apacheを疑う?MySQLを疑う?違う、多分原因はDOS攻撃だ」っていう標語を作ったので、皆さんにおかれましては私のように半日無駄にして悲しいことにならないようにしてもらえればと思います。

おしまい。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする