|
| Дата |
|
USD/RUB | 90.7493 | BTC/USD | 69952.8475 |
|
|
|
Скрипты, программы и технические решения Обсуждаем скрипты, программы и новые технологии. |
28.08.2015, 07:27
|
#1
|
автоматизирую интернеты
Регистрация: 05.07.2009
Адрес: chesser.ru
Сообщений: 3,362
Бабло: $470735
|
Nginx в качестве TDS
TDS - система распределения трафка, внутри которой можно настроить условия (схемы), по которым пришедший на сервер http-клиент (юзер) перенаправляется на тот или иной URL.
Как происходит перенаправление
Юзер попадает на TDS-url, т.е. браузер юзера запрашивает у TDS-сервера какой-то адрес, TDS "думает" и выдает ответ...и тут возможны варианты:
1) сервер в поле "статус ответа" сразу "говорит": 301 Moved Permanently и в заголовке ответа Location указан URL, на который нужно следовать далее. Большинство http-клиентов (браузеров) видя такое, сразу же проследуют по этому новому URL и, таким образом, юзер оказывается на новом адресе. Это самый популярный способ редиректа.
2) сервер отдает html-страничку со статусом 200 OK, т.е. как-будто обычная html-страница, но в ее коде размещен meta-тег, увидя который, браузер также должен будет сделать редирект. Еще, можно передавать js-код, который будет редиректить куда надо. Тут хочется отметить, что этим способом TDS-сервер отдает не прямое указание на редирект, а какой-то код/текст/html, который умеет воздействовать на клиентский браузер.
Таким образом, на сервер с TDS приходит юзер, которому сервер отдает ответ либо сразу с редиректом, либо с небольшим кодом, который подействует на браузер и тот также выполнит редирект. Вся суть в "сервер отдает ответ"...или даже так: " веб-сервер отдает ответ с редиректом".
Для того, чтобы веб-сервер отдавал нужные ответы, его нужно правильно настроить!
Выбираем веб-сервер
Апач - говно, остается nginx
Раз выбрали nginx, то нужно описать его требования и возможности:
- про nginx есть такая картинка от 2011 года. 60000 запросов (или редиректов) в секунду...в секунду, КАРЛ! Хотя, само число сейчас уже больше, но при организации ТДС можно ориентироваться примерно на этот порядок, либо вообще забыть о каких-либо проблемах с производительностью (если не думать о логах и статистике) и все это на VPS за $10-20;
- для использования nginx в качестве TDS он должен быть установлен на сервере и у вас должен быть root-доступ к серверу, т.е. виртуальные-хостинги не подходят - нужен либо дедик, либо vps/vds/cloud;
- для работы nginx-tds нужно написать правила редиректов, либо заинклудить в nginx-конфиг уже написанные, заранее припасенные правила;
- для составления правил nginx использует свой простой и понятный язык (DSL). В нем есть регескпы, if-ы, переменные и другие известные всем языковые конструкции, но многого чего нет и поэтому реализация некоторых вещей выглядит нелепо, но скорость работы при этом очень приятная. Конфиг файл nginx обычно называется nginx.conf и лежит где-то на сервере в папке /etc/nginx/, остальные файлы в него инклудятся;
- к nginx есть куча модулей на все случаи жизни;
- при организации ТДС проблема будет со статистикой, т.к. nginx может только писать логи, а их анализ и красивое представление в виде табличек - это все не к нему. Анализировать их можно каким-то готовым софтом, либо самим написать что-то простенькое, либо неанализировать совсем, т.к. это не всегда нужно;
Часто можно слышать: "У меня нет такого объема трафа, мне nginx не нужен"
Отвечаю: траф - это не только те уники, которые редиректятся и приносят прибыль с партнерок. Траф - это еще и боты, доля которых может занимать 99% трафика на сервере. Если вы делите траф на ботов и не ботов, чтобы редиректить только юзеров, то nginx может помочь определить где бот, а где не бот. По это теме был топик тут.
Как пользоваться
Сам редирект обычно выполняется директивой return
выглядит как-то так:
PHP код:
server { # ...... # тут будут какие-то настройки вирт.сервера, а сам редирект вот
# редирект на первую схему http://tds.com/schema1 location /shema1 { return 301 http://partnerka.com/aff.php?aff_id=16357; }
# редирект на вторую схему http://tds.com/schema2 location /shema2 { return 301 http://partner12.com/aff.php?aff_id=6666; }
# или например firefox на один url, а chrome на другой location /goffchrome { if ($http_user_agent ~* chrome) { return 301 http://prtnerka11111.com/aff.php?aff_id=6666; } if ($http_user_agent ~* firefox) { return 301 http://prtnerka22222.com/aff.php?aff_id=6666; } }
# если мы хотим сделать редирект с помощью js или meta # то создаем файл redirect.html , в котором сохраняем соответсвующий код редиректа # а с помощью nginx просто отдаем этот файл...например, только для RU
location /goru { if ($geoip_country_code = RU) { try_files /redirect.html =404; } } }
Предлагаю в этом топике спрашивать или делиться своими решениями по настройке nginx в качестве системы управления трафиком.
Всем nginx
Последний раз редактировалось chesser; 28.08.2015 в 07:41.
|
|
|
28.08.2015, 10:14
|
#2
|
автоматизирую интернеты
Регистрация: 05.07.2009
Адрес: chesser.ru
Сообщений: 3,362
Бабло: $470735
ТС -->
|
ТС
Рассмотрим типовую задачу, которую удобно решать с помощью nginx.
Дано: несколько(или много) серверов, на которых работают сайты или доры или что-то подобное, куда приходит трафик: много трафика и много ботов. Код сайтов можно менять, но не очень хочется делать это часто.
Нужно: организовать анализ трафика и в зависимости от его характеристик делать (или не делать) редиректы. Система должна быть готова к быстрым изменениям условий без перелопачивания всех сайтов.
Решение: решение будет схематичное и абстрактное, но, кому интересно, тот уловит суть. В коде каждого сайта вписываем такой код, который будет исполнятся синхронно для каждого пришедшего на сайт юзера:
PHP код:
$tds_url = 'http://tds.com/getdata?' . 'ip=' . $_SERVER['REMOTE_ADDR'] . 'ua='. $_SERVER['HTTP_USER_AGENT'] . 'referer=' . $_SERVER['HTTP_REFERER'] . 'lang=' . $_SERVER['HTTP_ACCEPT_LANGUAGE'] . 'uri=' . $_SERVER['REQUEST_URI'] . 'host=' . $_SERVER['HTTP_HOST'] 'param7=' . $param7 . 'param8=' . $param8 . 'param9=' . $param9 ; // и тд
$res = file_get_contents(urlencode($tds_url)); // тут правильнее рассматривать хедеры ответа сервера отдельно от тела ответа, но для упрощения буду быдлокодить
switch ($res) {
case FALSE: // TDS не отвечает, поэтому ничего не меняем в работе сайта break;
case 'good_bot': // текущий уник - это поисковый бот echo func_get_doorway_content(); exit; break;
case 'assessor': // не бот, но редиректить нельзя, поэтому тоже оставляем контент без изменения break;
case 'bad_bot': // не будем тратить ресурсы сервера на спам ботов, сразу остановим работу скрипта сайта exit; break;
default: // иначе тдс-сервер вернул урл для редиректа header("Location: $res", TRUE, 301); exit; break; }
Конфиг nginx на TDS-сервере:
PHP код:
server { # ......... # предположим, на сервере с тдс заготовлен файл со списком IP, принадлежащих гуглу или другим поисковикам - white_ips.txt # задаем переменную $is_good_ip, в которой будет либо 0, либо 1, # в зависимости от переданного ip адреса и наличия его в базе
map $arg_ip $is_good_ip { default 0; include white_ips.txt; # формат каждой строки файла: 123.123.123.123 1; }
# проверка UA удобнее делать также с помощью map # но для демонстрации, сделаем через if if ($arg_ua ~* "(google|yandex|bing|...)" ) { set $is_bot_ua 1; }
# например, весь рунет льем на рунет-партнерку, а остальных в зависимости от сайта на другие партнерки # сопоставим список схем с хостами и в переменной $shema получим номер "схемы"
map $arg_host $shema { default 0; 'site1.com' 1; 'site1121.com' 1; 'site123231.com' 3; 'site123231.com' 1; 'site32kjkj.com' 2; 'site311kj.com' 8; }
# для определения гео юзера используем, например, такой способ www.stableit.ru/2010/06/geo-nginx-0765.html # или берем $arg_lang
geo $arg_ip $geo { default 0; include ip2country.txt }
# ответ сервера
location /getdata {
# в nginx нельзя делать вложенные или "мульти" if-ы, # поэтому делаем сравнение через промежуточную переменную # такой способ удобен, когда параметров, участвующих в if, много
set $bot "$is_good_ip$is_bot_ua";
if ($bot = "11") { # поисковый бот return 200 "good_bot"; }
if ($bot = "01") { # спам-бот или нежелательный бот return 200 "bad_bot"; }
if ($bot = "10") { # юзер, но зашедший с IP компании гугл - ассессор access_log assessor_ip.txt assessor_ip; return 200 "assessor"; }
# остался случай, когда $bot = "00", т.е. обычный юзер
if ($geo = RU) { return 200 'http://ruaff.com?affid=3243654'; }
if ($shema = 0) { # дефолтный аут return 200 'http://fallback.com?affid=3243654'; }
if ($shema = 1) { return 200 'http://aff1.com?affid=3243654'; } if ($shema = 2) { return 200 'http://aff2.com?affid=3243654'; } if ($shema = 3) { return 200 'http://aff3.com?affid=3243654'; } if ($shema = 8) { return 200 'http://aff8.com?affid=3243654'; } } }
в показательных целях в коде выше логируются IP-адреса "асессоров", для этого в секции http {} необходимо задать нужный формат, т.е. добавить такую строку:
http { ...... log_format assessor_ip '$remote_addr'; ...... }
таким образом можно создавать любые форматы логов и логировать любые параметры любых юзеров.
задачу высосал из пальца и писал без проверки синтаксиса, поэтому
UPD: этот код будет исполнятся очень быстро - до 100к запросов в секунду...первое узкое горлышко тут скорее всего будет лог ip ассесоров на диск, хотя и там можно будет настроить большой буффер.
Последний раз редактировалось chesser; 28.08.2015 в 10:26.
|
|
|
28.08.2015, 10:30
|
#3
|
Senior Member
Регистрация: 23.07.2008
Адрес: Kiev
Сообщений: 398
Бабло: $81715
|
Чето мне подсказывает что люди с подобным количеством трафа давно решили эту проблему. А у других она впринципе не возникнет.
|
|
|
28.08.2015, 10:53
|
#4
|
автоматизирую интернеты
Регистрация: 05.07.2009
Адрес: chesser.ru
Сообщений: 3,362
Бабло: $470735
ТС -->
|
ТС
Цитата:
Сообщение от oledj
Чето мне подсказывает что люди
|
во-первых, оно у тебя ошибается, т.к. не все те люди решили свои задачи, а большинство продолжает мучиться и ныть с платными тдс.
во-вторых, как я и писал выше - не важно, сколько трафа. Когда используешь nginx, просто забудь про проблемы с производительностью и все: много-мало - не важно. Если мало сейчас, завтра будет много и наоборот.
в-третьих, тут компромисс между гибкостью и производительностью, в отличии от платных тдс или реализации редиректов на интерпретируемых серверных ЯПах.
чтобы описанное выше выглядело по-человечески и начало обладать какими-то маркетинговыми свойствами, нужно сделать веб-интерфейс, у которого будет всего 1 или 2 задачи:
1) админ тдс понажимает удобные кнопочки управления, выполненные на каком-нибудь bootstrap + js и нажмет кнопку "применить", после чего сгенерится код по типу того, что я писал руками выше. Код отправится на сервер и сохранится в файл(ы), которые потом подхватятся nginx-ом (через nginx reload по крону)
2) генерация красивых табличек со статистикой
кто такую штуку запилит?
проект был бы интересным, но у меня нет столько времени
|
|
|
28.08.2015, 10:59
|
#5
|
Senior Medved
Регистрация: 15.06.2008
Сообщений: 4,146
Бабло: $22479945
|
А функционал возможен любой? Например если урл содержит слово то его туда, если реферер такой то сюда и тп.
|
|
|
28.08.2015, 11:18
|
#6
|
Senior Member
Регистрация: 23.07.2008
Адрес: Kiev
Сообщений: 398
Бабло: $81715
|
Ну так вся проблема будет в бд статистики. То что nginx может редиректнуть 100к запросов в секунду ( опа а это 8млрд в сутки, а таким трафом я так понимаю не обладает даже гугл ) - так вот это прекрасно. Но это всё другой мир, в и этом мире эти проблемы решены.
Написал бы как базу данных спроектировать для 10к запросов в секунду - это есть 9м и более приземленно. И такую чтобы статистика была максимально дробна и любые отчеты отдавались за 0.1 секунду хотя бы
---
упс 10к в секунду это 864 миллиона, 100 в секунду самое то, на 8.6 миллионов.
Последний раз редактировалось oledj; 28.08.2015 в 11:24.
|
|
|
28.08.2015, 11:19
|
#7
|
автоматизирую интернеты
Регистрация: 05.07.2009
Адрес: chesser.ru
Сообщений: 3,362
Бабло: $470735
ТС -->
|
ТС
Цитата:
Сообщение от dady
А функционал возможен любой? Например если урл содержит слово то его туда, если реферер такой то сюда и тп.
|
сразу отвечу - да, но если распишешь на примере, я тебе напишу кусок конфиг под это
|
|
|
28.08.2015, 11:24
|
#8
|
Senior Medved
Регистрация: 15.06.2008
Сообщений: 4,146
Бабло: $22479945
|
Ну например если страна us и и реферер viagra , то http://ap1.com, если реферер другой то http://ap2.com
|
|
|
28.08.2015, 11:27
|
#9
|
автоматизирую интернеты
Регистрация: 05.07.2009
Адрес: chesser.ru
Сообщений: 3,362
Бабло: $470735
ТС -->
|
ТС
Цитата:
Сообщение от dady
Ну например
|
уник сам приходит на сервер с tds, или через запрос из скрипта сайта?
|
|
|
28.08.2015, 11:27
|
#10
|
Ебланнед
Регистрация: 17.08.2015
Сообщений: 190
Бабло: $25250
|
Цитата:
Сообщение от oledj
Написал бы как базу данных спроектировать для 10к запросов в секунду - это есть 9м и более приземленно. И такую чтобы статистика была максимально дробна и любые отчеты отдавались за 0.1 секунду хотя бы
|
легко
только тут одной БД не обойдёшься, комплексно надо
|
|
|
Опции темы |
|
Опции просмотра |
Линейный вид
|
|