модуль Secure Link

Для nginx есть модуль Secure Link, который позволяет генерить временные ссылки, которые истекают со временем. Я делал именно с ним продажу небольших файлов: купили, пришло подтверждение от платёжной системы, на почту отправилась специальная ссылка, действующая час с текущего момента.

Защита моих ссылок с привязкой по IP

Самый оптимальный вариан это раздача киношек сервером NginX, для защиты контента его нужно немного настроить, поэтому нужер root доступ к серверу, хотя это может быть и VPS конечно

Решение данной задачи с помощью nginx реализуется просто и очень эффективно. В конфиг nginx в блок server для нашего домена добавляем:
location / {
rewrite ^/video/(w+)/(.+)$ /get.php?hash=&filename= last;
...
}
location /video {
internal;
flv;
}

К сожалению форум выстригает некоторые символы, вообщем в строке реврайта
get.php?hash=«знак доллара»1&filename=«знак доллара»2 last;
«знак доллара» это "$"

Первый локейшен это настройка реврайта NginX, а второй это папка от корня вашего домена в которой лежит видео, то есть вы закрываете внешний доступ к этой папке, теперь NginX будет отдавать файлы с этой папки только по внутреннему запросу (internal)

В корень домена ложим файлик get.php это обработчик flv запросов
Тут есть небольшая проблемка, для псевдостреминга(«перемотки»), плеер приклепляет к ссылке смещение в байтах через знак ?, регулярка в реврайте конфига NginX не может выбрать весь GET запрос, вернее может, но только до знака "?", поэтому я малость извратилась и вставила $url=explode(’?’,$url);…
неуклюже конечно, но зато перемотка в плеере работает
Вот текст обработчика flv запросов get.php
$hash =$_GET['hash'];
$filename = $_GET['filename'];
$ip = md5(getenv(”REMOTE_ADDR”).”key”);
if ($hash == $ip){
$url=$_SERVER['REQUEST_URI'];
$url=explode(’?',$url);
$url=$url[1];
if (isset($url)){$filename .=’?’.$url;}
header(”Content-Type: video/x-flv”);
header(”X-Accel-Redirect:/video/”.$filename);
die();
}
echo “фигу вам! :)”; //Ну или можно клипчик с фигой показать, для наглядности

Например у вас есть файл по адресу
http://flv.site.ru/video/video.flv

дабавляете в ссылку хеш из ip юзера и секретного слова
$ip = md5(getenv(”REMOTE_ADDR”).”key”);
и получаете ссылку уже вида
http://flv.site.ru/video/922f3b5fcb227cfae135299e786edd82/video.flv

когда плеер запросит ссылку, она попадёт к nginx, если вы всё выставили как написанно, то nginx передаст ссылку обработчику, который проверит хешь, если всё правильно то кажем киношку, если ip не совпадает, то кажем фигу!
В принципе в хеше можно что угодно закодировать, например добавить к хешу два байта время жизни ссылки в минутах, ну или девичью фамилию бабушки посетителя проверить можно :))) шутка!
На самом деле обработчику конечно много чего можно поручить, например можно манипулировать скоростями отдачи файла, типа ВИПу на максимальной скорости, остальных бреем до 50 кбайт, докачки, псевдостреминг, мультисесии, ну естествено и NginX нужно настроить под нужные задачи. У меня файлы залиты на раздельные зеркальные диски и обработчик разруливает раздачу файлов так чтобы нагрузка на дисках была примерно одинаковая…

у меня почему то отказывался работать второй локейшен, пока не прописали в нем root путь
root /home/support/www/flv.site.ru;

Ограничение числа подключений с одного IP-адреса в Nginx

Используйте ngx_http_limit_zone_module следующим образом прописав директив limit_zone и limit_conn в конфигурационном файле nginx.conf
http {
    include       mime.types;
    default_type  application/octet-stream;
    
    limit_zone   one  $binary_remote_addr  4m;
    limit_conn   one  8;
...

Тем самым мы ограничили число подключений в 8 одновременных коннектов с одного IP-адреса и выделили под это кэш (где будут запоминаться адреса, а в последствии высвобождаться) размером в 4 мегабайта.