2011-07-08 32 views
12

我正在創建一個基於金字塔框架的移動服務。因爲它是移動設備,所有減少帶寬使用都是好事。我正在考慮gzipping所有流量,甚至是動態HTML頁面。用金字塔Gzipping所有HTTP流量

什麼樣的勾子金字塔框架爲此提供了什麼?還是有WSGI中間件的任務?我想在Python級別上繼續執行此操作,而不是Nginx/Apache,所以我可以更好地統計gzip帶來的好處。

回答

23

首先,我要強調的是,你應該這樣做web服務器級別(nginx的或apache)。有幾個方面的原因:

  1. 性能 - 如果你這樣做在Python您使用的線程可以處理請求做CPU密集型壓縮之一。這比讓優化的Web服務器處理它效率低。

  2. 阻塞 - 大多數GZip中間件會阻止您的響應,緩衝身體,以便它可以壓縮整個響應。這是一個巨大的問題,如果您試圖將任何響應流回到客戶端,因爲它會被中間件攔截。這實際上違反了PEP333,即WSGI規範。

考慮到所有這些,在開發過程中至少爲了調試目的,在Python中執行它可能是有意義的。

既然你已經在使用金字塔,那麼你已經安裝了粘貼。因此,你可以簡單地添加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像這樣:

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 

現在,我得到日誌條目,如:

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" 

,我可以分析我的心臟的內容。

+0

很好的例子,謝謝你的 –