web-dev-qa-db-ja.com

キャッシングPHPページ、ワニス、nginx、その他?

ローエンドボックス(1GB RAM)で実行されているWebアプリケーションがあり、静的ページと動的(php)ページが混在しています。これらのPHPページは、頻繁に変更されないMYSQLデータベースをクエリしています-週に1回?。

私はすべてを素晴らしくスピーディーに保つためにかなりの量のキャッシュを行うことを探しています。 phpですが、情報がほとんど変更されないページがあります(数か月に1回変更される可能性のあるアイテムのリストを取得しますか?)。数ページに最大400件のレコードがリストされている場合があります。

Varnish、nginx、PHP-FPM、APC、MYSQLがインストールされています。私はすべてが正しく設定されていると思います。ページが提供されており、ワニスにヒットが表示されています...ブリル!ただし、ウェブサイトの性質上、最適化されているかどうかはわかりません。

最近の検索では、私のphpページに役立つ可能性のあるいくつかのことが示唆されています。

  • nginxFastCGIキャッシング
  • memcached
  • MYSQLクエリキャッシング

例:新しいPHPページ、かなりの数(200+)のレコードがリストされています:2秒更新後1.5(ish)秒編集:期待するのは非現実的ですかこのページは、行のどこかにキャッシュされ、アクセスされた後、はるかに迅速に提供されますか?

私の最善の選択肢は何でしょうか?上記の1つまたはすべて?

3
Coffeee
  • Memcachedを実際に使用するには、コードが必要です。しかし、あなたがこのコードを書いたなら、これは簡単にできるはずです:)
  • MySQLキャッシングはある程度機能します。まだアップグレードしていない場合は、SSDドライブにアップグレードするのが理想的です。
  • FastCGIキャッシングについて聞いたことがありません。動的ページのキャッシュを静的と呼んでいますか?

正直なところ、できる限りすべてを調整した場合は、ハードウェアのアップグレードを検討します。時間があれば、HipHop( https://github.com/facebook/hiphop-php/wiki )のようなFacebookの調査を調べてください。彼らは、高速読み込みの動的ページを作成するためのいくつかの驚くべき研究開発を行いました。

頑張ってください!

5
Jason

MySQLのクエリキャッシュには注意してください。グローバルロックを使用するため、アクティビティが多すぎると、定期的にデッドロックが発生します。クエリキャッシュは、まったく同じのクエリにのみ役立ちます。クエリが多数ある場合は、アプリケーションレベルでは実行しません。キャッシュ権。

パフォーマンスに取り組むための最初のステップは、常にプロファイルを作成することです。直感ベースの最適化は、時間を無駄にするための本当に良い方法です。

職場では、データストアとして Graphite を使用し、プライマリデータとして StatsD および pipe-to-graphite の修正バージョンを使用しています-送信メソッド。これらのツールはどちらもデータの送信を非常に簡単にし、Graphiteには多数の分析ツールがあります。

たとえば、 パイプからグラファイトへのワニススクリプト を使用して、varnishstatsからすべての統計を取得します。これにより、次のように、Graphiteでヒット/ミスグラフを簡単に作成できます。

Varnish hit-percentage graph

Memcachedでも同じことができ、独自のアプリケーションにフックを追加して記録することができます...まあ、何でもすべてです!

xhprofYSlow などの単一ページの分析ツールも便利です。

指標を取得したら、何に取り組むべきかがわかるだけでなく、完了したら改善を測定できるようになります。誰もが検証が好きです!

ワニスの特別な機能が必要ない場合は、それを削除して nginxのfastcgi_cache を使用できます。ただし、proxy_cacheとは逆に、セットアップ全体で持つことができるcache_zoneは1つだけであることに注意してください。

多分あなたのセットアップは少し過度に最適化されています...私はnginxかニスだけを使うことを考えます。

memcacheに関しては、1秒あたりのリクエスト数によっては、memcが実際に向上する可能性がありますが、場合によっては必要ない場合もあります。優れたフロントサイドキャッシュがある場合は、memcacheを有効にする必要はありませんが、YMMVを有効にする必要があります。私が理解していること:あなたは頻繁に変更されたページを配信しますよね?

私は常に次の方法で最適化しようとします:

  1. 可能であれば、アプリケーションスタック->フロントエンド(nginx/varnish)キャッシュと静的サーバーによるリクエストのインターセプトによってリクエストが応答されないようにしてください
  2. phpの場合は、APCのようなオペコードキャッシュを使用します
  3. データベースを調整する
  4. システムを監視します(load、mem、ram、netio、hdio、netconns、netconns:http、site_stats)
  5. チューニングを繰り返す