Le Guide: nginx, un comodo multiuso per dirette video.

Sempre più streamer effettuano dirette di ogni genere, dal gameplay agli eventi publici. Ma le connessioni in italia sono abbastanza limitate (Ad eccezione delle zone coperte da fibra ottica!) e in questi casi, dobbiamo fare i conti con la nostra banda a disposizione, specie se in quel momento vogliamo anche giocare online.

Cosa possiamo fare se vogliamo ad esempio fare una live di una partita competitiva di Overwatch, quindi con banda molto limitata per non farci pingare o disconnettere, su più piattaforme video (YouTube, Twitch, Play.io, Facebook eccetera) ma potendone reggere solo una?

Analizzando la situazione: Tutti i diversi servizi richiedono la ricezione di uno stream, e non possono condividerlo con altri, siamo quindi costretti a inviare più stream quante piattaforme vogliamo che lo ricevano. Ma, se usassimo un server con una connessione migliore che riceva un unico stream e lo rimandi a tutti i servizi che vogliamo?

L’operazione che vogliamo fare ha un nome, ed è chiamato relay. Qualche tempo fa esistevano server appositi già configurati per il noleggio mensile o con un watermark impresso, sebbene oggi il servizio è purtroppo chiuso.

Ma come possiamo fare questo relay?

Ci sono metodi molto creativi (Ho visto un tutorial di una persona che usava più istanze di OBS che trasmettevano da più parti, con enorme dispendio di CPU), ma anche uno piuttosto leggero e versatile usando nginx, un webserver versatile e leggero e un modulo sviluppato per esso, rtmp-module.

Prima di procedere, è necessario soddisfare questi requisiti:

È richiesto un server dedicato o virtuale, di cui avete accesso remoto tramite TTS (Linux) o RDP (Windows) e sopratutto, con cui potete avviare applicazioni e servizi. Il server può essere anche di un vostro conoscente, l’importante è che abbia molta banda a disposizione.

Il server in se non deve essere particolarmente potente,  una VPS base di ovh.com con distribuzione Linux è sufficiente, per altre ragioni io uso un server WIndows Server 2012 (Sempre virtuale) a cui nginx oltre a fare da relay gestisce anche un server web e FTP.

Linux o Windows, la configurazione di nginx è identica, a differire è l’installazione.

Linux

Ci sono molti modi di installare nginx su un server linux, se siete alle prime armi vi consiglio di partire da una distribuzione ubuntu based, se siete più esperti del pinguino probabilmente già saprete come compilarlo dai sorgenti e questa parte sarà per voi inutile.

  • Scarichiamo e installiamo i tools per la compilazione da sorgenti: da terminale (se siete connessi direttamente da TTS siete già in terminale) inserite questa riga e premete invio, confermate inserendo la password di root e a seguire Y (o S).
sudo apt-get install build-essential libpcre3 libpcre3-dev libssl-dev unzip
  • Create una cartella dove lavorare ed entrateci dentro:
mkdir ~/nginx
cd ~/nginx
  • Scaricate i sorgenti di nginx e del modulo rtmp:
wget http://nginx.org/download/nginx-1.7.5.tar.gz
wget https://github.com/arut/nginx-rtmp-module/archive/master.zip
  • Estraiamo gli archivi:
tar -zxvf nginx-1.7.5.tar.gz
unzip master.zip
  • Ed entriamo nella cartella estratta:
cd nginx-1.7.5
  • Aggiungiamo nella compilazione anche il modulo rtmp:
./configure --with-http_ssl_module --add-module=../nginx-rtmp-module-master
  • Infine, compiliamo e installiamo:
make
sudo make install
  • Già che ci siamo installiamo anche lo script di init:
sudo wget https://raw.github.com/JasonGiedymin/nginx-init-ubuntu/master/nginx -O /etc/init.d/nginx
sudo chmod +x /etc/init.d/nginx
sudo update-rc.d nginx defaults

Ora abbiamo nginx installato, possiamo farlo partire digitando nel terminale sudo service nginx start e fermarlo con sudo service nginx stop. Ma non è ancora il momento: Dobbiamo prima preoccuparci della sua configurazione!

Windows

L’installazione su Windows è molto più semplice, in realtà il modulo andrebbe compilato anche su Windows ma per fortuna un utente giapponese mette a disposizione una versione precompilata nel suo GitHub:

  • Scaricate questo archivio e scompattate il contenuto in C:\nginx.
  • Clickate con il tasto destro del mouse sulla cartella C:\nginx e andate in sicurezza->modifica->Aggiungi->Scrivete “Everyone” e date ok, selezionate l’utente Everyone e clickate sulla spunta “Controllo completo”. fate ok fino a chiudere la finestra. Questo è necessario per evitare fastidiosi problemi di permessi futuri.
  • Apriamo inoltre la configurazione avanzata del firewall di Windows e diamo a nginx il libero accesso alla porta 1935.

Per far partire nginx aprite il blocco note creeremo dei semplici file .bat: Aprite il blocco note e inserite:


@ECHO OFF

REM Start Nginx
tasklist /FI "IMAGENAME eq nginx.exe" 2>NUL | find /I /N "nginx.exe">NUL
IF NOT "%ERRORLEVEL%"=="0" (
REM Nginx si sta avviando.
c:
cd \nginx
start nginx.exe
ECHO Nginx è avviato.
) else (
ECHO Nginx è già avviato.
)

Salvate il file come start.bat (Occhio all’estensione, assicuratevi che non sia .txt), successivamente create un nuovo file e inserite quanto segue:


@ECHO OFF

REM Stop Nginx
tasklist /FI "IMAGENAME eq nginx.exe" 2>NUL | find /I /N "nginx.exe">NUL
IF "%ERRORLEVEL%"=="0" (
REM Nginx è in esecuzione, lo chiudo.
c:
cd \nginx
nginx.exe -s quit
ECHO Nginx chiuso.
) else (
ECHO Nginx non è in esecuzione ora.
)

Salvate il file come stop.bat, infine create un utlimo file:


@ECHO OFF

REM Aggiornamento di configurazione
tasklist /FI "IMAGENAME eq nginx.exe" 2>NUL | find /I /N "nginx.exe">NUL
IF "%ERRORLEVEL%"=="0" (
REM Nginx è attivo, aggiorno la configurazione
c:
cd \nginx
nginx.exe -s reload
ECHO Configurazione aggiornata.
) else (
ECHO Avvia nginx prima.
)

Da salvare come reload.bat, quest’ultimo ci sarà utile quando dovremmo aggiornare la configurazione.

Configurazione

In entrambi i sistemi nginx salva la sua configurazione in un file chiamato nginx.conf.
In windows il file è presente nella cartella C:\nginx\conf e potete editarlo con il blocco note, su linux la posizione del file è in /usr/local//conf/nginx.conf e deve essere aperto come root: Aprire un terminale e digitate “sudo nano /usr/local//conf/nginx.conf“, nano è un editor di testo a riga di comando, qui trovate una guida ai suoi comandi.
Se siete in modalità grafica, con una sessione VNC ad esempio, potete usare un editor grafico come gedit aprendo un terminale e digitando “sudo gedit /usr/local/conf/nginx.conf“.

La configurazione di nginx si divide in vari “server”, a noi interessa solo che gestisca il modulo rtmp, cancellate tutto il contenuto del file e incollateci quanto segue:

worker_processes  1;
error_log  logs/error.log;
error_log  logs/error.log  notice;
error_log  logs/error.log  info;
#pid       logs/nginx.pid;
events {
    worker_connections  1024;
}
rtmp {
        server {
                listen 1935;					
                chunk_size 4096;
                application relay {
                        live on;
                        push rtmp://nome.host/applicazione/streamkey;  <-------QUI VA INSERITO LINK E STREAMKEY
                        push rtmp://live-ams.twitch.tv/app/asdfghjkl;  <-------Esempio di twitch: La Streamkey va inserita dopo /app/
			wait_key on;
                }
        }
    }

push” dice al server che lo stream che riceve deve ritrasmetterlo al dato indirizzo, che può essere twitch, youtube o altro, potete inserire quante righe volete ma non dimenticate che devono terminare con il punto e virgola ;“.

Ora, avviate il server nginx e ricaricate la configurazione (per precauzione): Su Windows basta clickare due volte sul file start.bat e successivamente sul file reload.bat. Su linux dopo aver avviato il servizio con “sudo service nginx start” dovremmo ravviarlo con “sudo service nginx reload”.

Tutto pronto, configuriamo il nostro programma di stream preferito, come OpenBroadcasterSoftware a usare un server di stream personalizzato che sarà composto da:

URL: rtmp://ip.del.server.remoto/relay/

Streamkey: un nome a piacere nostro.

Il programma si collegherà quindi al nostro server è invierà solo a lui lo stream, sarà poi il server a inviarlo agli url che gl iabbiamo indicato nel file conf.

Ora, se tutto è a posto potreste aver pensato di aver finito, in realtà no: Così come è impostato nginx accetta qualunque connessione e chi ha l’ip del vostro server potrebbe usarlo per collegarsi e trasmettere sui vostri canali! Ci sono diversi metodi per proteggersi, uno semplice potrebbe essere non chiamare il server (application) “relay” ma usare una stringa di caratteri che funga da password, anche così comunque è molto facile trovare il nome esatto. Tra i diversi metodi esistenti vi è quello di permettere solo ad un determinato ip di trasmettere, inserendo dopo “live on”:

allow publish 0.0.0.0;     <----- Il vostro IP
deny publish all;

Con questo metodo, a meno che non avete un ip fisso, dovrete aggiornare manualmente ogni volta il file nginx.conf e ricaricarlo, ma avrete la certezza che solo voi potete “publicare”.

Se invece volete un metodo più “professionale”, potreste installare php sul sistema e creare una pagina php che controlli un username e una password da passare come streamkey. Una possibile implementazione è possibile trovarla al seguente indirizzo.

Link utili

Lista server Twitch.tv e Justin.tv
Lista comandi del modulo RTMP

 

About RonyeTBF

Studente di infromatica con passioni in informatica, motori, manga, videogiochi, tecnologia e pupazzi moe.