Streaming server con Ngnix
Spesso si ha la necessità di affiancare gli strumenti di web conferencing a quelli di streaming. Questo perchè si vuole raggiungere una platea decisamente più vasta e superare le limitazioni che i servizi di video conferenza normalmente offrono. Ecco che se il nostro obiettivo è quello di distribuire il contenuto a centinaia o migliaia di utenti, dobbiamo affiancare la nostra piattaforma, in questo caso BigBlueButton ad un servizi di streaming.
Inoltre, se non vogliamo dipendere dalle regole e limitazioni imposteci dai grandi streaming network, come Facebook, YouTube o Twich, possiamo optare per l’indipendenza offerta da un server di streaming home made con strumenti Open source, ma non per questo meno funzionale. Anzi, vediamo perchè.
Configuriamo nginx con libnginx-mod-rtmp
Il primo step da eseguire è installare il web server Nginx grazie alla seguente direttiva:
# apt install nginx
Successivamente va integrato il modulo per il protocollo RTMP, che nginx offre giù come pacchetto su molti sistemi, nel nostro caso una Ubuntu 20.:
# apt install libnginx-mod-rtmp
Aprite quindi il file di configurazione del server, con l’istruzione nano /etc/nginx/nginx.conf, ed aggiungete le seguenti linee al termine del file:
configurare nginx
rtmp {
server {
listen 1935;
chunk_size 4096;
application live {
live on;
record off;
}
}
}
Per concludere questa prima fase di configurazione, riavviamo il demone di Nginx:
# systemctl restart nginx
Adesso nginx è già pronto a rispondere come servizio RTMP su porta 1935 e ritrasmettere in streaming il contenuto inviato da una fonte remota. Si può scegliere di inviare il contenuto da un sistema qualsiasi dotato di un programma che permetta di farlo, come il noto OBS (Open Braodcasting Studio), nel nostro caso, useremo una sessione di BigBluButton, che come vedremno tra breve non solo permette di inviare streaming verso YouTube e Facebook ma anche verso normali servizi RTMP:
Configuriamo BigBlueButton per lo streaming verso un server RTMP
Per prima cosa è necessario installare il pacchetto bbb-streaming, a cui abbiamo dedicato un precedente articolo.
A questo punto possiamo configurarlo in modo da connettersi ad una sessione (stanza) e ritrasmetterla in streaming RTMP.
# pico docker-compose.yml
# Stream url from RTMP server
- BBB_STREAM_URL=rtmp://IP_RTMP_server/live
# Stream URL for viewers to watch live video:
- BBB_VIEWER_STREAM_URL=rtmp://IP_RTMP_server/live
Ovviamente la stanza deve essere già attiva ed il suo ID deve essere stato specificato in docker-compose.yml
A questo punto avviamo la connessione:
# docker-compose run -d
Configurare nginx stream con password nginx
Se volessimo rendere più sicuro l’accesso al nostro stream, possiamo modificare la configurazione di nginx e ottenere un url per la connessione rtmp con un percorso specifico ed una password da specificare:
# pico nginx.conf
rtmp {
server {
listen 1935;
ping 30s;
notify_method get;
application stream {
live on;
on_publish http://localhost:80/auth;
on_play http://localhost:80/auth;
record off;
}
}
}
A questo punto modifichiamo il virtualhost inserendo il return201 ed il passaggio solo a chi specifica l’url con la password impostata:
# pico sites-enabled/default
location /auth {
if ($arg_psk = 'lanostrapassword') {
return 201;
}
return 404;
}
Controlliamo che la sintassi sia corretta e riavviamo nginx:
# nginx -t
# systemctl restart nginx
Ovviamente dobbiamo adattare anche la configurazione di BigBlueButton e riavviare il docker-compose
# pico docker-compose.yml
# Stream url from RTMP
- BBB_STREAM_URL=rtmp://IP_RTMP_server/stream/user?psk=lanostrapassword
# Stream URL for viewers to watch live video:
- BBB_VIEWER_STREAM_URL=rtmp://IP_RTMP_server/stream/user?psk=lanostrapassword
A questo punto avviamo la connessione:
# docker-compose run -d
Test dello streaming con VLC
Ci sono diversi programmi per effettuare da client lo stream RTMP; e devo dire che VLC è il più noto. E’ gratuito e multipiattaforma, funzione molto bene anche su dispositivi mobili.
[Media]>>[Apri Flusso di Rete]
Inseriamo la stringa:
rtmp://IP_RTMP_server/stream/user?psk=lanostrapassword
Se tutto è andato correttamente dovrebbe iniziare lo streaming.
La latenza nello streaming
E’ normale che ci sia latenza nella ritrasmissione dello stream e non deve rappresentare un problema. L’idea di ritrasmettere una sessione ad un pubblico molto più vasto, che in questo caso accede in modo passivo al contenuto, non ha ripercussioni se questo arriva con 10 o 15 secondi ritardo. La latenza è nota nello streaming e può essere comunque gestita.
Si consiglia di non modificare i comportamenti di default della trasmissione che sono quelli che normalmente permettono di raggiungere le prestazioni migliori.
Stress test per il nostro server RTMP
L’utilità di affiancare un servizio di streaming ad un prodotto come BigBluButton sta nel ridurre il carico sul sistema e consentire la visione della sessione ad un numero molto superiore di persone, da centinaia possiamo arrivare anche a migliaia. Per valutare il consumo di banda ed il carico del servizio RTMP, si può utilizzare un software Flazr, scritto in Java permette di aprire multipli canali di stream verso il server e valutare la risposta e il picco di consumo di banda.
# apt install default-jdk
# wget https://sourceforge.net/projects/flazr/files/latest/download
# unzip flazr-0.7-RC2.zip
# cd flazr-0.7-RC2
A questo punto abbiamo tutto per provare il test
./client.sh -load 100 rtmp://X.Y.Z.K/stream/user?psk=lanostrapassword
Con questo comando apriamo 500 sessioni di stream verso il nostro server. Usando speedometer possiamo vedere i picchi di banda generati:
# speedometer -r eth0 -t eth0
Possiamo verificare le connessioni aperte da nginx sul localhost
# netstat -atun | awk '{print $5}' | cut -d: -f1 | sed -e '/^$/d' |sort | uniq -c | sort -n 1 Address 1 and 54 0.0.0.0 102 X.Y.Z.K
Possiamo raccogliere questi dati insieme a quelli di carico del sistema (RAM e CPU) e valutare quali sono i limiti di erogazione del nostro servizio.