[過負荷対策] wordpressの画像をAmazonS3から配信

2016/09/08Amazon, WordPress, クラウド

2016年6月、ある記事を公開したところ、鬼のようにアクセスが来てサーバーのレスポンスがかなり遅くなったことがある。
原因は「沖縄女子高制服図鑑を探して(1)」。さもありなん。

下はセッション数のグラフ。通常の10倍以上のアクセスが来ていたようだが、この時はサーバーが過負荷になっていて実アクセス数はわからない。

20160908-s3-0

制服記事を公開するたびに過負荷になっては困るので、少し対策してみた。

目次

対策

下記の対策でページ表示速度は上がったのですが、多数のセッションが来るとやっぱり辛い。

このブログは さくらのVPS(v3) SSD 2G プランで動いていて CPUもメモリも非力だ。特にメモリが足りない。
アクセスが集中すると httpd が増殖してメモリを喰い、スワップが発生してさらに遅くなる悪循環になっていた。

画像をAmazonS3に追い出す

記事内の画像だけでも別サイトから配信すれば起動するhttpdの数も減るし、並列に送れるので転送速度も上がる。

世の中には個人ブログの配信にCDNを使ってる人もいるけど※1、私はそこまでは根性はないので画像だけS3から配信することにした。

世の中進歩していて、Wordpressの画像をS3に追い出すプラグインが既にあった。「Nephila clavata (絡新婦)」。
難しい設定をせずに自動的にS3に画像を送ってくれる上に、使っている画像のURLを適宜変更してくれる。大変便利。

サーバー側にも画像は残っていて、プラグインを止めればS3からの配信も止まる。

S3のデフォルトだと expire が設定されないので、s3cmd で適当に設定しておく。このサイト程度ではあまり効果はないかもしれないけど、塵も積もれば山だ。

s3cmd –recursive modify –add-header="Cache-Control:max-age=604800″ s3://server/path-of-image/

困ってる点1・アイキャッチ画像

トップページ表示しているアイキャッチ画像がS3側にならないことがある。

20160908-s3-1

ソースを見てみると wordpress 4.4 で採用された表示画像の切り替え部分(srcset)がS3側になっていないようだ。

20160908-s3-2

アイキャッチ画像はそれほど大きくないので、現在は放置している。そもそも srcset で切り替えるメリットあるのかな、うちのサイト。

困ってる点2・人気記事サムネール

人気記事を表示するために WordPress Popular Postsプラグインを使っているが、これが生成するサムネール画像はS3に転送されない。

20160908-s3-3

GTmetrixを使って表示時間(waterfall)を見てみると、人気記事画像の転送だけで1秒弱かかっている。1ページ表示毎に10回の画像GETが発生するので、サーバー負荷的にはS3に回した方が良さそう。
(S3からのGET数がかなり増えるから、料金的には現状のままの方がいいのか?)

人気記事と新着記事のサムネールが別々に管理されているのも問題ではあるな。半分ぐらいは重複してるので、共用できれば転送量は減るはず。

結果

それなりに表示速度は速くなってるのですが、細かい画像の転送がネックになってる。速度的にも料金的にも。
S3の転送量で費用が嵩むぐらいなら、使ってるvpsを1ランク上げた方が良さそうなのも悩みどころ。

個人サーバーなんて悩むのが楽しみといえば楽しみではありますが。

リンク


Amazon, WordPress, クラウド

Posted by ず@沖縄