RTMP Sunucusu ve
Canlı Yayın Altyapısı


1. Sistem Güncellemesini Yapalım


Öncelikle sunucumuzu güncel paketlerle hazırlayalım:


sudo apt update && sudo apt upgrade -y

Ubuntu Sunucumuzun Hostname adresini güncelleyelim


sudo hostnamectl set-hostname alandınız.com

Host Klasörü içine girerek 127.0.1.1 adresinin Sağına alandınız.com yazınız.


sudo nano /etc/hosts

Ctrl+O Basıp Kaydedip Ctrl+X Basıp çıkalım.


2. OpenSSL, FFMPEG,
Ses, Video ve Diğer Gerekli
Paketleri Yükleyelim


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

3. Nginx ve RTMP Modüllerini Kaynak Kodları Üzerinden Derleyelim


cd /usr/local/src
sudo wget https://nginx.org/download/nginx-1.25.3.tar.gz
sudo tar zxvf nginx-1.25.3.tar.gz

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

cd nginx-1.25.3

sudo ./configure --with-http_ssl_module --add-module=../nginx-rtmp-module
sudo make
sudo make install

4. Nginx Kullanıcı İzinlerini Ayarlayalım


sudo useradd -r -s /sbin/nologin nginx
sudo chown -R nginx:nginx /usr/local/nginx

5. Nginx Config Yapısını Güncelleyelim


Config dosyasını aşağıdaki yolda açıp düzenleyebilirsiniz:


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

Sistemimde kullanmış olduğum örnek config dosyasına sayfanın en aşağısından erişebilirsiniz.


Ctrl+O Basıp Kaydedip Ctrl+X Basıp çıkalım.


Örnek konfigürasyon için sitenizde farklı bir sayfa veya bölüm ekleyebilirsiniz.

6. HLS Klasörünü Oluşturalım ve İzinlerini Tanımlayalım


HLS; Canlı yayın akışımızın geleceği görüntüyü anlık olarak bulunduracağımız alan olacaktır.


sudo mkdir -p /var/www/html/hls
sudo chown -R nginx:nginx /var/www/html/hls
sudo chmod -R 755 /var/www/html/hls

7. Web Sayfamız İçin SSL Sertifikamızı Kuralım


sudo apt install certbot
sudo certbot certonly --nginx -d yayin.teknoyazi.com.tr

Eğer 80 portu kullanımda ise:

Nginx hatası alırsanız aşağıdaki kod ile deneyiniz.


sudo fuser -k 80/tcp
sudo certbot certonly --standalone -d alanadiniz.com

8. Nginx Başlatma Kodu


Nginx'i başlatalım.


sudo /usr/local/nginx/sbin/nginx

9. Web Sayfası Örneği: Canlı Yayını Tarayıcıda İzleyelim


Aşağıdaki HTML kodunu web sitenizde kullanarak HLS formatındaki canlı yayını oynatabilirsiniz:


<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Canlı Yayın</title>
  <script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
</head>
<body style="background:#000;margin:0;">
  <video id="video" controls autoplay width="100%" height="auto" style="max-width: 800px; margin: auto; display: block;"></video>

  <script>
    var video = document.getElementById('video');
    var videoSrc = 'https://yayin.teknoyazi.com.tr/hls/test.m3u8';

    if (Hls.isSupported()) {
      var hls = new Hls();
      hls.loadSource(videoSrc);
      hls.attachMedia(video);
      hls.on(Hls.Events.MANIFEST_PARSED, function () {
        video.play();
      });
    } else if (video.canPlayType('application/vnd.apple.mpegurl')) {
      video.src = videoSrc;
      video.addEventListener('loadedmetadata', function () {
        video.play();
      });
    }
  </script>
</body>
</html>

10. Nginx Config Örneği


alanadınız.com Yazan yerleri kendi alan adınıza göre düzenleyiniz.



    worker_processes  auto;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile      on;

    server {
        listen 80;
        server_name alanadınız.com;

        root /var/www/html;
        index index.html index.htm;

        location / {
            try_files $uri $uri/ =404;
        }

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

    server {
        listen 443 ssl;
        server_name alanadınız.com;

        ssl_certificate /etc/letsencrypt/live/alanadınız.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/alanadınız.com/privkey.pem;

        root /var/www/html;
        index index.html index.htm;

        location / {
            try_files $uri $uri/ =404;
        }

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

    server {
        listen 8080;
        server_name localhost;

        location / {
            return 200 'RTMP HTTP is OK';
        }
    }
}

rtmp {
    server {
        listen 1935;
        chunk_size 4096;

        application live {
            live on;
            record off;

            hls on;
            hls_path /var/www/html/hls;
            hls_fragment 3;
            hls_playlist_length 10;
        }
    }
}


11. Yayın Anahtarı ve Bağlantı


Canlı Yayın için OBS Studio uygulamasını indirelim.


OBS Ayarları > Yayın > Servis [Özel] > Sunucu [rtmp://sunucu-ip-adresi/live]


Yayın Anahtarını 'Test' girip kaydedelim. Yayını Başlatabiliriz.


12. Güvenlik ve Ek Seçenekler


Canlı Yayınınıza herkesin erişememesi için Web Sayfanızda Oturum açma, IP Kısıtlaması getirebilirsiniz.


Sunucunuzda herkesin yayın yapmaması için RTMP Modülü içerisinde Yayın Anahtarı doğrulama yapabilirsiniz.


Örnek Yayın Anahtarı değişimi aşağıdadır.


Nginx.conf dosyanda ilgili rtmp bloğunu aşağıdaki gibi düzenle.



      rtmp {
    server {
        listen 1935;
        chunk_size 4096;

        application live {
            live on;
            record off;

            # Yayın anahtarı doğrulaması için HTTP endpoint çağrısı
            on_publish http://127.0.0.1:8080/auth;
        }
    }
}

PHP Yüklü Değil ise PHP Kurulumu.


sudo apt install php php-cli php-fpm

Nginx Web Sunucusu ile PHP dahili Server'i çalıştır.


php -S 127.0.0.1:8080 -t /var/www/html

Basit PHP Doğrulama API'si.


auth.php adlı dosyayı /var/www/html/auth.php gibi web sunucunun erişebileceği bir yere kaydet.




// İzin verilen yayın anahtarı (istediğin zaman değiştirebilirsin)
$valid_stream_key = "CANLI_YAYIN_TEST_KEY"; // Bunu istediğin anahtarla değiştir

// Nginx RTMP modülü, 'name' parametresiyle yayın anahtarını gönderir
$stream_key = $_GET['name'] ?? '';

// Anahtar doğrulama
if ($stream_key === $valid_stream_key) {
    // Anahtar doğru
    http_response_code(200);
    echo "OK";
} else {
    // Anahtar yanlış
    http_response_code(403);
    echo "Forbidden";
}

      

Basit Yayın Anahtarı doğrulama ile daha güvenli şekilde çalışabilirsiniz.


Umarım çalışmamı beğenmişsinizdir. Vakit ayırıp okuduğunuz için teşekkürler.