Crie seu servidor de Live  Streaming privado PART 1
Tags: nginx, ffmpeg, ec2, streaming
Published: 2020-06-16 03:36:17

###Você já imaginou como são construídos os servidores de Live Streaming?
Já se perguntou: Quais são as ferramentas necessárias para criar este servidor?

Neste artigo aprenda com facilidade a configurar seu servidor sem nenhuma linguagem de programação.

Download do código fonte [aqui](https://bitbucket.org/pcmporto/live_streaming_server/src/master/part_1/)

####Quais ferramentas vamos utilizar?
[Nginx](https://www.nginx.com/resources/glossary/nginx/)
Um dos melhores servidores web open source disponíveis. Com ele vamos receber o Streaming de vídeos no protocolo RTMP (Real-Time Messaging Protocol) e distribuir o vídeo no formato MPEG-TS por HTTP.
[Nginx RTMP Module](https://github.com/arut/nginx-rtmp-module)
Modulo que fornece recursos para transmissão ao vivo com HLS ou MPEG-DASH.
[Ubuntu](https://ubuntu.com/)
É o SO(Sistema Operacional) que decidi utilizar para o nosso servidor. Eu o escolhi pela facilidade de configurar os serviços e ferramentas.
[Aws EC2](https://aws.amazon.com/ec2/)
Serviço da Amazon para aluguel de computação na nuvem. Você escolhe a quantidade de recursos que pretende utilizar e paga por tempo utilizado.

###Vamos começar!

De início vamos criar uma instância na [AWS EC2](https://console.aws.amazon.com/ec2/v2/home?region=us-east-1) com o SO Ubuntu.
Recomendo utilizar instâncias do tipo c5.large com 20Gb de disco SSH.

Se você não sabe como criar uma instância no AWS EC2 clique [aqui](https://dev.to/cesarpaulomp/aprenda-a-criar-instancias-ec2-pelo-console-3a2e) e descubra como.

Você pode também utilizar outra cloud ou uma máquina virtual para aplicar este artigo.

####Instalar o Nginx como RTMP module
Execute os próximos comandos como root

```shellscript
#Atualize sistema operacional
sudo apt update -y && sudo apt upgrade -y

#Crie pastas para fácil acesso futuro
mkdir -p /var/nginx/rec
mkdir -p /var/nginx/logs

#Crie um usuário para o Nginx para melhor segurança
adduser nginx --system --no-create-home --group --disabled-login --disabled-password

#De ao usuário nginx o controle das novas pastas
chown nginx:nginx -R /var/nginx/*

#Instale as ferramentas necessárias para compilar e instalar o Nginx
apt-get install -y build-essential git tree zlib1g-dev libssl-dev unzip libpcre3 libpcre3-dev

#Vá até o diretório tmp
cd /tmp

#Baixe o código fonte do Nginx e o módulo de RTMP
wget https://nginx.org/download/nginx-1.17.10.tar.gz
wget https://github.com/defanator/nginx-rtmp-module/archive/fix-build-with-gcc8.zip

#descompacte arquivos baixados
tar -zxvf nginx-1.17.10.tar.gz && unzip fix-build-with-gcc8.zip

#Entre na pasta do nginx
cd nginx-1.17.10

#Execute Antes de compilar e instalar execute ./configure para adicionar o módulo RTMP
./configure  --add-module=../nginx-rtmp-module-fix-build-with-gcc8

#Compile e instale o Nginx
make && make install
```
Ainda como root crie um arquivo chamado nginx.service no diretório /etc/systemd/system/ para cadastrar o Nginx como um serviço o Ubuntu. 

Este cadastro nos facilita iniciar/terminar o Nginx com mais facilidade. Além disso podemos adicionar o Nginx no startup do servidor.

**nginx.service**
```
[Unit]
Description=nginx - high performance web server
Documentation=https://nginx.org/en/docs/

[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop

[Install]
WantedBy=multi-user.target
```
Para finalizar vá até o diretório /usr/local/nginx/conf/ edite o arquivo nginx.conf.

**nginx.conf**
```
#Diz ao nginx qual usuário do SO ele deve utilizar
user nginx nginx;
#Aqui removemos alguns limites para que mais pessoas
#acessem o servidor para distribuir ou assistir vídeos.
worker_processes auto;
worker_rlimit_nofile 100000;

#Define o diretório/nome do arquivo para os logs de erro.
error_log  /var/nginx/logs/error.log;

events {
    #Diz quantas pessoas simultâneas podem acessar
    worker_connections 4000;
}

rtmp {
    server {
        #Porta padrão para RTMP
        listen 1935;
        #Verifica se há conexão ativa com o cliente
        #Caso o cliente não responda o nginx fecha a conexão
        ping 30s;
        ping_timeout 30s;
        
        #Cria a rota para estabelecer conexões RTMP.
        #Basta configurar em seu programa de streaming
        #favorito a rota 
        #rtmp://SERVER_ADDRESS:1935/stream/{SOME_CODE}
        #para começar a transmitir
        application stream {
            live on;
            #Grava toda a live em um arquivo flv
            #no diretório especificado
            record all;
            record_path /var/nginx/rec;
            record_suffix -%d-%b-%y-%T.flv;
            record_unique off;

            #Liga distribuição do vídeo como HLS
            #A especificação pede para utilizar o tmp
            hls on;
            hls_path /tmp/hls;
            #Tamanho máximo de cada fragmento do vídeo
            hls_fragment 5s;
        }
    }
}

#Configura a distribuição
http {
    default_type application/octet-stream;

    server {
        #Porta HTTP padrão.
        listen 80 default_server;
        
        #Rota para acesso ao HLS
        location /hls {
            types {
                application/vnd.apple.mpegurl m3u8;
                video/mp2t ts;
            }
            add_header Cache-Control no-cache;
            root /tmp;
        }
    }
}
```
Você pode ver mais configurações no módulo RTMP [aqui](https://github.com/arut/nginx-rtmp-module/wiki/Directives)

####Iniciar o nginx
Novamente como root execute:
```
systemctl start nginx.service
systemctl enable nginx.service
```
Se algum erro for emitido durante o start vá até a pasta /var/nginx/logs e abra o arquivo error.log

Você pode clicar [aqui](https://youtu.be/tQ57v6OcSsA) e assistir um vídeo onde todas as configurações são feitas.

####Teste

Use este endereço rtmp://YOUR_SERVER_ADDRESS:1935/stream/{CHAVE} para conectar em seu servidor para transmitir.

Lembre-se de trocar o valor {CHAVE} por um válido.

Para assistir a transmissão use este endereço http://YOUR_SERVER_ADDRESS/hls/{CHAVE}.m3u8 em um aplicativo capaz de reproduzir esta extensão.

Caso use o navegador Google Chrome você clicar [aqui](https://chrome.google.com/webstore/detail/native-hls-playback/emnphkkblegpebimobpbekeedfgemhof?utm_source=chrome-ntp-icon) para instalar uma extensão que permite reproduzir o vídeo direto nele.

Fiz um vídeo com o teste prático. É só clicar [aqui](https://youtu.be/rNH7A6oDOwk) para assistir.

####Conclusão
Nginx como o módulo de RTMP é incrível. Você cria com extrema facilidade um servidor capaz de receber e distribuir Streaming de vídeo. Além disso, você pode transmitir várias Lives ao mesmo tempo no mesmo servidor. Porém, sozinho, como feito neste artigo, não podemos customizar a qualidade dos vídeos entregues e nem criar diversas resoluções ao mesmo tempo para atender usuários com a banda de internet baixa.

Então para o próximo artigo farei esta configuração junto com a ferramenta FFmpeg. Assim será possível customizar a qualidade dos vídeos e criar múltiplas resoluções para atender melhor o usuário final.

Não deixe de ver [aqui](https://dev.to/cesarpaulomp/crie-seu-servidor-de-live-streaming-privado-part-2-65o) a segunda parte do artigo.