2011-07-08 3 views
12

私はPyramidフレームワークに基づいてモバイルサービスを作成しています。モバイルなので、帯域幅の使用を減らすためにすべてがプラスです。私はすべてのトラフィックを、ダイナミックHTMLページをgzippingを検討しています。すべてのHTTPトラフィックをPyramidでGZIPにする

どのような種類のフックですか?ピラミッドのフレームワークはこれを提供していますか?または、タスク用のWSGIミドルウェアがありますか?私はPythonレベルでこれをやっていますが、Nginx/Apacheではないので、gzipがどれくらいの利益をもたらすのかをよりよく統計できます。ここで

答えて

23

まず、私はあなたがウェブサーバレベル(nginxの上でこれを行う必要があることを強調すべきですまたはapache)。これにはいくつかの理由があります。

  1. パフォーマンス - あなたはPythonでこれを行う場合は、CPU集約型の圧縮を行うための要求を処理することができ、あなたのスレッドのいずれかを使用しています。これは、最適化されたWebサーバーでの処理よりも効率が悪い方法です。

  2. ブロッキング - ほとんどのGZipミドルウェアは応答をブロックし、応答全体を圧縮できるように本文をバッファリングします。ミドルウェアで捕捉されるため、応答をクライアントにストリーミングしようとすると、これはの巨大なの問題です。これは実際にはWSGI仕様であるPEP333に違反しています。

これをすべて念頭に置いて、開発中に少なくともデバッグ目的でPythonで行うのが理にかなっています。

すでにPyramidを使用しているので、[貼り付け]がインストールされています。したがって、あなたは、単にそのようなアプリケーションのパイプラインにpaste.gzipper.GzipMiddlewareを追加することができます。

[filter:gzip] 
use = egg:Paste#gzip 
compress_level = 6 

[pipeline:main] 
pipeline = 
    gzip 
    app 

明らかにあなたが6のデフォルトの圧縮レベルを変更したくない場合は、単にの代わりにパイプラインにegg:Paste#gzipを追加することができますフィルタを設定し、カスタム名(gzip)を与えます。

+2

p.s.可能であればRAW DEFLATEを使用してください(Apacheのmod_deflateはGZIPとGZIPのみを送信します)。 GZIPは、RAW DEFLATEを囲む不要なラッパーです。それは常に大きく、余分なチェックサム計算が必要です。 –

+0

DEFLATEに関する実装上の問題があります:http://stackoverflow.com/a/9856879 –

5

Apacheでリクエストごとの圧縮の統計情報を取得することはできます。私はそうのようなdeflate.logを作成しました:私は私の心のコンテンツを分析することができ

ip domain -/- (-%) "GET /wp-content/uploads/2010/03/favicon.ico HTTP/1.1" 
ip domain 10995/52406 (20%) "GET /2006/07/19/ HTTP/1.0" 
ip domain 1873/7891 (23%) "POST /registration/regForm HTTP/1.1" 

DeflateFilterNote Input instream 
DeflateFilterNote Output outstream 
DeflateFilterNote Ratio ratio 
LogFormat '%a %v %{outstream}n/%{instream}n (%{ratio}n%%) "%r"' deflate 
CustomLog /var/log/httpd/deflate.log deflate 

は今、私のようなログエントリを取得します。

+0

優れた例 –