Red Hat et dérivées version SERVEUR

Alma Linux : Installer et configurer NGINX pour faire du multistream Youtube/Twitch

Table des matières

nginx
Cet article a été vérifié avec Alma Linux 9.4



Introduction



Si on souhaite faire du multistream sur plusieurs plateformes, avec OBS Studio par exemple, on ne peut diffuser que sur un seul service. C'est par exemple Twitch ou Youtube.
Dans cet article on va voir comment installer et paramétrer NGINX sur Alma Linux.

Les services de diffusion en ligne utilisent RTMP. RTMP signifie Real-Time Messaging Protocol et il s'agit dun protocole de communication utilisé pour la diffusion de données en temps réel sur Internet.

Le module rtmp n'étant pas intégré dans nginx, on devra compiler nginx avec le support du module rtmp.
Evidemment, n'ayez pas de nginx installé sur la machine depuis les dépôts de votre distribution !

Dans cet article, le serveur nginx est dédié à cet usage, il n'a pas vocation à héberger sur la même machine un site web ou servir de reverse-proxy.

Je ferai l'ensemble des commandes en étant connecté en tant que root.

Prérequis



Sur Alma Linux, on aura besoin d'activer des dépôts supplémentaires :
- crb : https://www.linuxtricks.fr/wiki/red-hat-alma-linux-centos-ajouter-des-depots-supplementaires
- epel : https://www.linuxtricks.fr/wiki/red-hat-alma-linux-centos-ajouter-des-depots-supplementaires
- remi : https://www.linuxtricks.fr/wiki/red-hat-alma-linux-centos-installer-une-autre-version-de-php-grace-aux-modules

On n'installe rien de ces dépôts pour le moment.

Je vais compiler et travailler dans mon répertoire personnel (de root) :
Code BASH :
cd /root


Installer les dépendances requises



On va installer les outils de développement :
Code BASH :
dnf groupinstall 'Development Tools'


On va installer des dépendances supplémentaires :
Code BASH :
dnf install wget git unzip openssl-devel zlib-devel pcre-devel perl perl-devel perl-ExtUtils-Embed libxslt libxslt-devel libxml2 libxml2-devel gd gd-devel pcre-devel GeoIP GeoIP-devel



Récupérer les sources de nginx et du module rtmp



Au moment de la rédaction de cet article, la dernière version stable de nginx est la 1.26.1 :
Code BASH :
wget http://nginx.org/download/nginx-1.26.1.tar.gz


Je récupère également sur git le module rtmp :
Code BASH :
git clone https://github.com/arut/nginx-rtmp-module.git


On extrait ensuite les sources de nginx :
Code BASH :
tar -xvzf nginx-1.26.1.tar.gz


Et on se rend dans les sources :
Code BASH :
cd nginx-1.26.1


Compiler les sources avec le module rtmp



Une fois dans le dossier des sources, on lance le script configure :
Code BASH :
./configure --prefix=/etc/nginx \
--sbin-path=/usr/sbin/nginx \
--modules-path=/usr/lib64/nginx/modules \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/run/nginx.lock \
--user=nginx \
--group=nginx \
--build=AlmaLinuxLT \
--builddir=nginx-1.26.1 \
--with-select_module \
--with-poll_module \
--with-threads \
--with-file-aio \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_addition_module \
--with-http_xslt_module=dynamic \
--with-http_image_filter_module=dynamic \
--with-http_geoip_module=dynamic \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_auth_request_module \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_degradation_module \
--with-http_slice_module \
--with-http_stub_status_module \
--http-log-path=/var/log/nginx/access.log \
--http-client-body-temp-path=/var/cache/nginx/client_temp \
--http-proxy-temp-path=/var/cache/nginx/proxy_temp \
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
--http-scgi-temp-path=/var/cache/nginx/scgi_temp \
--with-mail=dynamic \
--with-mail_ssl_module \
--with-stream=dynamic \
--with-stream_ssl_module \
--with-stream_realip_module \
--with-stream_geoip_module=dynamic \
--with-stream_ssl_preread_module \
--with-compat \
--with-pcre-jit \
--with-openssl-opt=no-nextprotoneg \
--add-module=../nginx-rtmp-module \
--with-debug


Le symbole \ permet de passer à la ligne dans le shell sans exécuter la commande, cela facilite la lecture dans l'article.

Ce qui s'affiche commence par :
Code TEXT :
checking for OS
 + Linux 6.5.11-7-pve x86_64
checking for C compiler ... found
 + using GNU C compiler
 + gcc version: 11.4.1 20231218 (Red Hat 11.4.1-3) (GCC) 
checking for gcc -pipe switch ... found
checking for -Wl,-E switch ... found
checking for gcc builtin atomic operations ... found
checking for C99 variadic macros ... found
 


Et si tout se passe bien termine par :
Code TEXT :
Configuration summary
  + using threads
  + using system PCRE2 library
  + using system OpenSSL library
  + using system zlib library
  nginx path prefix: "/etc/nginx"
  nginx binary file: "/usr/sbin/nginx"
  nginx modules path: "/usr/lib64/nginx/modules"
  nginx configuration prefix: "/etc/nginx"
  nginx configuration file: "/etc/nginx/nginx.conf"
  nginx pid file: "/var/run/nginx.pid"
  nginx error log file: "/var/log/nginx/error.log"
  nginx http access log file: "/var/log/nginx/access.log"
  nginx http client request body temporary files: "/var/cache/nginx/client_temp"
  nginx http proxy temporary files: "/var/cache/nginx/proxy_temp"
  nginx http fastcgi temporary files: "/var/cache/nginx/fastcgi_temp"
  nginx http uwsgi temporary files: "/var/cache/nginx/uwsgi_temp"
  nginx http scgi temporary files: "/var/cache/nginx/scgi_temp"
 


Ensuite on compile les sources (adaptez l'option -j avec le nombre de cœurs sur la machine) :
Code BASH :
make -j4


Puis on installe nginx :
Code BASH :
make install


Au passage on créé une arborescence qui ne l'est pas :
Code BASH :
mkdir -p /var/cache/nginx/client_temp


Et on donne les droits qui vont bien :
Code BASH :
chown -R nginx /var/cache/nginx


Création du service systemd



On créé ensuite un service systemd pour lancer nginx :
Code BASH :
vim /lib/systemd/system/nginx.service


Voici le contenu :
Code BASH :
[Unit]
Description=nginx
Documentation=https://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/nginx.conf
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
[Install]
WantedBy=multi-user.target


On recharge systemd :
Code BASH :
systemctl daemon-reload


On active et démarre le service pour vérifier que tout fonctionne :
Code BASH :
systemctl enable --now nginx.service



Configuration pour le service rtmp



On va ajouter ce bloc dans le fichier /etc/nginx/nginx.conf tout à la fin :

Code BASH :
vim /etc/nginx/nginx.conf


Code BASH :
rtmp {
        server {
                listen 1935;
                chunk_size 4096;
                application live {
                        live on;
                        record off;
                        push rtmp://cdg10.contribute.live-video.net/app/live_TWTWTWTWTWTWTWTWTWTWTWTW;
                        push rtmp://a.rtmp.youtube.com/live2/YTYTYTYTYTYTYTYTYTYTYT;
                }
        }
}
 


La clé pour Youtube se trouve dans le youtube studio, remplacez YTYTYTYTYTYTYTYTYTYTYT par votre clé.
La clé pour Twitch se trouve dans le tableau de bord des créateurs, remplacez TWTWTWTWTWTWTWTWTWTWTWTW par votre clé.

Pour trouver un serveur twitch près de chez vous : https://dev.twitch.tv/docs/video-broadcast/

Une fois la config modifiée, on relance nginx :
Code BASH :
systemctl restart nginx.service


On peut ensuite vérifier que le port 1935 (port rtmp standard) est bien à l'écoute avec :
Code BASH :
ss -unplat | grep 1935


Ce qui renvoie chez moi :
Code :
tcp   LISTEN 0    511    0.0.0.0:1935   0.0.0.0:*  users:(("nginx",pid=10693,fd=7),("nginx",pid=10692,fd=7))


Paramétrer OBS Studio



Dans OBS Studio, dans les préférences, dans l'onglet Stream (flux) :
- Service : Personnalisé...
- Serveur : rtmp://ip_ou_nom_du_serveur/live
- Clé de stream : Mettre n'importe quoi, ce n'est pas utilisé

obs-rtmp



Tester



A partir de là, lorsque le flux est envoyé, depuis OBS Studio, en quelques secondes, ça arrive sur les différentes plateformes concernées :

obs-rtmp-twitch



Sécurisation



Avec cette installation, je me dois de vous préciser quand même quelques notions :

Vos clés de stream sont STRICTEMENT PERSONNELLES. Ne les communiquez pas

Assurez-vous que le port 1935 NE SOIT OUVERT QUE POUR DES MACHINES DE CONFIANCE.

Vous pouvez donc filtrer soit avec des directives nginx ou avec le parefeu du système d'exploitation.



Aller plus loin



Dans cet article, on a vu la base de la mise en place. Cela fonctionne dans la majorité des cas.

Evidemment, en fonction de vos tests, il sera peut être nécessaire d'affiner la configuration de nginx.

Il est possible d'enregistrer sur le serveur les diffusions, que celui-ci puisse diffuser également (sans renvoyer sur d'autres plateformes).
Plus d'infos et exemples :
- sur le github du projet : https://github.com/arut/nginx-rtmp-module
- sur le site web du développeur : https://nginx-rtmp.blogspot.com

Comme d'habitude, vous pouvez me contacter sur Telegram si vous utilisez ce module afin de partager votre configuration ici, j'en serai ravi ! :magic:
Cette page a été vue 1393 fois