ÔÚºÆå«µÄÊý×ÖÄÚÈݺ£ÑóÖУ¬ÊÓÆµÔçÒѳÉΪ×îÊÜӽӵıí°×·½Ê½Ö®Ò»¡£´ÓË¢¶ÌÊÓÆµµ½ÅÔ¹Û¸ßÇåµçÓ°£¬Á÷³©¡¢²»±äµÄ?²¥·ÅÂÄÀúÊÇÓû§×î¸ù»ùµÄÐèÒª¡£¶øÔÚÕâ±³ºó£¬×³´óµÄ·þÎñÆ÷¼¼Êõ±íÑÝ×ÅÖÁ¹Ø³ÁÒªµÄ½ÇÉ«¡£½ñÌ죬ÎÒÃÇÒªÉî¿Ì̽ÇóµÄ£¬¾ÍÊÇÁ÷ýÌåÁìÓòºÕºÕÓÐÃûµÄ¡°ÈðÊ¿¾üµ¶¡±¡ª¡ªNginx£¬ÒÔ¼°ËüÈôºÎ³ÉΪ¸³ÄÜÊÓÆµ²¥·Å£¬´òÔì׿ԽÓû§ÂÄÀúµÄ°ÂÃØ±øÆ÷¡£
»òÐíÄã»áÎÊ£¬²¥·ÅÊÓÆµ²»?¾ÍÊǰÑÎļþ´«¸øÓû§Âð£¿ÎªÊ²Ã´»¹±ØÒªNginxÕâÑùרҵµÄ¹¤¾ß£¿´ð°¸ºÜµ¥Ò»£ºÊÓÆµÁ÷ýÌåµÄ¸´ÔÓÐÔÔ¶³¬ÄãµÄÉèÏë¡£´«Í³µÄHTTPÎļþÏÂÔØ·½Ê½£¬ÄÑÒÔÓ¦¶ÔÊÓÆµ²¥·Åʱ³Ö?Ðø¡¢¸ß´ø¿íµÄ´«ÊäÐèÒª£¬¸ü²»ÓÃ˵ʵʱ»¥¶¯¡¢µÍÑÓ³¤µÄÖ±²¥³¡¾°ÁË¡£
NginxÖ®ËùÒÔÍÑÓ±¶ø³ö£¬ÖØÒªÔÚÓÚÆäÒÔϼ¸¸öÖ÷ÌâÓÅÊÆ£º
¸ß»úÄÜÓë¸ß²¢·¢´¦ÖÃÄÜÁ¦£ºNginxÒÔÆäÊÂÎñÇý¶¯¡¢Òì²½·Ç×èÈûµÄ?ÍøÂçÄ£ÐÍÖø³Æ¡£ÕâÒâζ×ÅËüÄÜÒÔ¼«µÍµÄ×ÊÔ´¿÷Ëð£¬Í¬Ê±´¦ÖóÉǧÉÏÍòµÄ²¢·¢Ïνӣ¬ÃÀÂú·ûºÏÊÓÆµÁ÷ýÌå¶Ô¸ß²¢·¢½Ó¼ûµÄÐèÒª¡£ÎÞÂÛÊǰÙÍò¼¶¹Û¶àͬʱÅÔ¹ÛÖ±²¥£¬»¹ÊǺ£Á¿Óû§µã²¥?ÊÓÆµ£¬Nginx¶¼ÄÜÓÎÈÐÓÐÓà¡£
׳´óµÄºÍ̸֧³Ö£ºÏÖ´úÊÓÆµÁ÷ýÌå²»ÔÙ¾ÖÏÞÓÚµ¥Ò»µÄHTTPÏÂÔØ¡£Nginxͨ¹ý·á˶µÄÄ£¿éÖ§³Ö£¬¿ÉÄܽýݴ¦Öø÷ÀàÁ÷ýÌåºÍ̸£¬ÀýÈ磺
RTMP(Real-TimeMessagingProtocol):ÕâÊÇÖ±²¥ÁìÓò×î³£Óá¢×î¾µäµÄºÍ̸֮һ£¬NginxµÄngx_rtmp_moduleÄ£¿é¸³ÓèÁËËü׳´óµÄÖ±²¥ÍÆÁ÷ºÍÀÁ÷ÄÜÁ¦£¬Êǹ¹½¨Ö±²¥·þÎñÆ÷µÄ?»ùʯ¡£HLS(HTTPLiveStreaming):ÓÉÆ»¹û¹«Ë¾ÍƳö£¬½«ÊÓÆµÇзֳÉÓ×TSƬ¶Î£¬²¢Í¨¹ýM3U8Ë÷ÒýÎļþ½øÐв¥·Å¡£
HLS¼æÈÝÐÔ¼«¼Ñ£¬ÓÈÆäÊʺÏÒÆ¶¯É豸ºÍ¹ãÓòÍø´«Ê䣬NginxÄܹ»ÇáËÉ·Ö·¢HLSÊÓÆµÁ÷¡£DASH(DynamicAdaptiveStreamingoverHTTP):ÀàËÆÓÚHLS£¬DASHÒ²ÊÇÒ»ÖÖ»ùÓÚHTTPµÄ×ÔÊÊÓ¦±ÈÌØÂÊÁ÷ýÌåºÍ̸£¬ÔÊÐí²¥?·ÅÆ÷ƾ¾ÝÍøÂçÇé¿ö¶¯Ì¬µ÷ÕûÊÓÆµÖÊÁ¿£¬Ìṩ¸ü¼ÑµÄÅÔ¹ÛÂÄÀú¡£
½Ã½ÝµÄÅäÖÃÓëÀ©´óÐÔ£ºNginxµÄÅäÖÃÎļþ½á¹¹Ç峺¡¢Ò×ÓÚÀí½â£¬Í¨¹ýµ¥Ò»µÄÅäÖü´¿ÉʵÏÖ¸´ÔÓµÄÁ÷ýÌå·þÎñ¡£¸ü³ÁÒªµÄÊÇ£¬NginxÖ§³ÖµÚÈý·½Ä£¿éµÄ¼ÓÔØ£¬Äܹ»Æ¾¾ÝÒµÎñÐèÒª½øÐж¨Ô컯¿ª·¢£¬ÀýÈ缯³ÉDRM£¨Êý×Ö°æÈ¨ÖÎÀí£©¡¢¸æ°×²åÈë¡¢ÊÓÆµ×ªÂëµÈ¸ß¼¶Ö°ÄÜ£¬¼«´óµØÍØÕ¹ÁËÆäÀûÓó¡¾°¡£
×÷Ϊ·´Ïò´úÀíºÍ¸ºÔØÆ½ºâÆ÷µÄÄÜÁ¦£ºÔÚ´óÐÍÊÓÆµÆ½Ì¨ÖУ¬Nginxʱʱ±íÑÝ×Å·´Ïò´úÀíºÍ¸ºÔØÆ½ºâÆ÷µÄ?½ÇÉ«¡£ËüÄܽ«Óû§µÄÒªÇó·Ö·¢µ½ºó¶ËµÄ¶à¸öÁ÷ýÌå·þÎñÆ÷£¬ÓÐЧ·ÖɢѹÁ¦£¬Ìá¸ßϵͳµÄÕûÌå¿ÉÓÃÐԺͲ»±äÐÔ¡£Ëü»¹ÄÜ×÷ΪCDN£¨ÄÚÈÝ·Ö·¢ÍøÂ磩µÄ±ßÔµ½Úµã£¬½«ÊÓÆµÄÚÈÝ»º´æµ½ÀëÓû§¸ü½üµÄ·þÎñÆ÷ÉÏ£¬ÏÔÖø½µµÍÑÓ³¤£¬ÌáÉý²¥·Å¿ìÂÊ¡£
Nginx»ù´¡?ÅäÖ㺴ÄãµÄµÚÒ»¸öÊÓÆµÁ÷ýÌå·þÎñÆ÷
ÏëÒªÓÃNginx²¥·ÅÊÓÆµ£¬Ê×ÏȱØÒªÈ·±£ÄãµÄNginxÒÑÕýÈ·×°Öò¢ÆôÓÃÁ˱ØÒªµÄÄ£¿é¡£¶ÔÓÚRTMPºÍ̸µÄÖ§³Ö£¬Í¨³£±ØÒª×°ÖÃngx_rtmp_module¡£ÕâÄܹ»Í¨¹ý±àÒëNginxʱÔö³¤--add-module=/path/to/ngx_rtmp_module²ÎÊýÀ´ÊµÏÖ¡£
worker_processesauto;events{worker_connections1024;}http{sendfileon;tcp_nopushon;tcp_nodelayon;keepalive_timeout65;types_hash_max_size2048;include/etc/nginx/mime.types;default_typeapplication/octet-stream;server{listen80;server_nameyour_domain.com;location/{roothtml;indexindex.htmlindex.htm;}}}#RTMPÄ£¿éÅäÖÃrtmp{server{listen1935;#RTMPĬÈ϶˿Úchunk_size4096;applicationlive{liveon;#¿ªÆôÖ±²¥Ä£Ê½recordoff;#²»Â¼ÔìÊÓÆµÁ÷#allowpublish127.0.0.1;#ÔÊÐíÌØ¶¨IP°ä²¼#denypublishall;#allowplayall;#ÔÊÐíËùÓÐIP²¥·Å}}}
rtmp{}¿éÊÇRTMP·þÎñµÄÖ÷ÌâÅäÖá£server{}¿é½ç˵ÁËÒ»¸öRTMP·þÎñÆ÷Ê·ý¡£listen1935;Ö¸¶¨RTMP·þÎñ¼àÌýµÄ¶Ë¿Ú£¬1935ÊÇRTMPºÍ̸µÄĬÈ϶˿ڡ£applicationlive{}½ç˵ÁËÒ»¸öÃûΪliveµÄÀûÓá£
µ±ÍÆÁ÷»òÀÁ÷ʱ£¬ÎÒÃÇ»áʹÓÃÕâ¸öÀûÓÃÃû£¬ÀýÈçÍÆÁ÷µØÖ·¿ÉÄÜÊÇrtmp://your_domain.com/live/stream_key¡£liveon;¿ªÆôÖ±²¥Ö°ÄÜ£¬Òâζ×ÅÕâ¸öÀûÓÃÄܹ»½Ó¹ÜºÍ·Ö·¢Ö±²¥Á÷¡£recordoff;ĬÈÏÇé¿öϲ»Â¼ÔìÖ±²¥Á÷£¬ÈôÊDZØÒªÂ¼Ô죬Äܹ»ÉèÖÃΪrecordon;²¢Ö¸¶¨Â¼ÔìĿ¼¡£
ʵÏÖÅäÖú󣬳ÁмÓÔØNginx(nginx-sreload)£¬ÄãµÄRTMPÖ±²¥·þÎñÆ÷¾ÍÒѾ´î½¨ºÃÁË¡£ÄãÄܹ»Ê¹ÓÃOBSStudio¡¢FFmpegµÈ¹¤¾ß£¬½«ÊÓÆµÁ÷ÍÆË͵½rtmp://your_domain.com/live/your_stream_key£¬¶øºóÔÚÖ§³ÖRTMP²¥·ÅµÄ²¥·ÅÆ÷£¨ÈçVLC£©ÖУ¬Ê¹ÓÃrtmp://your_domain.com/live/your_stream_keyµØÖ·½øÐв¥·Å¡£
µ±È»£¬ÕâÖ»ÊÇNginxÔÚÊÓÆµ²¥·ÅÁìÓòµÄ±ùɽһ½Ç¡£Ëæ×ÅÁ÷ýÌå¼¼ÊõµÄ²»ÐÝ·¢Õ¹£¬HLSºÍDASHµÈºÍ̸µÄÀûÓÃÔ½À´Ô½¿í·º¡£NginxÈôºÎ´¦ÖÃÕâЩºÍ̸£¬ÓÖÓÐÄÄЩ½ø½×Íæ·¨£¿¾´ÇëµÈ´ýÏÂÒ»²¿ÃŵÄÄÚÈÝ¡£
Nginx½ø½×ʵ¼Ê£ºHLS,DASHÓë»úÄÜÓÅ»¯£¬´òÔ켫Ö²¥·ÅÂÄÀú
ÔÚPart1ÖУ¬ÎÒÃÇÒѾ³õ²½ÏàʶÁËNginxÔÚÊÓÆµÁ÷ýÌåÖеĻù´¡?ÀûÓ㬳ö¸ñÊÇRTMPºÍ̸µÄÅäÖá£ÏÖ´úÊÓÆµ²¥·ÅµÄÐèÒªÔ¶²»Ö¹ÓÚ´Ë£¬HLSºÍDASHµÈ»ùÓÚHTTPµÄÁ÷ýÌåºÍ̸£¬ÒòÆä½Ü³öµÄ¿çƽ̨¼æÈÝÐÔºÍ×ÔÊÊÓ¦ÄÜÁ¦£¬ÒѾ³ÉΪÊÂʵÉϵij߶ȡ£
±¾²¿?·Ö£¬ÎÒÃǽ«Éî¿ÌNginx¶ÔHLSºÍDASHµÄÖ§³Ö£¬²¢Ì½ÇóһϵÁлúÄÜÓÅ»¯¼¼ÇÉ£¬ÖúÄ㽫ÊÓÆµ²¥·ÅÂÄÀúÍÆÏò¼«Ö¡£
Nginx¸³ÄÜHLSºÍDASH£º½Ã½ÝµÄHTTPÁ÷ýÌå·Ö·¢
Nginx×ÔÉí¾ÍÊÇÒ»¸ö׳´óµÄHTTP·þÎñÆ÷£¬Òò¶ø¶ÔHLSºÍDASHµÄÖ§³ÖÏÔµÃÓÈΪÌìÈ»¡£ÕâÁ½ÖÖºÍ̸µÄÖ÷ÌâÔÚÓÚ½«ÊÓÆµÎļþÇзֳÉÓׯ¬¶Î£¬²¢Í¨¹ýM3U8(HLS)»òMPD(DASH)Ë÷ÒýÎļþ½øÐÐ×éÖ¯¡£NginxµÄ×÷ÓþÍÊǸßЧµØ½«ÕâЩÊÓÆµÆ¬¶ÎºÍË÷ÒýÎļþͨ¹ýHTTPºÍ̸Ìṩ¸ø¿Í»§¶Ë¡£
HLS(HTTPLiveStreaming)µÄ·Ö·¢£ºÒªÊ¹ÓÃNginx·Ö·¢HLSÊÓÆµ£¬Äã±ØÒª³ï±¸ºÃHLSÌåʽµÄ?ÊÓÆµÎļþ£¬Í¨³£Ô̺¬Ò»¸ö.m3u8Ë÷ÒýÎļþºÍһϵÁÐ.tsÊÓÆµÆ¬¶ÎÎļþ¡£ÕâЩÎļþÄܹ»ÓÉÊÓÆµ´¦Öù¤¾ß£¨ÈçFFmpeg£©ÔÚÍÆÁ÷¹ý³ÌÖÐʵʱÌìÉú?£¬»òÕßÌáǰ½«ÊÓÆµÎļþת»»ÎªHLSÌåʽ¡£
ÔÚNginxµÄnginx.confÖУ¬ÄãÄܹ»ÕâÑùÅäÖãº
http{#...(ÆäËûHTTPÅäÖÃ)server{listen80;server_nameyour_domain.com;location/hls{alias/path/to/your/hls/files;#Ö¸¶¨HLSÎļþµØµãµÄĿ¼types{application/vnd.apple.mpegurlm3u8;video/mp2tts;}add_headerCache-Controlno-cache;add_headerAccess-Control-Allow-Origin*;#ÔÊÐí¿çÓò½Ó¼û}}}
location/hlsÆ¥ÅäËùÓÐÒÔ/hls¿ªÍ·µÄ?ÒªÇó¡£alias/path/to/your/hls/files;Ö¸Ïò´æ?·Å.m3u8ºÍ.tsÎļþµÄ·þÎñÆ÷Ŀ¼¡£types{}¿éÖ¸¶¨ÁË.m3u8ºÍ.tsÎļþµÄMIMEÀàÐÍ£¬È·±£ä¯ÀÀÆ÷ÄÜÕýÈ·¼ø±ð?¡£
add_headerCache-Controlno-cache;ͨ³£½¨ÒéHLSË÷ÒýÎļþ²»±»»º´æ£¬ÒÔ±£Õϲ¥·ÅÆ÷»ñÈ¡×îеIJ¥·ÅÁÐ±í¡£add_headerAccess-Control-Allow-Origin*;ÔÊÐíÀ´×ÔÈκÎÓòÃûµÄÒªÇó½Ó¼ûÕâЩHLS×ÊÔ´£¬ÕâÔÚWeb²¥·ÅÆ÷Öм«¶È³£¼û¡£
´Ë¿Ì£¬Óû§Äܹ»Í¨¹ýhttp://your_domain.com/hls/your_playlist.m3u8À´½Ó¼ûÄãµÄHLSÊÓÆµÁ÷¡£
DASH(DynamicAdaptiveStreamingoverHTTP)µÄ·Ö·¢£ºDASHµÄµÀÀíÓëHLSÀàËÆ£¬Ò²Êǽ«ÊÓÆµÇзֳÉÓׯ¬¶Î£¬²¢Í¨¹ýÒ»¸öÃèÊöÎļþ£¨Í¨³£ÊÇ.mpdÎļþ£©À´ÃèÊöÕâЩƬ¶Î¡£Nginx·Ö·¢DASHµÄÅäÖÃÒ²¼«¶ÈÀàËÆ£¬¹Ø¼üÔÚÓÚÕýÈ·ÉèÖÃMIMEÀàÐÍ¡£
http{#...(ÆäËûHTTPÅäÖÃ)server{listen80;server_nameyour_domain.com;location/dash{alias/path/to/your/dash/files;#Ö¸¶¨DASHÎļþµØµãµÄĿ¼types{application/dash+xmlmpd;video/mp4mp4;#»òÕ߯äËûÊÓÆµÆ¬¶ÎÌåʽ#...(ƾ¾ÝÄãµÄDASHƬ¶ÎÌåʽÔö³¤ÆäËûMIMEÀàÐÍ)}add_headerCache-Controlno-cache;add_headerAccess-Control-Allow-Origin*;}}}application/dash+xmlÊÇ.mpdÎļþµÄ³ß¶ÈMIMEÀàÐÍ¡£
È·±£video/mp4»òÆäËûÄãʹÓõÄÊÓÆµÆ¬¶ÎÌåʽµÄMIMEÀàÐÍÒ²±»?ÕýÈ·½ç˵¡£
GzipѹËõ£º¶Ô¾²Ì¬×ÊÔ´£¨Èç.m3u8ºÍ.mpdÎļþ£©ÆôÓÃGzipѹËõ£¬Äܹ»ÏÔÖø¼õÓ×´«ÊäÎļþµÄ´óÓ×£¬½µµÍ´ø¿í¿÷Ë𣬼ӿì¼ÓÔØ¿ìÂÊ¡£
http{gzipon;gzip_typestext/plaintext/cssapplication/jsonapplication/javascripttext/xmlapplication/xmlapplication/xml+rsstext/javascriptimage/svg+xmlapplication/vnd.apple.mpegurl;gzip_comp_level6;gzip_min_length1024;gzip_varyon;}
gzip_typesÖбØÒªÔ̺¬HLSºÍDASHµÄË÷ÒýÎļþÀàÐÍ¡£
»º´æÕ½Êõ£ººÏÀíÅäÖÃä¯ÀÀÆ÷»º´æºÍ·þÎñÆ÷¶Ë»º´æ£¬Äܹ»Ï÷¼õ³Á¸´ÒªÇó¡£¶ÔÓÚÊÓÆµÆ¬¶Î.tsºÍ.mp4£¬Äܹ»ÉèÖýϳ¤µÄ»º´æ¹¦·ò£»¶ø¶ÔÓÚ.m3u8ºÍ.mpdÎļþ£¬Ôòͨ³£²»»º´æ»òÉèÖú̵ܶĻº´æ¹¦·ò£¬ÒÔ±£ÕÏʵʱ¸üС£
TCPÓÅ»¯£ºµ÷ÕûTCP²ÎÊý£¬ÀýÈçtcp_nopushºÍtcp_nodelay£¬Äܹ»ÓÅ»¯TCPÏνӵÄЧÄÜ£¬Ï÷¼õÑÓ³¤¡£
events{worker_connections1024;multi_accepton;#ÔÊÐíÒ»¸öworker½ÓÊܶà¸öÏνÓ}
SSL/TLSÓÅ»¯£ºÈôÊÇÄãµÄÊÓÆµ·þÎñʹÓÃÁËHTTPS£¬ÄÇôSSL/TLSµÄÎÕÊֺͼÓÃܹý³Ì»á´øÀ´¿Ï¶¨µÄ¿ªÏú¡£Äܹ»ÆôÓÃSSLSessionCacheÀ´¼Ó¿ìºóÐøÏνӣ¬²¢Ë¼¿¼Ê¹ÓÃTLSv1.3ÒÔ»ñµÃ¸üºÃµÄ»úÄܺͰ²È«ÐÔ¡£
CDN¼¯³É£º¶ÔÓÚÃæÏòÈ«ÇòÓû§µÄÊÓÆµ·þÎñ£¬½«Nginx×÷ΪCDNµÄ±ßÔµ½ÚµãÊÇ×î¼Ñʵ¼Ê¡£½«ÊÓÆµÄÚÈÝ»º´æµ½È«Çò¸÷µØµÄ?CDN½Úµã£¬Óû§½Ó¼ûʱ¾ÍÄÜ´Ó×î½üµÄ½Úµã»ñÈ¡ÄÚÈÝ£¬¼«´óµØ½µµÍÑÓ³¤£¬ÌáÉý²¥·Å¿ìÂʺͲ»±äÐÔ¡£NginxµÄ·´Ïò´úÀíÖ°ÄÜÄܹ»ÇáËɵØÓë¸÷ÀàCDN·þÎñ¼¯³É¡£
¶¯¾²Ì¬·ÖÀ룺½«ÊÓÆµÎļþ£¨»òÆä»º´æ£©Ó붯̬ҪÇó£¨ÈçAPIŲÓã©·Ö¸ô´¦Öá£NginxÄܹ»¸ßЧµØ´¦Öþ²Ì¬ÊÓÆµÎļþµÄ·Ö·¢£¬¶ø½«¶¯Ì¬ÒªÇóת·¢¸øºó¶ËµÄ?ÀûÓ÷þÎñÆ÷¡£
ÏÞÁ÷Óë·ÀµÁÁ´£ºÎªÁ˱£»¤ÄãµÄÊÓÆµÄÚÈݲ»±»ÀÄÓã¬Äܹ»ÅäÖÃNginxµÄÏÞÁ÷Ä£¿é(limit_req_module)À´Ï޶ȵ¥Ôª¹¦·òÄÚÓû§ÒªÇóµÄ?ÊýÁ¿£¬Ô¤·ÀDDOS¹¥»÷ºÍÅÀ³æ¡£ÅäÖ÷ÀµÁÁ´(valid_referers)Äܹ»×èÖ¹ÆäËûÍøÕ¾Ö±½ÓÒýÓÃÄãµÄÊÓÆµ¡£
´ÓRTMPÖ±²¥µ½HLS/DASHµã²¥£¬Nginx¶¼Õ¹Ê¾³öÁËÆä׳´óµÄÐÔÃüÁ¦ºÍ½Ã½ÝÐÔ¡£Ëü²»½ö½öÊÇÒ»¸öWeb·þÎñÆ÷£¬¸üÊǹ¹½¨ÏÖ´úÊÓÆµÁ÷ýÌå»ù´¡ÉèÊ©µÄÖ÷Ìâ×é¼þ¡£Í¨¹ýÉî¿ÌÀí½âNginxµÄÅäÖÃÑ¡ÏîºÍ»úÄÜÓÅ»¯¼¼ÇÉ£¬ÄãÄܹ»ÓÐЧµØ½â¾öÊÓÆµ²¥·Å¹ý³ÌÖеĸ÷ÀàÌôÕ½£¬ÎªÓû§´øÀ´Á÷³©¡¢²»±ä¡¢µÍÑÓ³¤µÄÅÔ¹ÛÂÄÀú¡£
ÎÞÂÛÊDzݴ´µÄÖ±²¥Æ½Ì¨£¬»¹ÊdzÉÊìµÄÊÓÆµµã²¥·þÎñ£¬Nginx¶¼ÊÇÄãÖµµÃÐÅÈεÄ׳´óºóÔ®¡£Óµ±§Nginx£¬¿ªÆôÄãµÄÊÓÆµÁ÷ýÌåÐÂÆªÕ°ɣ¡