Własny (względnie bezpieczny) serwer streamingu wideo FLV

Jakiś czas temu miałem przyjemność pracować nad jednym z większych serwisów oferujących streaming video. Początkowo temat wydawał się dość prosty. Strona z filmikiem, jakiś flash player i plik na dysku. Po pewnym czasie dostaliśmy jednak polecenie zabezpieczenia serwera przed pobieraniem plików przez niezalogowane osoby, a dodatkowo wdrożenia pełnego streamu z przycięciem pasma per film, aby serwer wyrabiał na łączu. Oczywiście Apache na dzień dobry wyleciał i przywitaliśmy się ładnie z Nginx’em.

Pierwsza część czyli zabezpieczenie serwera. Z pomocą przyszedł nam HttpSecureLinkModule.
Przy drugiej części zadania pomógł nam HttpFlvModule.
BTW: Dla zainteresowanych istnieje również moduł pod MP4: ngx_http_mp4_module

Po stronie serwera wystarczyło przygotować następującą rulke:

location /cat_movies {
secure_link $arg_st,$arg_e; #określa argumenty: tutaj hash md5 i czas
secure_link_md5 MOJE_TRUDNE_HASLO$uri$arg_e; #tutaj budujemy hash poprzez sklejenie hasła, URLa i daty ważności linka, oczywiście na końcu wszystko hashujemy

# Jeśli hash jest błędny rzucamy userowi 403ke
if ($secure_link = „”) {
return 403;
}

# Jeśli lokalny czas jest błędny również rzucamy 403ke
if ($secure_link = „0”) {
return 403;
}

root /home/movies/cats; # Określamy katalog domowy plików filmików
flv; # Określamy typ plików z filmami
limit_rate 120k; # Określamy maksymalny transfer dla pojedynczego pliku – pamiętajmy, żeby nie dać za małego, bo będzie przycinał się userowi!

# Na koniec dodajemy nagłówki
add_header Cache-Control ‚private, max-age=0, must-revalidate’;
add_header Strict-Transport-Security ‚max-age=16070400; includeSubdomains’;
}

Po stronie skryptu php linki generujemy w następujący sposób:

<?php
$expire = time() + 18000;
$md5 = base64_encode(md5('MOJE_TRUDNE_HASLO/cat_movies/kotek.flv' . $expire, true));
$md5 = strtr($md5, '+/', '-_');
$md5 = str_replace('=', '', $md5);
echo 'http://serwer-filmikow.pl/cat_movies/kotek.flv' . '?st=' . $md5 . '&e=' . $expire;
?>

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *