در مطالب قبلی در وبلاگ آموزش چگونگی راه اندازی یک RTMP و HLS سرور با استفاده از Nginx و ماژول nginx-rtmp را آموزش دادیم و در این مطلب به نحوه ی احراز هویت برای ارسال استریم به این سرویس، میپردازیم.

همان طور که در مطالب قبل عنوان کردیم برای ارسال و تماشای پخش زنده یا جریان زنده در اینترنت، شما نیاز به راه اندازی یک استریم سرور دارید. پروتکل های زیادی برای استریم وجود دارد که اکنون رایج ترین آنها RTMP و HLS میباشند که در اکثر دستگاه ها قابل نمایش هستند. پروتکل RTMP ساخته شرکت Macromedia که هم اکنون در انحصار Adobe میباشد و پروتکل HLS نیز تولید شده Apple میباشد.

شما میتوانید آموزش کامل راه اندازی یک استریم سرور را در لینوکس و ویندوز در مطالب قبلی وبلاگ مطالعه نمایید.

اگر امتحان کرده باشید، هر شخصی که IP سرور شما را داشته باشید میتواند استریم خود را بدون هیچ محدودیتی به سرور شما ارسال کند. در پلتفرم ها و نرم افزار هایی مانند Wowza، AdobeMedia Flash Server، Red و دیگر استریم سرور های RTMP شما میتوانید با قرارداد یوزر و پسور بصورت بسیار ساده از ارسال استریم ناشناس جلوگیری کنید. در ماژول Nginx-RTMP قابلیت قراردادن یوزر و پسور برای ارسال و دریافت استریم وجود ندارد ولی میتوان از راه حل جایگذین استفاده کرد.

استفاده از قابلیت Notify برای احراز هویت

در ماژول nginx-rtmp یک قالبیتی به نام Notify وجود دارد که برای اعلام هشدار و callback به وب سرويس ها و آنالیزر ها در حالت های مختلف استفاده میشود. این حالت ها عبارت اند از زمان اتصال on_connect، زمان پخش on_play، زمان انتشار on_publish، زمان پایان استریم on_done، زمان پایان یک پخش on_play_done، زمان پایان یک انتشار on_publish_done، زمان اتمام ضبط on_record_done و زمان بروز یک رخدادی on_update.
شما میتوانید با استفاده از حالت در زمان اتصال on_publish هویت ارسال کننده را بررسی و احراز کنید. بدین صورت که زمانی که کاربران اتصال را برقرار میکنند درخواستی به آدرس HTTP اعلام شده ارسال میشود و تا زمان دریافت پاسخ، استریم دریافت نمیگردد. در صورتی که پاسخ کد HTTP 2xx باشد استریم دریافت میگردد و جلسه RTMP برقرار میگردد و درصورتی که پاسخ کد 3xx باشد جلسه RTMP به یک اپلیکیشن با نام پارامتر Location اعلام شده در پاسخ ریدایرکت و منتقل میشود. در غیر این صورت و یا در صورتی که پاسخ کد 4xx یا 5xx باشد اتصال قطع میشود.

در زمان ارسال درخواست HTTP چند arguments با متد POST و استاندارد MIME از نوع application/x-www-form-urlencoded ارسال میشود که به شرح زیر میباشد:

  • call - در این حالت publish برگرداده میشود
  • addr - آدرس IP ارسال کننده
  • clientid - کدد یونیک و واحد در nginx (برای نمایش در log و stat)
  • app - نام اپلیکیشن
  • name - نام استریم یا کی استریم

به جز موارد بالا، شما میتوانید مواردی را به استریم نیم یا استریم کی اضافه کنید با این تفاوت که nginx آن را بصورت POST همراه arguments های بالا به ادرسی که اعلام کردید ارسال میکند. در این حالت شما متغییر هایی را برای احراز هویت ارسال کننده در نظر میگیرید. شما این متغییرها را با مقدار خواص در زمان ارسال به استریم کی یا استریم نیم اضافه میکنید و با وب سرویس، صحیح بودن آن را بررسی میکنید و در صورتی که درست بود پاسخ 2xx ارسال میکنید و استریم دریافت میشود و درغیر این صورت پاسخ 4xx یا 5xx ارسال میکنید و اتصال کاربر قطع میشود. در ضمن متغییر ها در زمان ارسال به هیچ وجه برای کاربر بیینده استریم ارسال نمیشود. نمونه اطلاعات ارسالی به سمت وب سرویس بصورت زیر است:

{
    "app":"hls",
    "flashver":"FMLE\/3.0 (compatible; FMSc\/1.0)",
    "swfurl":"rtmp:\/\/localhost:1935\/hls",
    "tcurl":"rtmp:\/\/localhost:1935\/hls",
    "pageurl":"",
    "addr":"127.0.0.1",
    "clientid":"18",
    "call":"publish",
    "name":"event21",
    "type":"live",
    "pass":"ali"
}

برای مثال استریم نیم من event21 است و میخواهم برای سرور خودم استریم ارسال کنم. در فایل php یک شرط گذاشتم که اگر متغیر pass در متد Post برابر ali نبود خطای 403 نمایش دهد. با این حالت استریم نیم من به event21?pass=ali تغییر میکند. اگر شخصی دیگر هر استریم نیمی را وارد کند بدون پسوند ?pass=ali استریم در سرور برقرار نمیگردد.

اجرای تنظیمات مربوط به احراز هویت در Nginx

برای این کار شما نیاز به یک وب سرویس با قابلیت ساپورت از زبان برنامه نویسی تحت وب، برای بررسی احراز هویت کاربران دارید. من در این آموزش زبان برنامه نویسی php را انتخاب کردم. در صورتی که بخواهید از خود Nginx برای وب سرویس استفاده کنید لازم است که کمپایلر php را داخل سیستم عامل خود نصب کرده و تنظیمات لازم را در Nginx انجام دهید.

با فرض اینکه nginx روی سیستم عامل شما نصب میباشد ادامه این آموزش را مطالعه فرمایید. (درصورتی که nignx را نصب نکردید از این آموزش ها برای ویندوز و لینوکس استفاده کنید.)

آموزش نصب php در nginx روی سیستم عامل ویندوز

برای نصب php ابتدا فایل zip موجود در سایت رسمی php را دانلود و آن را در ریشه nginx قرار دهید. بهتر است نسخه x64 Non Thread Safe را دانلود کنید. سپس در پایان فایل زیپ را استخراج کرده و نام فولدر را php قرار دهید.

برای اجرای php در nginx باید برنامه php-cgi را با تنظیمات b 127.0.0.1:9000- اجرا کنید. اگر ماییلید بصورت دائمی php اجرا شود آن را با nssm بصورت سرویس همانند nginx نصب کنید. برای دانلود nssm به سایت اصلی آن مراجعه کرده، آن را دانلود و فایل nssm.exe را در ریشه nginx قرار دهید و سپس در cmd ویندوز دستورات زیر را اجرا نمایید:

ali@windows$ cd c:\nginx
ali@windows$ nssm install php
دقت داشته باشید که cmd با دسترسی Administrator اجرا شده باشد. همچنین در دستور بالا ریشه اصلی سرویس nginx در c:\nginx قرار دارد که درصورت نیاز میتوانید آن را تغییر دهید. بعد از اجرای دستورات بالا پنجره زیر باز میگردد که مقادیر Arguments را داخل آن به همراه انتخاب محل اجرا، قرار دهید:

install php as service with nssm

Arguments: -b 127.0.0.1:9000

در پایان روی Install Service کلیک کنید. هم اکنون php شما بصورت سرویس نصب شده است و هر وقت ویندوز اجرا شود این برنامه نیز اجرا خواهد شد. سپس در مرحله بعد فایل nginx.conf را که در فولدر conf شاخه اصلی nginx قرار دارد را با نرم افزار های ویرایش متن نظیر Notepad یا Visual Studio Code باز کرده و تنظیمات زیر را بین گروشه های {} server قرار دهید:

location ~ \.php$ {
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include        fastcgi_params;
 }

همچنین درصورتی که پورت 80 شما آزاد باشد، میتوانید آن را برای nginx قرار دهید، کافی است در {} server مقدار listen را از 8080 به 80 تغییر دهید. بعد از ذخیره سازی فایل باید سرویس nginx را restart کنید. برای ریستارت به Task Manager ویندوز رفته و در تب Services سرویس nginx را پیدا کرده و ریستارت کنید.

Restart service nginx on windows

هم اکنون شما یک nginx با php و nginx-rtmp در ویندوز خود نصب دارید.

آموزش نصب php در nginx روی سیستم لینوکس Ubuntu 18.04

برای نصب php روی nginx باید از نسخه fastCGI process manager استفاده کنید. برای نصب این نسخه از دستور زیر استفاده کنید:

ali@linux$ sudo apt-get install php7.2-fpm
کمپایلر php نصب شده است ولی برای امنیت بیشتر بهتر است یک تغییر در تنظیمات php.ini انجام دهید. فایل php.ini را باز کرده و مقدار cgi.fix_pathinfo را 0 قرار دهید. برای باز کردن فایل از دستور زیر استفاده کنید:
ali@linux$ sudo nano /etc/php/7.2/fpm/php.ini
برای تغییر مقدار عبارت cgi.fix_pathinfo به خط 778 بروید. برای رفتن به خط خاصی در nano میتوانید از کلید میانبر ctrl + shift + - استفاده کنید. حتما عبارت ; را از ابتدای خط حذف کنید.

cgi.fix_pathinfo=0

سپس سرویس php-fpm را با دستور زیر ریستارت نمایید.

ali@linux$ sudo service php7.2-fpm restart

اکنون سراغ تنظیمات nginx رفته و کمپایلر php را به آن معرفی نمایید. برای انجام تغییرات فایل nignx.conf را با دستور زیر باز کنید:

ali@linux$ sudo nano /usr/local/nginx/conf/nginx.conf
سپس تنظیمات زیر را در فایل بین گروشه های server {} از زیر مجموعه کروشه http {} قرار دهید:

location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/run/php/php7.2-fpm.sock;
        fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        fastcgi_index index.php;
        include fastcgi_params;
}

قبل بستن فایل دو تغییرات دیگر انجام دهید. یکی nginx را با یوزر www-data اجرا کنید و دیگری تنظیمات فایل index را برای php در کل وب سرویس ست کنید.
برای اجرا nginx با یوزر www-data در ابتدای فایل عبارت #user nobody; را به user www-data; تغییر دهید:

user www-data;

دقت کنید # را از ابتدای آن حذف کنید. سپس در همان کروشه های server {} زیر عبارت server_name عبارت زیر را قرار دهید:

index  index.php index.html index.htm;

سپس فایل را بسته و ذخیره نمایید و سرویس nginx را ریستارت نمایید:

ali@linux$ sudo service nginx restart

تست php نصب شده

برای تست php در وب سرویس، کافی است فایلی با نام info.php در فولدر html در شاخه اصلی nginx ساخته و تابع phpinfo() را قرار دهید. بصورت زیر:

<?php
phpinfo();

و با آدرس http://localhost/info.php آن را باز کنید. در صورتی که تنظیمات و مشخصات php نمایش داده شد، کمپایلر به درستی نصب شده است.

برای ساخت این فایل در لینوکس میتوانید از دستور زیر استفاده کنید:

ali@linux$ sudo nano /usr/local/nginx/html/info.php

ساخت فایل احراز هویت با php برای nginx-rtmp

همانطور که بالا گفته شد برای احراز هویت کافی است یک آدرس به nginx ارائه داد. اسکریپت آن برنامه عمیات بررسی اتصال را بر عهده گرفته و درصورت عدم احراز کد خطایی مانند 403 برگرداند. برای ساخت این آدرس کافی است فایلی با نام rtmp_authentication.php در فولدر html در شاخه اصلی nginx ساخته و داخل آن کد زیر را قرار دهید:

<?php 
if ($_POST['pass'] !== 'ali') {
    header('HTTP/1.0 403 Forbidden');
}

طبق این فایل اگر عبارت pass برابر مقدار ali نباشد، کد خطای 403 به وبسرویس برگرداده میشود.

برای ساخت این فایل در لینوکس از دستور زیر استفاده کنید:

ali@linux$ sudo nano /usr/local/nginx/html/rtmp_authentication.php

تنظیمات نهایی احراز هویت دریافت استریم rtmp در nginx

در این مرحله باید آدرس فایل php ایجاد شده را به nginx داد که بتواند با آن احراز هویت را انجام دهد. فایل nginx.conf موجود در فولدر conf در شاخه اصلی nginx را باز کرده و در قسمت rtmp داخل کروشه ی server اپلیکیشن hls به به صورت زیر تغییر دهید:

application hls {
    live on;
    hls on;  
    hls_path temp/hls;  
    hls_fragment 8s;
    on_publish http://localhost/rtmp_authentication.php;
}

ما در این تنظیمات در اپلیکیشن hls، مقدار آپشن on_publish را آدرس آن اسکریپت php یعنی http://localhost/rtmp_authentication.php قرار دادیم. در هنگام ارسال استریم ، nginx تمامی اطلاعات به همراه اطلاعات اضافی در استریم نیم را بصورت متد Post به این آدرس ارسال خواهد کرد و پاسخ را از آن دریافت خواهد کرد.

امیدوارم این مطلب براتون مفید بوده باشه.