Nginx + RTMP compilado y empaquetado en Debian


RMTP es uno de los protocolos de streaming mas usados actualmente. Fue desarrollado por Macromedia, tras la compra de Macromedia por parte de Adobe. Este ultimo librero gran parte de las especificaciones del protocolo, lo que ha generado su masificación.

Existen varios servicios con los que se pueden realizar streaming via RMTP, como el crtmpserver (free) y el Wowza (Commercial). Pero el modulo de Nginx es muy atractivo, ya que con el cual se puede realizar streaming y transcoding.
El mismo se llama nginx-rtmp-module. (Actualmente no esta incluido en el paquete de Debian, supongo que sera por algún problema de licencia … ¿?).

Manos a la obra

Primero verificaremos que tenemos lo necesario para compilar e software.
Instalaremos «build-essential» el cual contiene los paquetes necesarios para compilar software, «devscripts» nos ayudara a compilar los paquetes  «deb» y «libav-tools» (opcional) el cual posee la herramienta «avconv», que es el reemplazo para el «ffmpeg».
Avconv lo utilizaremos para hacer transcoding.

Ejecutamos:

# apt-get install build-essential devscripts libav-tools

Instalado estos 3 paquetes, configuramos las dependencias para compilar el paquete de «nginx», ejecutamos:

# apt-get build-dep nginx

Ahora crearemos un directorio donde guardaremos el código de nginx, por ejemplo:

# mkdir /tmp/nginx; cd /tmp/nginx

Dentro del directorio, obtenemos el fuente utilizado en Debian ejecutando:

# apt-get source nginx

(En este caso obtenemos la version 1.6.2 «nginx-1.6.2»).

Descargamos el código del modulo, has click aquí para ver las utilizar versiones disponibles. (En este caso es la version 1.1.7).

# wget https://github.com/arut/nginx-rtmp-module/archive/v1.1.7.tar.gz

Descomprimimos el mismo:

# tar zxvf v1.1.7.tar.gz

Copiamos el directorio que contiene el modulo dentro del código fuente de Nginx.

# cp -a nginx-rtmp-module-1.1.7 nginx-1.6.2/debian/modules/nginx-rtmp-module

Agregamos en modulo en la configuración del paquete, para esto editamos en archivo «nginx-1.6.2/debian/rules» con tu editor favorito.

# nano nginx-1.6.2/debian/rules

Buscamos la sección en el archivo «full_configure_flags», en esta sección podemos ver la lineas:

–add-module=$(MODULESDIR)/nginx-auth-pam \
–add-module=$(MODULESDIR)/nginx-dav-ext-module \
–add-module=$(MODULESDIR)/nginx-echo \
–add-module=$(MODULESDIR)/nginx-upstream-fair \
–add-module=$(MODULESDIR)/ngx_http_substitutions_filter_module

Agregamos la linea:

–add-module=$(MODULESDIR)/nginx-rtmp-module 

Debería quedar así:

–add-module=$(MODULESDIR)/nginx-auth-pam \
–add-module=$(MODULESDIR)/nginx-dav-ext-module \
–add-module=$(MODULESDIR)/nginx-echo \
–add-module=$(MODULESDIR)/nginx-upstream-fair \
–add-module=$(MODULESDIR)/ngx_http_substitutions_filter_module \
–add-module=$(MODULESDIR)/nginx-rtmp-module

(Noten que se escapo la ultima linea). Guardamos los cambios y salimos.

Ahora editamos el archivo «nginx-1.6.2/debian/source/include-binaries», si este archivo no existe, lo creamos:

# nano nginx-1.6.2/debian/source/include-binaries

Dentro de este colocamos las siguientes lineas:

debian/modules/nginx-rtmp-module/test/rtmp-publisher/RtmpPlayer.swf debian/modules/nginx-rtmp-module/test/rtmp-publisher/RtmpPublisher.swf debian/modules/nginx-rtmp-module/test/rtmp-publisher/RtmpPlayerLight.swf debian/modules/nginx-rtmp-module/test/www/bg.jpg debian/modules/nginx-rtmp-module/test/www/jwplayer_old/player.swf debian/modules/nginx-rtmp-module/test/www/jwplayer/jwplayer.flash.swf

Compilando

Procedemos a compilar el software, apara esto ejecutamos:

# cd nginx-1.6.2/; debuild

(Si existe algún error, aparecera durante este proceso!)

Si todo va bien al final veremos un error de PGP, ya que no tenemos una firma valida (Mas información acerca de como se compila y empaqueta en Debian):

debsign: gpg error occurred!  Aborting….
debuild: fatal error at line 1295:
running debsign failed

Este error lo podemos ignorar este error, subimos un directorio «cd ..» y veremos que tenemos nuestros paquetes listos:

nginx_1.6.2-5+deb8u1_all.deb
nginx-common_1.6.2-5+deb8u1_all.deb
nginx-doc_1.6.2-5+deb8u1_all.deb
nginx-extras_1.6.2-5+deb8u1_amd64.deb
nginx-extras-dbg_1.6.2-5+deb8u1_amd64.deb
nginx-full_1.6.2-5+deb8u1_amd64.deb
nginx-full-dbg_1.6.2-5+deb8u1_amd64.deb
nginx-light_1.6.2-5+deb8u1_amd64.deb
nginx-light-dbg_1.6.2-5+deb8u1_amd64.deb

Instalamos los paquetes:

# dpkg -i nginx-full_*.deb nginx-common_*.deb


(Opcional)

Pues ya tenemos compilado he instalado el Nginx,  bloquearemos estos paquetes para que los mismo no se actualicen por error.

# echo «nginx-common hold» | dpkg –set-selections
# echo «nginx-full hold» | dpkg –set-selections

Verificamos:

# dpkg –get-selections | grep nginx
nginx-common hold
nginx-full hold

Esto evitara que al realizar una actualización los paquetes tambien sean actualizados. Si requieres una actualización, deberas volver a compilar los mismos con la nueva versión del código.


Una configuración de prueba simple.

Para evitar el «espagueti code», crearemos un directorio en «/etc/nginx/», podemos ponerle el nombre que deseemos, en mi caso lo llamare «rtmp»:

# mkdir /etc/nginx/rtmp

Dentro de este directorio podremos las configuraciones de nuestro streaming. Creamos un archivo que luego llamaremos desde el archivo de configuración de nginx:

# nano /etc/nginx/rtmp/stream.conf

Dentro del archivo, pegamos el siguiente código:

rtmp {
server {
listen 1935;
chunk_size 4096;
# Permitimos que todos publiquen
allow publish all;
# Permitimos que todos visualicen
allow play all;
# Nombre de la aplicación
application envivo {
# Activamos el streaming
live on;
# No salvamos el stream
record off;
}}}

(No te olvides de indentar, para que se vea mas atractivo 😉
Editamos el archivo de configuración de nginx, para que cargue el archivo que hemos creado:

# nano /etc/nginx/nginx.conf

Agregamos la siguiente linea al final del archivo:

include /etc/nginx/rtmp/*.conf;

Reiniciamos el nginx:

# /etc/init.d/nginx restart

Y verificamos que el mismo este escuchando en el puerto «1935»:

netstat -anpt | grep nginx

tcp        0      0 0.0.0.0:1935            0.0.0.0:*               LISTEN      5695/nginx -g daemo

Con este pequeño ejemplo, ya podremos enviar datos al servidor. Por ejemplo si enviamos contenido desde una aplicación como «OBS», lo haremos mediante la siguiente URL:

rtmp://la_ip_de_tu_server/envivo/

Indicamos la contraseña que queramos, en mi caso usare «pelicula».
Así que si queremos ver el stream desde un reproductor, como el VLC, deberemos abrir al dirección:

rtmp://la_ip_de_tu_server/envivo/pelicula

En el proximo articulo explicare todas las opciones del modulo (RTMP, HSL, DASH). Su modulo de control, estadísticas y por supuesto, el transcoding.

No duden en comentar 😉


Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *