Servidor RTMP HLS con Nginx en Ubuntu 24.04 LTS – Tutorial Paso a Paso

Hoy en día existen cientos de servicios para transmitir videos sin restricción y con máxima calidad, como son Youtube, Kick, Twitch, Facebook, DailyMotion y un largo etc., pero si por algún motivo , necesitas montar tu propio servidor de transmisión de video, compatible con todos los dispositivos , debes usar HLS. Conoceremos el paso a paso para principiantes de como montar desde 0 un servidor RTMP con soporte para HLS en un servidor Ubuntu 24.04 LTSC con ayuda del módulo RTMP de Nginx. En este tutorial configuraremos el servidor para transmitir a través de tu software de streaming favorito como OBS, con protección del flujo de transmisión para que solo lo puedas usar en tu web o dominio, o si prefieres sin ningún tipo de restricción.

Para instalar y configurar un servidor Nginx con RTMP en Ubuntu 24 y usarlo para transmitir flujos HLS desde OBS, sigue estos pasos:

1. Actualizar el Sistema

Primero, asegúrate de que tu sistema esté actualizado:

sudo apt update

sudo apt upgrade -y

2. Instalar Dependencias

Instala las dependencias necesarias para compilar Nginx con el módulo RTMP (Puedes copiar y pegar todo el codigo en la consola, que se ejecutara linea por linea):

sudo apt install build-essential libpcre3 libpcre3-dev libssl-dev zlib1g zlib1g-dev git -y

3. Descargar y Compilar Nginx con el Módulo RTMP

Descarga Nginx y el módulo RTMP, te recomendamos esas versiones y de ese repositorio (arut) que son las mas compatibles a la fecha de este turorial:

mkdir ~/nginx

cd ~/nginx

wget http://nginx.org/download/nginx-1.24.0.tar.gz

tar zxvf nginx-1.24.0.tar.gz

git clone https://github.com/arut/nginx-rtmp-module.git

Compila Nginx con el módulo RTMP:

cd nginx-1.24.0

./configure --with-http_ssl_module --add-module=../nginx-rtmp-module

make

sudo make install

4. Configurar Nginx para RTMP y HLS

Edita el archivo de configuración de Nginx (usaremos el editor nano, o usa el de tu preferencia):

sudo nano /usr/local/nginx/conf/nginx.conf

Borra toda la configuración del archivo, Pulsa CTRL 6 para seleccionar y luego CTRL K para borrar.

Si quieres configuración de nginx.conf sin restricción , que el flujo hls pueda ser reproducido en cualquier dominio , copia este código en nuestro editor html y reemplaza www.tudominio.com con tu nombre de dominio en los 4 campos, luego copia todo el codigo y pegalo en nginx.conf.

worker_processes  auto;

events {

    worker_connections  1024;

}

http {

    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    server {

        listen       80;

        server_name  www.tudominio.com;

        location / {

            root   /usr/local/nginx/html;

            index  index.html index.htm;

        }

        location /hls {

            types {

                application/vnd.apple.mpegurl m3u8;

                video/mp2t ts;

            }

            root /tmp;

            add_header Cache-Control no-cache;

            # Configuración CORS

            add_header 'Access-Control-Allow-Origin' '*' always;

            add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS' always;

            add_header 'Access-Control-Allow-Headers' 'Origin, X-Requested-With, Content-Type, Accept' always;

            add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range' always;

            if ($request_method = 'OPTIONS') {

                add_header 'Access-Control-Allow-Origin' '*' always;

                add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS' always;

                add_header 'Access-Control-Allow-Headers' 'Origin, X-Requested-With, Content-Type, Accept' always;

                add_header 'Access-Control-Max-Age' 1728000;

                add_header 'Content-Type' 'text/plain charset=UTF-8';

                add_header 'Content-Length' 0;

                return 204;

            }

        }

        # Redirigir todo el tráfico HTTP a HTTPS

        return 301 https://$host$request_uri;

    }

    server {

        listen 443 ssl;

        server_name www.tudominio.com;

        ssl_certificate /etc/letsencrypt/live/www.tudominio.com/fullchain.pem;

        ssl_certificate_key /etc/letsencrypt/live/www.tudominio.com/privkey.pem;

        include /etc/letsencrypt/options-ssl-nginx.conf;

        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

        location / {

            root /usr/local/nginx/html;

            index index.html index.htm;

        }

        location /hls {

            types {

                application/vnd.apple.mpegurl m3u8;

                video/mp2t ts;

            }

            root /tmp;

            add_header Cache-Control no-cache;

            # Configuración CORS

            add_header 'Access-Control-Allow-Origin' '*' always;

            add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS' always;

            add_header 'Access-Control-Allow-Headers' 'Range';

            add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';

            if ($request_method = 'OPTIONS') {

                add_header 'Access-Control-Allow-Origin' '*' always;

                add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS' always;

                add_header 'Access-Control-Allow-Headers' 'Range';

                add_header 'Access-Control-Max-Age' 1728000;

                add_header 'Content-Type' 'text/plain charset=UTF-8';

                add_header 'Content-Length' 0;

                return 204;

            }

        }

    }

}

rtmp {

    server {

        listen 1935;

        chunk_size 4096;

        application live {

            live on;

			deny play all;

            hls on;

            hls_path /tmp/hls;

            hls_fragment 4;                # 4 seconds fragments

            hls_playlist_length 60;        # 60 seconds playlist
        }

    }

}

Guarda los cambios con CTRL X y luego Y Enter

5. Crear el Directorio HLS

Crea el directorio donde se almacenarán los fragmentos HLS:

sudo mkdir -p /tmp/hls

sudo chown -R www-data:www-data /tmp/hls

6.Certificado SSL

Instalaremos Cerbot para solicitar y generar el certificado SSL gratuitamente:

sudo apt install certbot python3-certbot-nginx -y

Matamos el servicio de Nginx para que quede libre el puerto 80 ,sino Certbot no podra generar el certificado:

sudo pkill nginx

En este punto la ip de tu servidor ya debe estar apuntando a tu dominio, sino, no se podra generar el certificado. Cambia www.midominio.com por el nombre de tu dominio

sudo certbot --nginx -d www.midominio.com

7.Reglas del Firewall

Abriremos estos puertos para que nuestro software de transmision pueda comunicarse con el servidor

sudo ufw allow 80/tcp

sudo ufw allow 443/tcp

sudo ufw allow 1935/tcp

sudo ufw reload

8. Verificamos la configuracion:

Si el archivo nginx.conf quedo bien configurado no nos arrojara ningun tipo de error. Si arroja algun error verificar los pasos anteriores nuevamente.

sudo /usr/local/nginx/sbin/nginx -t

9. Matar e iniciar el servicio de Nginx:

Con este paso hemos terminado de configurar nuestro servidor de nginx y esta listo para recibir conexiones desde el software de transmision

sudo pkill nginx

sudo /usr/local/nginx/sbin/nginx

10. Configurar el software de transmision

En este punto asumimos que ya tienes tu software de transmision configurado con tus escenas, videos, audio,etc… para este tutorial usaremos OBS:

servidor: rtmp://www.tudominio.com/live
stream name: stream1

Puedes colocar en clave de retransmision o stream name la palabra que quieras.

11. HLS Stream

La url del stream de transmisión ya está disponible desde el servidor para ser integrada en el reproductor hls de tu preferencia, sea en tu dominio o en una herramienta externa como la que tenemos nosotros llamada HLS Video Player Test.

https://www.tudominio.com/hls/stream1.m3u8

12. Restringiendo el Stream HLS

Si quieres que solo pueda ser reproducido y visto desde tu sitio web, modifica www.tudomino.com las 9 veces en el archivo nginx.conf con tu nombre de domino asi:

worker_processes  auto;

events {

    worker_connections  1024;

}

http {

    include       mime.types;

    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    server {

        listen       80;

        server_name  www.tudominio.com;

        location / {

            root   /usr/local/nginx/html;

            index  index.html index.htm;

        }

        location /hls {

            types {

                application/vnd.apple.mpegurl m3u8;

                video/mp2t ts;

            }

            root /tmp;

            add_header Cache-Control no-cache;

            # Configuración CORS

            add_header 'Access-Control-Allow-Origin' 'https://www.tudominio.com' always;

            add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS' always;

            add_header 'Access-Control-Allow-Headers' 'Origin, X-Requested-With, Content-Type, Accept' always;

            add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range' always;

            if ($request_method = 'OPTIONS') {

                add_header 'Access-Control-Allow-Origin' 'https://www.tudominio.com' always;

                add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS' always;

                add_header 'Access-Control-Allow-Headers' 'Origin, X-Requested-With, Content-Type, Accept' always;

                add_header 'Access-Control-Max-Age' 1728000;

                add_header 'Content-Type' 'text/plain charset=UTF-8';

                add_header 'Content-Length' 0;

                return 204;

            }

        }

        # Redirigir todo el tráfico HTTP a HTTPS

        return 301 https://$host$request_uri;

    }

    server {

        listen 443 ssl;

        server_name www.tudominio.com;

        ssl_certificate /etc/letsencrypt/live/www.tudominio.com/fullchain.pem;

        ssl_certificate_key /etc/letsencrypt/live/www.tudominio.com/privkey.pem;

        include /etc/letsencrypt/options-ssl-nginx.conf;

        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

        location / {

            root /usr/local/nginx/html;

            index index.html index.htm;

        }

        location /hls {

            types {

                application/vnd.apple.mpegurl m3u8;

                video/mp2t ts;

            }

            root /tmp;

            add_header Cache-Control no-cache;

            # Configuración CORS

            add_header 'Access-Control-Allow-Origin' 'https://www.tudominio.com' always;

            add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS' always;

            add_header 'Access-Control-Allow-Headers' 'Range';

            add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';

            if ($request_method = 'OPTIONS') {

                add_header 'Access-Control-Allow-Origin' 'https://www.tudominio.com' always;

                add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS' always;

                add_header 'Access-Control-Allow-Headers' 'Range';

                add_header 'Access-Control-Max-Age' 1728000;

                add_header 'Content-Type' 'text/plain charset=UTF-8';

                add_header 'Content-Length' 0;

                return 204;

            }

			 # Verificación del referer

        set $valid_referer 0;

        if ($http_referer ~* (https?://(www\.)?dominio.com)) {

            set $valid_referer 1;

							}

        if ($valid_referer = 0) {

            return 403; # 403 Prohibir acceso si el referer no es válido o 404 para mostrar Not Found

								}

        }

    }

}

rtmp {

    server {

        listen 1935;

        chunk_size 4096;

        application live {

            live on;

			deny play all;

            hls on;

            hls_path /tmp/hls;

            hls_fragment 4;                # 4 seconds fragments

            hls_playlist_length 60;        # 60 seconds playlist
        }

    }

}

Con la anterior configuracion no se puede hacer directamente a la url del video .m3u8, si intentas acceder te arrojara el error 403, debes probar la url del video desde un player alojado en tu dominio.

Si quieres poder acceder a la url directamente elimina estas lineas:

# Verificación del referer
        set $valid_referer 0;
        if ($http_referer ~* (https?://(www\.)?dominio.com)) {
            set $valid_referer 1;
							}
        if ($valid_referer = 0) {
            return 403; # 403 Prohibir acceso si el referer no es válido o 404 para mostrar Not Found
								}

Aplica los cambios matando y reiniciando el servicio:

sudo pkill nginx

sudo /usr/local/nginx/sbin/nginx

Ya con esto tenemos nuestro servidor Nginx con plugin RTMP funcionando en un servidor Ubuntu 24.04 LTSC, ya depende de la capacidad de tu servidor para manejar el número de usuarios, que podrías ayudarte usando un reproductor de hls con p2p , con el cual los visitantes de tu streaming donarían parte de su ancho de banda para retransmitir a otros usuarios, más adelante actualizare este post y les dejare el tutorial. ¿Tuviste problemas? deja en la caja de comentarios e intentaremos ayudarte.

Si te sirvió este tutoríal ayúdanos a crecer compartiéndolo en tus redes .☺️

Deja un comentario

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

Scroll al inicio