Stream sunucusu kurma: dilediğiniz kadar izleyici için tek yükleme

Yayınlanma tarihi 8 dk okuma

Sunucuya tek bir stream gönderirsiniz, sunucu da bütün izleyicileri bununla besler. Böylece kendi hattınız, on kişi de izlese bin kişi de izlese yalnızca tek bir yükleme taşır. Bu rehber kurulumu, protokolleri ve arkasındaki bant genişliği hesabını gösteriyor.

Kendi sunucusu olmadan yayın yapan kişi, görüntüsünü her izleyiciye ayrı ayrı gönderir. On izleyici, aynı verinin on kez gitmesi anlamına gelir; yüz izleyici yüz kez. Evdeki ya da ofisteki yükleme hattı böylece birkaç izleyiciden sonra tıkanır ve bilgisayar hiç zorlanmadığı hâlde görüntü takılmaya başlar.

Stream sunucusu bunu tersine çevirir: Sunucuya tam olarak bir stream gönderirsiniz ve sunucu bütün izleyicileri bununla besler. Böylece kendi hattınız her zaman yalnızca tek bir yükleme taşır; on kişi de izlese, on bin kişi de izlese hiç fark etmez. Bu yazı, bunun neden bu kadar iyi işlediğini, böyle bir sunucuyu nasıl kuracağınızı, hangi protokolün ne kadar gecikmeye yol açtığını ve bu sırada gerçekte ne kadar trafik birikeceğini gösteriyor.

Sorun: darboğaz sizin yükleme hattınız

Video kesintisiz bir akıştır. Saniyede 60 kare ile 1080p bir stream, içeriğe göre 4,5 ile 8 Mbit/s arası ister; 720p ise 3 ile 5 Mbit/s arasındadır. Bu bit hızı izleyici başına akar, hem de baştan sona, hiç ara vermeden.

Almanya'daki ortalama bir ev bağlantısı yüklemede 10 ile 50 Mbit/s arasını kaldırır; birçok fiber bağlantı bile yüklemede 50 ile 100 Mbit/s arasındadır. Hesap bu yüzden çabucak bitiyor:

İzleyici3 Mbit/s ile6 Mbit/s ileEv bağlantısı yeter mi?
515 Mbit/s30 Mbit/skıl payı
2060 Mbit/s120 Mbit/shayır
100300 Mbit/s600 Mbit/shayır
10003 Gbit/s6 Gbit/shayır

Buna, sık sık gözden kaçan ikinci bir sorun eklenir: Bağlantınız bu hattı evdeki ya da ofisteki her şeyle paylaşır. Biri büyük bir dosya yüklemeye başladığı ya da bir yedekleme işi devreye girdiği anda yayın çöker. Veri merkezindeki bir sunucuda bu sorun yoktur, orada bağlantı yalnızca size ayrılmıştır.

İlke: bir kez yukarı, çok kez aşağı

Kurulum üç parçadan oluşur:

  • Gönderici, yani OBS, ffmpeg ya da bir donanım kutusu, sunucuya bir stream gönderir. Buna ingest denir.
  • Sunucu bu tek stream'i alır, istenen yayın biçimine çevirir ve hazır tutar.
  • İzleyiciler stream'i sunucudan çeker. Buna egress denir ve izleyici sayısıyla büyüyen kısım budur.

Belirleyici olan asimetridir: Sizden sunucuya giden yol bir kez yürünür, sunucudan izleyicilere giden yol binlerce kez. Bu yüzden bağlantınıza yalnızca tek bir stream kadar yükleme gerekir, sunucuya ise izleyici kitlesine yetişebilen bir bağlantı.

Gerçekte ne kadar trafik birikiyor

Bant genişliği hesabın yalnızca yarısıdır. Daha ilginç olanı hacimdir, çünkü birçok sağlayıcı buna göre faturalandırır. Formül basit:

GB cinsinden hacim = Mbit/s cinsinden bit hızı × saniye × izleyici ÷ 8000

Birkaç gerçekçi örnek:

SenaryoBit hızıSüreİzleyiciHacim
Haftalık sunum3 Mbit/s2 saat50135 GB
Günlük yayın6 Mbit/s3 saat200günde 1,6 TB
Yirmi dört saat açık kanal4 Mbit/s24 saat30günde 1,3 TB
Tek seferlik büyük etkinlik6 Mbit/s4 saat200021,6 TB

Son sütundaki sayılar, yayıncılık ile hacme dayalı faturalandırmanın neden birbirine hiç uymadığını gösteriyor. İyi izlenen tek bir yayın, koca bir ayın dahil hacmini bitirebilir ve bundan sonraki her terabayt ayrı ayrı hesaplanır. Sınırsız trafikli bir tarifede bu hesap tamamen ortadan kalkar: Hattan 200 GB da geçse 50 TB da geçse aylık fiyat sabittir.

Hangi yazılım size uygun

YazılımGüçlü yanıŞuna çok uygun
RTMP modüllü nginxyalın, kararlı, RTMP ve HLS'i aynı anda sunabiliyorklasik başlangıç, platformlara iletim
MediaMTXtek bir ikili dosya, kutudan çıktığı gibi SRT ve WebRTCfazla uğraşmadan düşük gecikme
SRSçok sayıda işlev, küme kurmaya uygunbirden fazla düğümlü büyük kurulumlar
Owncastweb arayüzü ve sohbet içeren eksiksiz çözümkendinize ait küçük yayın sitesi

Başlangıç için en akla yatkın seçim, RTMP modüllü nginx: Her yerde bulunur, iyi belgelenmiştir ve aynı sunucuyu sonradan hiç değişiklik yapmadan izleyici sayfası için web sunucusu olarak da kullanabilirsiniz.

nginx ve RTMP ile stream sunucusu kurma

Kurulum

Debian ve Ubuntu'da modül libnginx-mod-rtmp paketiyle birlikte gelir, kendiniz derlemeniz gerekmez:

apt update
apt install -y nginx libnginx-mod-rtmp ffmpeg

AlmaLinux ve Rocky Linux'ta modül EPEL deposundan gelir:

dnf install -y epel-release
dnf install -y nginx nginx-mod-rtmp ffmpeg

Yapılandırma

RTMP bölümü nginx.conf dosyasında dışarıda durur, http bloğunun içinde değil; bu, en sık yapılan başlangıç hatasıdır. Yalın ve çalışan bir sürüm şöyle görünür:

rtmp {
    server {
        listen 1935;
        chunk_size 4096;

        application live {
            live on;
            record off;

            # normal izleyiciler için HLS
            hls on;
            hls_path /var/www/stream/hls;
            hls_fragment 2s;
            hls_playlist_length 12s;

            # yayın yalnızca kendi adresinizden yapılabilir
            allow publish 203.0.113.10;
            deny publish all;

            # izlemek herkese açık
            allow play all;
        }
    }
}

HLS dosyalarını daha sonra normal web sunucusu sunar. Bunun için http bölümünde küçük bir blok yeterlidir:

server {
    listen 80;
    server_name stream.example.com;

    location /hls {
        types {
            application/vnd.apple.mpegurl m3u8;
            video/mp2t ts;
        }
        root /var/www/stream;
        add_header Cache-Control no-cache;
        add_header Access-Control-Allow-Origin *;
    }
}

Dizini oluşturun, yapılandırmayı sınayın, yeniden başlatın:

mkdir -p /var/www/stream/hls
chown -R www-data:www-data /var/www/stream
nginx -t && systemctl reload nginx

Portları açma

RTMP 1935 numaralı portta çalışır, yayınlama ise 80 ve 443 üzerinden. nftables ya da ufw ile:

ufw allow from 203.0.113.10 to any port 1935 proto tcp
ufw allow 80/tcp
ufw allow 443/tcp

İlk satıra dikkat edin: Gönderme portu yalnızca kendi adresinize açıktır. Dünyaya açık bir RTMP portu birkaç gün içinde bulunur, çünkü adres blokları otomatik olarak baştan sona taranır; ardından sizin hattınız üzerinden bir başkası yayın yapar.

OBS ile yayın yapma

OBS'te Ayarlar, Yayın bölümünde hizmet olarak “Özel” seçeneğini girin:

AlanDeğer
Sunucurtmp://stream.example.com/live
Yayın anahtarıkendi seçtiğiniz bir ad, örneğin kanal1

Çıkış bölümünde bit hızını ayarlarsınız. Yol gösterici değerler: 1080p60 için 6000 kbit/s, 1080p30 için 4500 kbit/s, 720p30 için 3000 kbit/s. Anahtar kare aralığını 2 saniyeye alın, aksi hâlde HLS'te düzensiz segmentler oluşur ve oynatıcı geçişlerde takılır.

İzleme

Stream bundan sonra https://stream.example.com/hls/kanal1.m3u8 adresinde durur ve HLS destekleyen her oynatıcıyla açılır; tarayıcıda örneğin hls.js ya da Video.js ile. Hızlı bir denetim için VLC'de “Ağ Akışı Aç” yeterlidir.

Aynı anda birden fazla platforma yayın yapma

Bu, kendinize ait bir sunucunun ikinci büyük avantajıdır. Üç paralel yüklemeyle hattınızı patlatmak yerine sunucuya bir kez gönderirsiniz, dağıtmayı o sürdürür. Bunun için application bloğuna hedef başına bir satır eklersiniz:

application live {
    live on;
    record off;

    push rtmp://live.plattform-a.example/app/STREAM_KEY;
    push rtmp://live.plattform-b.example/app/STREAM_KEY;
}

Yüklemeniz bu arada tek bir stream'de kalır. Çoğaltmayı sunucu devralır ve bant genişliği de tam olarak onun var olma sebebidir.

Gecikme: hangi protokol ne için

Gecikme neredeyse tamamen yayınlama tarafında oluşur, gönderme tarafında değil. Bunu anlamak önemli, çünkü pek çok kişi yanlış yerde arıyor:

Yayınlama yoluGecikmeŞuna uygun
HLS, varsayılan ayar20 ile 30 snsunumlar, dini törenler, bahis içermeyen spor
Kısa segmentli HLS6 ile 10 snolağan uzlaşma
Low-Latency-HLS2 ile 5 snsohbetli yayınlar
SRT1 sn altılokasyonlar arası besleme
WebRTC0,5 sn altıgörüşmeler, açık artırmalar, uzaktan kumanda

Gecikme ne kadar düşükse tek bir izleyici o kadar pahalıya gelir. HLS en ucuzudur, çünkü her web sunucusunun ve her önbelleğin sunabileceği basit dosyalardan oluşur. WebRTC ise her izleyici için ayrı bir bağlantıyı açık tutar ve böylece belirgin biçimde daha fazla işlem gücü harcar. Düşük gecikmeyi yalnızca gerçekten ihtiyaç duyduğunuz yerde seçin.

Transcoding: ne zaman değer

Sunucu stream'i yalnızca aktardığı sürece neredeyse hiç işlem gücüne ihtiyaç duymaz. Tek bir modern çekirdek bu şekilde birkaç yüz izleyiciye hizmet eder, darboğaz yalnızca bağlantıdır.

Zayıf bağlantılı izleyicilerin de izleyebilmesi için birden fazla kalite kademesi sunmak istediğiniz anda bu değişir. Her ek kademenin hesaplanması gerekir:

ffmpeg -i rtmp://127.0.0.1/live/kanal1 \
  -c:v libx264 -preset veryfast -b:v 3000k -s 1280x720 -c:a copy -f flv rtmp://127.0.0.1/live/kanal1_720 \
  -c:v libx264 -preset veryfast -b:v 1200k -s 854x480  -c:a copy -f flv rtmp://127.0.0.1/live/kanal1_480

Kademe başına iki ile dört çekirdek hesaplayın. Üç kademe böylece sekiz ile on iki çekirdeği sürekli bağlar. Bu yüzden bunlara ihtiyacınız olup olmadığını iyice düşünün: Ağırlıklı olarak bilgisayar başında ya da kablosuz ağda oturan bir izleyici kitlesi için çoğu zaman iyi seçilmiş tek bir kademe yeterlidir.

Güvenlik: kim yayın yapabilir

Stream sunucusu dışarıdan görünür ve mutlaka bulunur. Günlük kullanım için üç önlem yeterlidir:

  • Gönderme portunda güvenlik duvarı. 1935 portuna yalnızca kendi adresiniz girebilir. Adresiniz değişiyorsa onun yerine sunucuya bir VPN erişimi kullanın.
  • Yayın anahtarını denetleyin. nginx, on_publish ile her yayın denemesinde küçük bir betik çağırır; bu betik anahtarı bir listeye karşı denetler ve uyuşmazlık hâlinde reddeder.
  • Aşırı yüke karşı temel koruma. Stream sunucusu kazançlı bir hedeftir, çünkü bir kesinti anında göze çarpar. KernelHost'ta her sunucuda 3,2 Tbps kapasiteli bir flood koruması bulunur, siz hiçbir şey ayarlamak zorunda kalmadan. Ayrıntılar DDoS koruması sayfasında.

Lokasyon seçimi ve birden fazla sunucu

Sunucunun yeri size yakın bir nokta değil, izleyicilerinize yakın bir noktadır. Sizin sunucuya olan bağlantınız bir kez kurulur ve sonra, yarım kıta öteden bile olsa, kararlı biçimde çalışır. İzleyicilere giden bağlantı ise yüklenme süresine ve terk oranına karar verir.

İzleyici kitleniz ağırlıklı olarak Avrupa'daysa Almanya'daki bir lokasyon doğru seçimdir. Kitle birden fazla kıtaya dağılıyorsa ikinci bir sunucu ve DNS üzerinden dağıtım işe yarar; böylece her izleyici kendisine en yakın olanda sonlanır. KernelHost bunun için Almanya'da, ABD Batı Yakası'nda, ABD Doğu Yakası'nda, ayrıca Singapur ve Güney Kore'de lokasyonlar sunuyor; genel bir bakışı sunucu lokasyonları altında bulabilirsiniz.

Canlı görüntü yerine dosya dağıtıyorsanız, yani güncellemeler, görseller ya da video arşivleri, doğru araç stream sunucusu değil, önüne konan bir önbellektir. Bunun nasıl işlediği Kendi CDN sunucunuzu kurma yazısında anlatılıyor.

Hangi sunucu uygun

Stream sunucusunda, web sunucusundakinden farklı bir sıralama geçerlidir:

  1. Bağlantı ve trafik. Darboğaz burasıdır, hem de her zaman. Kısıtlama uygulanmayan gerçek bir gigabit bağlantı, 6 Mbit/s ile yaklaşık 160 izleyici taşır.
  2. Sınırsız trafik. Hacme dayalı tarifelerin yayıncılıkta hesabı neredeyse hiç tutmaz, çünkü başarılı tek bir akşam ayın hacmini bitirir.
  3. CPU. Transcoding yapmadığınız sürece ikinci planda. Transcoding'de ikinci darboğaz hâline gelir.
  4. RAM ve disk. En az kritik olanlar. Ancak kayıtları saklamaya başladığınızda disk alanı konu olur.

Tam olarak bu duruma göre tasarlanmış olan Sınırsız Trafik root sunucularımız: sunucu başına gerçek 2 × 1 Gbit/s bağlantı, kısıtlama olmadan sınırsız hacim, aktarılan miktardan bağımsız sabit bir aylık fiyat ve kutudan çıktığı gibi 3,2 Tbps flood koruması. Sunucu 30 saniyenin altında hazır oluyor; tam root erişimi, IPv4 ve bir /64 IPv6 ağıyla. Faturalandırma PrePaid esasına göre yapılır ve aylık olarak iptal edilebilir, yani küçük bir tarifeyle başlayıp izleyici kitleniz büyüdükçe büyüyebilirsiniz.

Sıkça sorulan sorular

Stream sunucusuna neden ihtiyaç duyarım ki?
Sunucu olmadan bilgisayarınız stream'i her izleyiciye ayrı ayrı gönderir. On izleyici ve 6 Mbit/s ile bu 60 Mbit/s yükleme demektir, yüz izleyicide ise 600 Mbit/s. Tipik bir ev bağlantısı yüklemede 10 ile 50 Mbit/s arasını kaldırır. Stream sunucusu ile tam olarak bir kez gönderirsiniz, dağıtımı sunucu devralır.
Sunucu ne kadar bant genişliğine ihtiyaç duyar?
Bit hızını eşzamanlı izleyici sayısıyla çarpın. 6 Mbit/s ile 500 izleyici 3 Gbit/s eder. Ancak tepe değerden daha önemlisi aylık hacimdir: aynı 500 izleyici iki saatte yaklaşık 2,7 TB üretir. Bu yüzden yayıncılıkta belirleyici özellik CPU değil, sınırsız trafiktir.
En iyisi hangi yazılımı seçerim?
Başlangıç için RTMP modüllü nginx, çünkü yalın bir yapıya sahip ve RTMP ile HLS'i aynı anda sunabiliyor. MediaMTX, kutudan çıktığı gibi SRT ve WebRTC sunan daha modern alternatiftir. SRS en çok işlevi sunar ama daha fazla öğrenme gerektirir. Owncast ise web arayüzü ve sohbet içeren eksiksiz bir çözümdür.
Gecikme ne kadar olur?
Sunucuya giden RTMP bir saniyenin altında kalır. Gecikme neredeyse tamamen yayınlama tarafında oluşur: varsayılan ayarlarla HLS 20 ile 30 saniye arasındadır, kısa segmentlerle 6 ile 10, Low-Latency-HLS ile 2 ile 5 saniye. SRT ve WebRTC bir saniyenin altına iner, karşılığında izleyici başına daha fazla işlem gücü ister.
Transcoding'e ihtiyacım var mı ve maliyeti nedir?
Yalnızca birden fazla kalite kademesi sunmak istiyorsanız. Yeniden kodlamadan yapılan düz aktarım neredeyse hiç CPU harcamaz, tek bir çekirdek yüzlerce izleyiciye hizmet eder. 1080p bir stream'i ek olarak 720p ve 480p çıkışa verdiğiniz anda, kademe başına yaklaşık iki ile dört modern çekirdek gerekir. Transcoding'i ancak gerçekten ihtiyaç duyduğunuzda planlayın.
Aynı anda Twitch ve YouTube'a yayın yapabilir miyim?
Evet, sunucu tam olarak bunun için iyidir. Sunucunuza bir kez gönderirsiniz, o da aynı stream'i dilediğiniz sayıda platforma iletir. nginx-RTMP'de hedef başına bir push satırı yeterlidir. Kendi hattınız buna karşın yine tek bir yükleme taşır.
Yabancıların sunucumdan yayın yapmasını nasıl engellerim?
Ingest portunu güvenlik duvarında yalnızca kendi adresinize açın ve bunun üstüne stream anahtarını on_publish ile denetleyin. İkisi birlikte olmazsa, açıkta duran her RTMP sunucusu günler içinde yabancı yayınlarla dolar, çünkü adres blokları baştan sona taranır.
Sunucu nerede durmalı?
Size yakın değil, izleyicilerinize yakın. Sizden sunucuya giden yol bir kez yürünür, sunucudan izleyicilere giden yol binlerce kez. İzleyici kitleniz Avrupa'daysa sunucu Avrupa'da durur. Kitle kıtalara dağılıyorsa ikinci bir sunucu ve DNS üzerinden dağıtım işe yarar.
VPS yeter mi, yoksa kendime ait bir sunucu mu gerekir?
Transcoding olmadan düz aktarım için birkaç çekirdekli bir VPS sorunsuz yeter, darboğaz işlem gücü değil bağlantıdır. Dedicated donanım ancak birden fazla kalite kademesini transcode ederken ya da çok sayıda paralel kanal işletirken anlam kazanır.
Sunucunun yükü kaldırıp kaldırmadığını nasıl test ederim?
Yayını başlatın ve birden fazla araçla aynı anda açın, örneğin ffmpeg'i boşta çalışma kipinde. Bu sırada ağ veri akışını ve kullanımı izleyin. CPU ısınmadan bağlantının sınırına ulaşıyorsanız hesap tutmuş demektir ve size daha fazla çekirdek değil, daha fazla bant genişliği gerekir.

Streaming RTMP HLS SRT nginx OBS Restream Unlimited Traffic