Magentoチューニングの勘所
この記事は公開から 1年以上が経過しています。現在の最新情報との整合性については弊社では一切の責任を負いかねます。
Magentoのチューニングの概略についてご説明します。ご参考程度にお読みいただけますと幸いです。
なお、文中には詳細な数値などは記載しておりません。これは環境によって異なるためケースバイケース出の対応となることが多いからです。
トラフィック量に対し、適正なサーバスペック・構成を見積る
メモリは最低4GBくらい必要
MagentoはPHPでできたWebアプリケーションです。
同じようなWebアプリケーションは数多くありますが、Magentoほどサーバスペックにこだわるアプリケーションはあまり多くありません。
正直なところ、メモリ1GB以下の環境では快適な動作は望めないでしょう。これはCommunityでもEnterpriseでも同じです。
PHPアプリケーション自体が最低でも256MBのメモリを必要とし、その下支えをするデータベースが相応のメモリを必要とするからです。さらにOSそのものもメモリを必要としますし、HTTPサーバもメモリを使います。
つまり、メモリ1GB以下の環境では容易にスワップアウトが起きる可能性がある、というわけです。
従って、Magentoを動作させるサーバは最低でもメモリ4GBくらいはご用意いただくのが良いと思います。
これくらいあると、小規模なサイトであれば十分快適な動作が望めます。
出来ればWebサーバとDBサーバは分けたい
セキュリティ的な観点とパフォーマンス面の観点の両方から考えて、WebサーバとDBサーバは分けたいものです。
しかし、サーバのスペックは1台の時の半分にできるか、と言われればそれはNoでしょう。
データを受け渡しするネットワークのオーバーヘッドを考えると、スペックは本音を言うと1台の時と同じ物を2個用意していただくほうが望ましいです。せっかくサーバを分けるのですから、ここでケチった所で最終的にはスペック不足になってしまい、より高性能なサーバに移転するのであれば、最初からいいものを選んでおいたほうが総合的な費用面では安くつくのではないでしょうか。
Apache + mod_php か nginx + FastCGI か
正直どちらでもよい、と思います。Apache+mod_php の組み合わせは十二分にこなれていて、安定してアプリケーションを動作させることができます。一方、 nginx + FastCGI の組み合わせはパフォーマンス面で優れるかもしれませんが、Apache と nginx の設定方法が異なるために、設定を間違えるとパフォーマンスが得られないばかりかセキュリティ的な問題を引き起こす可能性が考えられます。
どちらがよい、ではなく自社として使い慣れているものを使い、適切な設定をすることが重要であると考えます。
1台の性能が突出して優れていたとしても、Eコマースという舞台の上では、安定して動作することのほうがより重要であると弊社では考えております。
データベースの(特にInnoDB)のチューニングを行う
MagentoはデータベースにMySQLを使用し、大半のテーブルでInnoDBを採用しています。
このため、InnoDBのチューニングの内容によって、サイトのパフォーマンスに大きな影響を与えてしまいます。
また、昨今はディスク装置とメモリのあいだのデータ転送速度に大変な差があり、SSDなどを使用してようやくなんとかなるという場合も散見されます。古典的な方法ですが、データベース専用サーバには潤沢なメモリを用意し、MySQLのチューニングを行うことが必要です。それだけでもサイトは快適になり、余計なチューニングを試行錯誤する必要性から解放されるはずです。
バイトコードキャッシュを使う
PHPはインタープリター言語です。1回のアプリケーション実行ごとにソースコードを読み込み、機械語に翻訳して実行します。このオーバーヘッドは見過ごせない無駄として、チューニングの対象になります。
PHPにはAPC・eAccelerator・XCache・ZendOptimizerなどのバイトコードキャッシュが用意されています。
これらをインストールし、適切な設定をすることによって、サーバの性能をより引き出してやることができるようになります。 APC・eAcceleratorについてはMagentoとの相性も比較的良いので、導入しやすいと思います。
テンプレートやレイアウト上の無駄を省く
Magentoのテンプレートは細切れになっていて、ファイル読み込みの手間は相当なものになっています。
そのうえにオリジナルのカスタマイズでパーツを増やしてしまうと、オーバーヘッドはますます増えることになります。
あまり細かくパーツをわけず、少し大きめの括りで実装することや、複数の静的ブロックを統合して1つのブロックにするなどすれば、処理の無駄が減ると思います。
ログの採取をやめる
Magentoは1アクセスごとに訪問者の行動ログを取っています。
最近見た商品やカートに入れた商品などのログを採取することによって、そこから派生するプロモーションにつなげるためです。
しかし、アクセスの多いサイトになると、このログを採取するための処理ですら無視できないものになってきます。
もちろん、Magentoはログをクリーニングする機能を備えていますが、アクセスが多いとそれすら無意味です。
アクセスの多いサイトではログの採取を停止し、外部のレコメンデーションエンジンなどを活用する方向にシフトするべきだと思います。
リンク切れ画像などを洗い出す
リンク切れ画像やページがあるとMagentoは自動的にエラーページをだそうとします。
この時、普段より少ないとは言うものの、無駄にサーバの処理性能を消費してしまいます。
昨今のブラウザはリンク切れ画像などを調査するためのツールも持っているので、うまく活用してリンク切れが起きないようにサイトを調整することが必要です。
背景画像などの画像ファイルをCDNに切り出す
画像は概して多くの回線帯域とWebサーバのリソースを消費します。
大きな帯域を確保するとは多大な固定費の発生を招くため、画像によるアクセスが多いサイトでは早い段階からCDNなどの外部のメディア配信サービスを利用することが賢いといえるでしょう。
以前は高価なサービスでしたが、最近は安価な事業者も登場しているので、利用しやすくなっていると思います。
Webサーバはアプリケーションの処理に専念させ、画像の配信は外部で行いましょう。
ExpireヘッダやeTagを設定する
背景画像やロゴ画像のような頻繁に変わらない画像は何度もアクセスされるだけ無駄なものです。
ExpireヘッダやeTagを適切に設定することで、2回目以降の訪問時に画像やCSS・JavaScriptのファイルの読み込みを抑制し、Webサーバのリソースを使わないようにしましょう。
フルページキャッシュを導入する
Enterpriseには最初から搭載されている機能です。
そもそも論に立ち返ると、都度都度ページのデータを処理しているから遅いのであって、必要ない部分は処理しなければ良いというのがキャッシュの考え方です。これを突き詰めたものがフルページキャッシュと呼ばれるもので、Community向けにもいくつかのエクステンションがリリースされています。
これらをインストールすることで、Magentoの性能を劇的に高め、1サーバあたりの受付可能アクセス数の上限を引き上げることができるようになります。
ただし、情報が完全にリアルタイムにならないなどのキャッシュならではの問題もあり、多くのアクセスを抱えるサイトでは、ある程度のトレードオフとして考えるべきことなのではないかと思います。しかし実際、効果は絶大です。
Varnishなどのリバースプロキシを導入する
さらにスケールアウトを考えていくと、1台のWebサーバや1台のデータベースサーバでは立ち行かなくなります。
そんなときに、ロードバランサやリバースプロキシを使っていくことになります。
Apacheのmod_proxyも有用なツールですが、Varnishはロードバランス機能やキャッシュ機能を備えた高速リバースプロキシとして、Magentoでも導入実績が報告されているソフトウエアです。
これらを導入することでシステム全体の処理性能を高め、かつプロキシが蓄えるキャッシュを上手に使うことでアプリケーションサーバへのアクセスを抑制してレスポンスを安定させることができるでしょう。
セッション情報のストレージとしてmemcachedなどのNoSQLを使用する
Magentoは標準でセッション情報をファイルまたはデータベースに記録します。
しかし、データベースは書き込み処理を分散させることが難しいため、性能の限界値があまり高くありません(高める方法はもちろんありますが、一般的なレベルで、という意味です) 。そのため、より高い性能を求めるのであれば、memcachedやあるいはその互換プロトコルを採用するNoSQLを採用するのが良いでしょう。
これらはデータベースをはるかに凌ぐ読み込み・更新性能を持ち、製品によってはスケールアウトも可能になっているものさえあります。
MagentoはベースになっているZendFrameworkの恩恵もあり、memcachedに標準で接続できるようになっています。
上手に使い、サイトのパフォーマンスを向上させたいものです。
おわりに
MagentoもWebアプリケーションです。他のWebアプリケーションのチューニング方法を応用することが出来ます。
特殊なチューニングというものは存在しません。既存の手法を応用・組み合わせることで、Magentoはより高い性能を発揮してくれることでしょう。