nginxとmemcachedを使用してWebサイトを最適化した経験はありますか?

StackOverflow https://stackoverflow.com/questions/1010905

質問

Glassfish アプリサーバークラスターで実行されているJava EEベースのWebアプリケーションがあります。着信トラフィックは、主にアプリケーションリソースのXMLベースの表現に対するRESTfulリクエストですが、おそらくトラフィックの5%はJSONまたはXHTML / CSSベースの表現に対するものかもしれません。

現在、クラスター内のGlassfishインスタンス全体に着信トラフィックを分散するロードバランシングソリューションを調査しています。また、memcachedを使用してクラスターをオフロードする方法も検討しています。memcachedは、キーがRESTリソース名(" / user / bob"、" / group / jazzlovers"など)になるメモリ内分散ハッシュマップです。値は対応するXML表現です。

前途有望と思われるアプローチの1つは、1石で両方の鳥を殺し、軽量で高速な nginx HTTPサーバー/リバースプロキシ。 Nginxは、最初にmemcachedでURIを検索して、期限切れになっていないXML表現が既に存在するかどうかを確認することで、各着信要求を処理します。そうでない場合、nginxはリクエストをGlassfishインスタンスの1つに送信します。 nginx memcachedモジュールについては、この短い記事で説明しています。

この方法でnginxとmemcachedを使用した場合の全体的な印象はどうですか?それらについて学ぶのに最も役立つリソースは何ですか?あなたがそれらを試してみて、彼らがあなたの目的に合わなかったなら、なぜそうではなく、代わりに何を使いましたか?

注:ここに関連する質問があります。

更新:後で同じ質問をServerFault.com。そこの答えは、主にnginxの代替案を示唆しています(有用ですが、間接的に)。

役に立ちましたか?

解決

ユーザーへのアップストリーム配信データのアプリケーションサーバーのバンクがあると仮定します。

upstream webservices {
    server 10.0.0.1:80;
    server 10.0.0.2:80;
    server 10.0.0.3:80;
}
server {
    ... default nginx stuff ...
    location /dynamic_content {
          memcached_pass localhost:11211;
          default_type   text/html;
          error_page     404 502 = @dynamic_content_cache_miss;
          set $memcached_key $uri;
    }
    location @dynamic_content_cache_miss {
          proxy_pass http://webservices;
    }

上記のnginx.confスニペットは、 http://example.com/dynamic/ * memcachedサーバーに直接。 memcacheにコンテンツがある場合、アップストリームサーバーにはトラフィックが表示されません。

キャッシュヒットが404または502エラーで失敗した場合(キャッシュにない、またはmemcacheに到達できない場合)、nginxは要求を上流サーバーに渡します。アップストリーム定義には3つのサーバーがあるため、透過的な負荷分散プロキシも取得できます。

唯一の注意点は、バックエンドアプリケーションサーバーがmemcacheのデータを最新の状態に保つことを確認する必要があることです。 nginx + memcached + web.pyを使用して、比較的控えめなハードウェアで毎分数千のリクエストを処理するシンプルで小さなシステムを作成します。

アプリケーションサーバーの一般的な擬似コードは、web.pyの場合のようなものです

class some_page:
     def GET(self):
         output = 'Do normal page generation stuff'
         web_url = web.url().encode('ASCII')
         cache.set(web_url, str(output), seconds_to_cache_content)
         return output

上記のweb.py /疑似コードで覚えておくべき重要なことは、nginxを介してmemcachedからのコンテンツをまったく変更できないことです。 nginxはユニコードではなく単純な文字列を使用しています。 Unicode出力をmemcachedに保存すると、キャッシュされたコンテンツの最初と最後に奇妙な文字が少なくなります。

スポーツ関連のウェブサイトにnginxとmemcachedを使用しています。ここでは、数時間しか続かない大量のトラフィックが発生します。 nginxとmemcachedなしではうまくいきませんでした。 7月4日の最後の大きなスポーツイベント中のサーバー負荷は、上記の変更を実装した後、70%から0.6%に低下しました。お勧めできません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top