Распаковка всего HTTP-трафика с помощью Pyramid - PullRequest
12 голосов
/ 08 июля 2011

Я создаю мобильный сервис на основе фреймворка Pyramid.Потому что это мобильный телефон, и все, что позволяет сократить использование полосы пропускания, является плюсом.Я подумываю о сжатии всего трафика, даже динамических HTML-страниц.

Какие типы хуков Pyramid предоставляет для этого?Или для этой задачи есть промежуточное программное обеспечение WSGI?Я хотел бы сделать это еще на уровне Python, а не Nginx / Apache, поэтому я могу лучше отслеживать, сколько gzip приносит выгоды.

Ответы [ 3 ]

24 голосов
/ 08 июля 2011

Прежде всего, я должен подчеркнуть, что вы должны делать это на уровне веб-сервера (nginx или apache).Для этого есть несколько причин:

  1. Производительность - если вы делаете это в Python, вы используете один из ваших потоков, который может обрабатывать запросы на сжатие, интенсивно использующее процессор.Это гораздо менее эффективно, чем позволить оптимизированному веб-серверу обрабатывать его.

  2. Блокировка - большинство промежуточного программного обеспечения GZip блокирует ваши ответы, буферизуя тело, чтобы оно могло сжать весь ответ.Это огромная проблема, если вы пытаетесь перенаправить любой ответ обратно клиенту, потому что он попадет в промежуточное ПО.На самом деле это нарушение PEP333, спецификации WSGI.

Учитывая все это, возможно, имеет смысл сделать это на Python хотя бы для целей отладки во время разработки.

Поскольку вы уже используете Pyramid, значит, у вас установлен Paste.Таким образом, вы можете просто добавить paste.gzipper.GzipMiddleware в конвейер вашего приложения следующим образом:

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

[pipeline:main]
pipeline =
    gzip
    app

Очевидно, что если вы не хотите менять уровень сжатия по умолчанию на 6, вы можете просто добавить egg:Paste#gzipв конвейер вместо настройки фильтра и присвоения ему произвольного имени (gzip).

5 голосов
/ 09 июля 2011

Вы все еще можете получить статистику сжатия по запросу с 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"

, которые я могу анализировать до глубины души.

1 голос
/ 08 июля 2011

Вот несколько вариантов на уровне WSGI:

...