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 .☺️