Alma Linux : Installer et configurer NGINX pour faire du multistream Youtube/Twitch
Table des matières
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.
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) :
On va installer les outils de développement :
On va installer des dépendances supplémentaires :
Au moment de la rédaction de cet article, la dernière version stable de nginx est la 1.26.1 :
Je récupère également sur git le module rtmp :
On extrait ensuite les sources de nginx :
Et on se rend dans les sources :
Une fois dans le dossier des sources, on lance le script configure :
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 :
Et si tout se passe bien termine par :
Ensuite on compile les sources (adaptez l'option -j avec le nombre de cœurs sur la machine) :
Puis on installe nginx :
Au passage on créé une arborescence qui ne l'est pas :
Et on donne les droits qui vont bien :
On créé ensuite un service systemd pour lancer nginx :
Voici le contenu :
On recharge systemd :
On active et démarre le service pour vérifier que tout fonctionne :
On va ajouter ce bloc dans le fichier /etc/nginx/nginx.conf tout à la fin :
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 :
On peut ensuite vérifier que le port 1935 (port rtmp standard) est bien à l'écoute avec :
Ce qui renvoie chez moi :
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é
A partir de là, lorsque le flux est envoyé, depuis OBS Studio, en quelques secondes, ça arrive sur les différentes plateformes concernées :
Avec cette installation, je me dois de vous préciser quand même quelques notions :
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 !
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é
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 :
Sécurisation
Avec cette installation, je me dois de vous préciser quand même quelques notions :
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 !