"Улучшаем" интернет-трафик. Сжимаем, модифицируем, экономим. Простой прокси сервер на Perl
     
 
Бланки
для
предпринимателей
Для Вас
на сайте:

blankinew.narod.ru
 
     
       
   

"Улучшаем" интернет-трафик
Сжимаем, модифицируем, экономим
Простой прокси сервер на Perl

Все современные браузеры поддерживают получение сжатых (архивированных, запакованных) данных и при получении автоматически их распаковывают. Это особенно приятно, когда используется медленный канал связи с интернет, да и еще оплата берется за трафик, как например, при связи через сотовый телефон. Да и в случае более быстрого канала связи, через ADSL например, как посмотришь на количество скачанных мегабайтов… Грустное зрелище.
Тем не менее мизерная часть сайтов передает сжатые данные, зато страницы многих сайтов по размеру, мягко скажем, неоправданно большие.
Предлагаю простое, пусть и хорошо известное решение – мааленькую программу, сжимающую трафик, с подробным описанием, которую каждый сможет установить и приспособить для себя.
В интернете приличное количество подобных сервисов, однако они либо платные либо «недостаточно быстрые». А описание подобных программ – на простом английском языке.
Суть работы и использования предлагаемого прокси сервера:
У себя на хостинге (если нет – купите, это ~ 1 $ в мес.) располагаем эту программу, запускаем, в настройках своего браузера прописываем использование этого прокси и все.
Программа состоит из сервера и своего браузера. Сервер постоянно находится в ожидании запроса от Вашего браузера, получив его, без изменений передает через свой (серверный) браузер на запрашиваемую страницу сайта. Серверный браузер получает страницу сайта, тут мы ее при необходимости сжимаем, и сервер передает сжатую страницу (и признак сжатия) Вашему браузеру, который ее распаковывает. Если Вы скачиваете текстовый файл, файл Word, Excel и вообще то, что можно сжать, то происходит все то же самое – Вы получаете сжатый файл, который Ваш браузер распаковывает при получении.
Таким образом и запрос Вашего браузера и ответ на него находятся в наших руках. Что можно с ними сделать?
С запросом:
Не пропускать запросы к рекламным баннерам или к сайтам с ненужным содержанием.
Изменить значение поля Accept, указав, что наш браузер не поддерживает флэш (flash) рисунки, хотя есть некоторые сайты, целиком сделанные на флэш (и попадаются красивые). Но в основном, конечно, флэш технологии используются для создания увесистых рекламных баннеров.
Вообще можно изменить любое поле запроса, например, «заменив» Ваш браузер на SuperPuper/v.9.14 Platinum. Можно заменить поле «Referer», «Cookie» и т.д., сделав полностью анонимный прокси сервер. Но создатель сайта может передавать данные о Вашем компьютере и в теле запроса, зашифровав их бесчисленными способами. Существуют и другие методы. Анонимность в сети, на мой взгляд, существует до тех пор, пока "анонимный", как Неуловимый Джо, нафиг никому не нужен.
С ответом:
Все тоже самое – заменить значение любого поля. Но поскольку теперь к нам попадает некоторое содержание (страница сайта, рисунок), то мы для начала решим, есть ли смысл его сжимать. Не будем сжимать, если:
Поле Content-Encoding: непустое, например, gzip.
Это все уже запакованные файлы, а также файлы рисунков, которые уже также сжаты. Т.е. судим по расширению (типу) полученного файла. Список приведен в программе, наверняка Вы дополните его.
Размер полученного файла мал. Например файл таблицы стилей или Java-Script. На мой взгляд, файлы размером меньшим, чем несколько килобайт сжимать не стоит.
Все остальное сожмем. И добавим признак сжатых данных, т.е. Content-Encoding: gzip.
По наблюдениям степень сжатия колеблется в зависимости от содержания и типа данных от 2 до 10 раз. Текстовые файлы и файлы html в пределах от 4 до 10, обычно 5 – 7 раз. Учитывая, что на страницах сайтов имеются еще и рисунки, которые мы не сжимаем, то общее сжатие обычно в пределах от 2 до 5 раз. Соответственно время передачи данных меньшего размера уменьшается во столько же раз. А время обработки данных в десятки и сотни раз меньше времени передачи, так что оно не замечается.
Содержание перед сжатием можно проанализировать и:
Не пропускать рисунки большего размера, чем нами заданный.
Оставить только текстовое содержимое.
Не пропускать Java-Script и Java.
Но все это можно сделать и в настройках своего браузера.
Добавлять что-либо к содержимому страницы, например, кнопки управления Прокси Сервером или текущий курс акций, валюты, денежку Яндекса и т.д. и т.п.
Попутно замечу, что IP у Вас будет такой же, как у Вашего хостинга.
Наверное идеальный хостинг для такой программы – у Вашего провайдера (если это возможно). А я, приманившись большим количеством установленных модулей Perl, неосмотрительно выбрал заокеанский хостинг. В результате запросы и ответы шлялись через океан, что не быстро.
Сама программа:
#!/usr/bin/perl

use HTTP::Daemon;
use LWP::UserAgent;
use Compress::Zlib;
use CGI::Carp qw(fatalsToBrowser);

# Ниже список расширений (типов) файлов, которые мы не сжимаем
my @ext = qw(x-gtar x-gzip x-tar zip image zip z gz tz taz tgz lzh arj arc tar cab wmz yfs wsz exe uu xxe bhx b64 hqx mim);

# Номер порта нашего сервера, его мы указываем в настройках домашнего браузера
my $port = 8080;

# Если браузер внезапно отключится
$SIG{PIPE} = 'IGNORE';

# Создаем объект сервера
my $server = HTTP::Daemon->new( LocalPort => $port ) or
die "Can't start server ($@)" unless defined $server;

# Создаем объект удаленного (серверного) браузера
my $ua = LWP::UserAgent->new;

# Ждем подключения нашего (домашнего) браузера
while (my $conn = $server->accept) {

# Дождавшись, получаем объект запроса в $request (вот тут мы его можем менять)
while (my $request = $conn->get_request) {
$conn->autoflush;

# Например "сменим" браузер
$request->header(User_Agent => 'SuperPuper/v.9.14 Platinum');

# Перечислим все данные, которые мы можем получать, кроме flash (теперь нам flash не передадут)

$request->header(Accept =>
"text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,text/css,*/*;q=0.1");

# Посылаем запрос через серверный браузер и получаем объект ответа в $resp
my $resp = $ua->simple_request($request);

# В переменной $c_cont содержание (данные) ответа
my $c_cont = $resp->content;

# Проверяем необходимость сжатия, если сжатие не нужно, тут же отправляем на домашний браузер
if ( $resp->content_encoding || (grep { $_ =~ /$resp->content_type/g } @ext) || length($c_cont) < 3000 ) {
$conn->send_response($resp);
}
else {
# Сжимаем данные
$c_cont_zip = Compress::Zlib::memGzip($c_cont);

# Устанавливаем сжатые данные в объект ответа
$resp->content($c_cont_zip);

# Устанавливаем признак сжатия в объект ответа
$resp->content_encoding('gzip');

# Посылаем ответ домашнему браузеру
$conn->send_response($resp);
}
}
print STDERR "Close: ", $conn->reason, "\n";
$conn->close;
undef $conn;
}
Теперь заблокируем рекламу и обращения к счетчикам низкокачественной статистики, сильно замедляющей загрузку страниц. Для чего в начале программы добавим:
use HTTP::Response;

список базовых url блокируемых ресурсов через пробел, например (все данные условны):

my @ext_url = qw(reklame.skazhem.net zloi-virus.com banner.von.ru tormoz.stat.ru);

и наш ответ ненужным данным:

$block = HTTP::Response->new( "204", "No Content" );

А в основной части программы, после получения запроса от "домашнего" браузера, проверим url запрашиваемого ресурса на совпадение со списком блокировки:
if (grep { $request->uri =~ /\Q$_/g } @ext_url) {

И в случае совпадения пошлем свой ответ "домашнему" браузеру:
$conn->send_response($block);
next;
}
Можно разместить такой прокси сервер и на домашнем компьютере для блокировки лишних данных (сжатие данных при этом бессмысленно), для автозаполнения форм и для записи запросов и ответов в лог файл. Тогда можно проще контролировать правильность ответов собственных сайтов, что важно в частности и для поисковых роботов, со всеми вытекающими.
Для этого в начале программы откроем (создадим) лог файл:
open(PH, ">>", "log.txt") or die "can't open 'log.txt': $!";

а в основной части программы, после получения запроса и ответа соответственно:

print PH $request->as_string, "\n";
print PH $resp->as_string, "\n";

Можно разместить прокси сервер и на домашнем и на удаленном компьютере, связав их в цепочку. Тогда зашифровав принимаемые и передаваемые данные, получим SSL туннель.
Программа рассчитана на подключение одного браузера, но можно ответвлять процесс для каждого подключения (браузера). Тогда при большом количестве подключений нетрудно занять всю оперативную память. Perl не накладывает никаких ограничений, но владельцы других сайтов, расположенных на этом же хостинге, скорее всего будут возражать.
В таком случае лучше всего заранее организовать пул разветвленных процессов (потомков).
На хостинге можно поместить программу в папку ..cgi-bin/proxy, например, http://blankinew.narod.ru/cgi-bin/proxy/proxy-server.pl, запаролировав папку proxy и установив соответствующие права доступа к ней. Запустить скрипт из браузера можно обратившись к нему по этому же адресу. Скрипт будет запущен, несмотря на сообщение об ошибке. В браузере надо прописать использование прокси, например blankinew.narod.ru и порт, указанный в прокси.
Тема настолько обширна, что я чуть английский не выучил, вникая во все это. И к сожалению, обо всем не расскажешь.
Один из недостатков программы - отсутствие авторизации, но можно запаролировать директорию (папку) в которую помещена программа.

Скачать программу proxy-server.pl (Прокси Сервер) 1,14 КВ

При перепечатке этого материала или его части, ссылка на автора и сайт обязательна

   
Дмитрий Рассанов
2014