ÒÔHLSΪÀý£¬Ê¹ÓÃnginx-vod-moduleµÄÅäÖÿÉÄÜÈçÏÂËùʾ£º
http{#...ÆäËûÅäÖÃ...vodon;#ÆôÓÃVODÄ£¿évod_root/path/to/your/vod/files;#´æ·ÅÔ´ÊÓÆµÎļþµÄĿ¼vod_manifest_path/path/to/your/vod/manifests;#Éú³ÉµÄm3u8Îļþ´æ·ÅĿ¼server{listen80;server_nameexample.com;location/vod/{alias/path/to/your/vod/files/;autoindexon;types{application/vnd.apple.mpegurlm3u8;video/mp2tts;}expires30d;}#VODÄ£¿éµÄ½Ó¿Ú£¬ÓÃÓÚÉú³Ém3u8Îļþlocation/vod.m3u8{vod_generate_m3u8;}}}
ÔÚÕâ¸öÅäÖÃÖУ¬vodon;ÆôÓÃÁËVODÄ£¿é¡£vod_rootÖ¸¶¨ÁË´æ´¢ÔʼÊÓÆµÎļþµÄλÖá£/vod.m3u8Õâ¸ölocationÊÇVODÄ£¿éÌṩµÄ½Ó¿Ú£¬µ±¿Í»§¶ËÇëÇó/vod.m3u8?file=your_video.mp4ʱ£¬VODÄ£¿é¾Í»á¸ù¾Ýyour_video.mp4Éú³ÉÏàÓ¦µÄHLS²¥·ÅÁÐ±í¡£
¶ÔÓÚÃæÏòÈ«ÇòÓû§µÄÊÓÆµÆ½Ì¨¶øÑÔ£¬½«ÊÓÆµÄÚÈݲ¿ÊðÔÚÀëÓû§×î½üµÄ·þÎñÆ÷ÉÏÊÇÌáÉý²¥·ÅÌåÑéµÄ¹Ø¼ü¡£Õâ¾ÍÐèÒª½èÖúCDN(ContentDeliveryNetwork)¼¼Êõ¡£Nginx±¾Éí¾ÍÊÇÒ»¸ö·Ç³£ÓÅÐãµÄCDNÔ´Õ¾·þÎñÆ÷¡£Í¨¹ý½«Nginx·þÎñÆ÷²¿ÊðÔÚÊÓÆµÄÚÈݵÄÔ´Í·£¬²¢ÅäÖÃÏàÓ¦µÄ»º´æ²ßÂÔ£¬CDN½Úµã¾Í¿ÉÒÔ´Ó?NginxÔ´Õ¾»ñÈ¡ÊÓÆµÄÚÈÝ£¬²¢½«Æä»º´æµ½Àë×îÖÕÓû§¸ü½üµÄ½ÚµãÉÏ¡£
NginxÔÚCDNÖеÄ×÷ÓÃÖ÷ÒªÌåÏÖÔÚÒÔϼ¸¸ö·½Ã棺
¸ßÐÔÄÜÔ´Õ¾£ºNginxÄܹ»¸ßЧµØ´¦ÀíCDN½Úµã·¢ÆðµÄÇëÇ󣬱£Ö¤ÊÓÆµÄÚÈݵĿìËÙ»ñÈ¡¡£»º´æÓÅ»¯£ºÍ¨¹ý¾«Ï¸µÄexpires¡¢proxy_cacheµÈÅäÖã¬Nginx¿ÉÒÔÓÐЧµØ¹ÜÀíÊÓÆµÄÚÈݵĻº´æ£¬¼õÉÙÔ´Õ¾µÄѹÁ¦£¬²¢¼ÓËÙCDN½ÚµãµÄ¸üС£
ÐÒéÖ§³Ö£ºNginx¶ÔHTTP/2¡¢TLS/SSLµÈÐÒéµÄÖ§³Ö£¬Äܹ»ÎªCDN´«ÊäÌṩ¸ü¿ìµÄËٶȺ͸ü°²È«µÄ±£ÕÏ¡£½¡¿µ¼ì²éÓë¸ºÔØ¾ùºâ£ºNginxÒ²¿ÉÒÔ×÷ΪCDNÄÚ²¿?µÄ¸ºÔؾùºâÆ÷£¬½«ÇëÇó·Ö·¢µ½¶à¸öNginxºó¶Ë·þÎñÆ÷£¬Ìá¸ßÕûÌåµÄ¿ÉÓÃÐÔ¡£
NginxÔÚÊÓÆµ²¥·ÅÁìÓòµÄÓ¦Óã¬ÒѾ´ÓÒ»¸ö¼òµ¥µÄÎļþ·þÎñÆ÷£¬Ñݱä³ÉÁËÒ»¸ö¹¦ÄÜÇ¿´ó¡¢ÐÔÄÜ׿ԽµÄÁ÷ýÌå½â¾ö·½°¸¡£Í¨¹ý¶ÔRTMP¡¢HLS¡¢DASHµÈÐÒéµÄÖ§³Ö£¬ÒÔ¼°ÓëCDN¡¢ÊÓÆµÓÅ»¯¼¼ÊõµÄ½áºÏ£¬NginxÄܹ»°ïÖú¿ª·¢ÕßÇáËɴÆðÄܹ»Âú×ã¸÷ÖÖ³¡¾°ÐèÇóµÄÊÓÆµ²¥·Åƽ̨¡£
ÎÞÂÛÊǸöÈ˲©¿ÍÉϵÄ?ÊÓÆµ·ÖÏí£¬»¹ÊÇ´óÐÍÊÓÆµÍøÕ¾µÄÖ±²¥ÍÆÁ÷£¬Nginx¶¼Äܹ»ÌṩÎȶ¨¡¢¸ßЧ¡¢Á÷³©µÄÊÓÆµ²¥·ÅÌåÑ飬ÈÃÿһ´Î¹Û¿´¶¼³ÉΪһ´ÎÓäÔõÄÓ°ÒôÏíÊÜ¡£ÕÆÎÕNginxµÄÊÓÆµ²¥·ÅÖ®µÀ£¬¾ÍÊÇÕÆÎÕÁËÁ¬½ÓÄÚÈÝÓëÓû§µÄ¹Ø¼ü¼¼Êõ£¬ÎªÓû§´øÀ´ÎÞÓëÂױȵÄÊý×ÖÓéÀÖÌåÑé¡£
¶ÔÓÚʵʱֱ²¥³¡¾°£¬RTMP(Real-TimeMessagingProtocol)ÊÇĿǰӦÓÃ×î¹ã·ºµÄÐÒéÖ®Ò»¡£Nginx±¾Éí²¢²»Ö±½ÓÖ§³ÖRTMP£¬µ«¿ÉÒÔͨ¹ýÇ¿´óµÄnginx-rtmp-moduleÄ£¿éÀ´ÊµÏÖRTMPÁ÷ýÌå·þÎñÆ÷µÄ¹¦ÄÜ¡£
¸ÃÄ£¿é½«Nginxת»¯ÎªÒ»¸ö¹¦ÄÜÍ걸µÄRTMP·þÎñÆ÷£¬Äܹ»½ÓÊÕÖ±²¥ÍÆÁ÷£¬²¢½«Á÷ýÌå·Ö·¢¸ø¹ÛÖÚ¡£
ÒªÆôÓÃnginx-rtmp-module£¬Í¨³£ÐèÒªÔÚ±àÒëNginxʱ½«Æä×÷ΪµÚÈý·½Ä£¿é¼ÓÈë¡£Ò»µ©°²×°³É¹¦£¬¾Í¿ÉÒÔÔÚnginx.confÖÐÌí¼ÓRTMPÏà¹ØµÄÅäÖãº
rtmp{server{listen1935;#RTMPĬÈ϶˿Úchunk_size4096;applicationlive{liveon;recordoff;#Èç¹û²»ÐèÒªÂ¼ÖÆÖ±²¥Á÷£¬¿ÉÒÔÉèÖÃΪoffallowpublish127.0.0.1;#ÔÊÐí±¾µØÍÆÁ÷allowplayall;#ÔÊÐíËùÓÐÈ˲¥·Å}}}http{#...Ç°ÃæÌáµ½µÄHTTPÅäÖÃ...#ÕûºÏRTMPÖ±²¥Á÷µ½HTTPlocation/hls{types{application/vnd.apple.mpegurlm3u8;video/mp2tts;}root/tmp;#HLS·ÖƬ´æ·ÅĿ¼add_headerCache-Controlno-cache;add_headerAccess-Control-Allow-Origin*;#ÅäºÏnginx-rtmp-moduleµÄHLSÅäÖÃhlson;hls_path/tmp/hls;#HLS·ÖƬÊä³ö·¾¶hls_fragment5s;#HLS·ÖƬʱ³¤}}
ÔÚǰһ²¿·Ö£¬ÎÒÃÇ̽ÌÖÁËNginxÔÚÊÓÆµ²¥·Å·½ÃæµÄ»ù´¡ÅäÖúͶÔRTMP¡¢HLSÐÒéµÄÖ§³Ö¡£Ëæ×ÅÓû§¶ÔÊÓÆµÖÊÁ¿ÒªÇóµÄ²»¶ÏÌá¸ß£¬ÒÔ¼°Á÷ýÌåÓ¦Óó¡¾°µÄÈÕÒæ¸´ÔÓ£¬½ö½öÒÀ¿¿»ù´¡ÅäÖÃÊÇÔ¶Ô¶²»¹»µÄ¡£ÎÒÃÇÐèÒª½øÒ»²½ÉîÈëNginxµÄ?¸÷Ïî¸ß¼¶¹¦ÄÜ£¬²¢½áºÏʵ¼ÊµÄÁ÷ýÌå¼¼Êõ£¬À´¹¹½¨Ò»¸öÄܹ»Ìṩ¼«Ö¹ÛÓ°ÌåÑéµÄÊÓÆµ²¥?·Åƽ̨¡£
×ÔÊÊÓ¦±ÈÌØÂÊÁ÷(AdaptiveBitrateStreaming)£ºÓ¦¶Ô²»Í¬ÍøÂç»·¾³µÄ¹Ø¼ü
ÔÚÍøÂç»·¾³¶à±äµÄ½ñÌ죬Óû§¿ÉÄÜÉí´¦¸ßËÙWi-Fi¡¢4GÍøÂ磬ÉõÖÁÐźŲ»¼ÑµÄÒÆ¶¯ÍøÂ硣ΪÁËÈ·±£²¥·ÅµÄÁ÷³©ÐÔ£¬×ÔÊÊÓ¦±ÈÌØÂÊÁ÷¼¼ÊõÓ¦Ô˶øÉú¡£HLSºÍDASHÊǵ±Ç°×îÖ÷Á÷µÄÁ½ÖÖ×ÔÊÊÓ¦±ÈÌØÂÊÁ÷ýÌåÐÒ飬ËüÃÇͨ¹ý½«ÊÓÆµ·Ö¸î³É²»Í¬·Ö±æÂʺÍÂëÂʵÄСƬ¶Î£¬²¢Éú³ÉÒ»¸öË÷ÒýÎļþ£¨Èç.m3u8»ò.mpd£©£¬¿Í»§¶Ë²¥·ÅÆ÷»á¸ù¾Ýµ±Ç°ÍøÂç×´¿ö¶¯Ì¬µØÑ¡Ôñ×îÊʺϵÄÊÓÆµÆ¬¶Î½øÐв¥?·Å£¬´Ó¶øÊµÏÖ¡°¿¨¶Ù¡±µÄ×îС»¯¡£
Nginx£¬ÌرðÊÇͨ¹ýnginx-rtmp-moduleºÍnginx-vod-moduleµÈÄ£¿é£¬Äܹ»ÓÐЧµØÖ§³ÖHLSºÍDASH¡£ÈçǰËùÊö£¬nginx-rtmp-module¿ÉÒÔ½«RTMPÁ÷ʵʱתÂë²¢Éú³ÉHLSÁ÷¡£¶ønginx-vod-moduleÔò¸üרעÓڵ㲥³¡¾°£¬Ëü¿ÉÒÔ¶ÔMP4µÈ?ÊÓÆµÎļþ½øÐж¯Ì¬ÇÐÆ¬£¬Éú³ÉHLSºÍDASH¸ñʽµÄ²¥·ÅÁÐ±í¡£
ÒªÀûÓÃNginx½øÐÐÊÓÆµ²¥·Å£¬Ê×ÏÈÐèҪȷ±£NginxÒѾ°²×°²¢¾ß±¸Á˱ØÒªµÄÄ£¿é¡£¶ÔÓÚ³£¼ûµÄÊÓÆµÁ÷ýÌåÐÒ飬Nginxͨ³£ÐèÒª°²×°ngx_http_flv_module(ÓÃÓÚ²¥·ÅFLV¸ñʽµÄÊÓÆµ)ºÍngx_http_mp4_module(ÓÃÓÚ´¦ÀíMP4¸ñʽµÄÊÓÆµ)¡£
¸ü½øÒ»²½£¬ÈôÒªÖ§³ÖHLS(HTTPLiveStreaming)ºÍDASH(DynamicAdaptiveStreamingoverHTTP)µÈÖ÷Á÷µÄ×ÔÊÊÓ¦±ÈÌØÂÊÁ÷ýÌåÐÒ飬»¹ÐèÒª¶îÍâµÄµÚÈý·½Ä£¿é£¬ÀýÈçnginx-vod-module»ònginx-rtmp-module¡£
ÔÚnginx.confÅäÖÃÎļþÖУ¬ÎÒÃÇ¿ÉÒÔΪÊÓÆµ²¥·Å³¡¾°½øÐÐרÃŵÄÅäÖá£ÀýÈ磬´´½¨Ò»¸ölocation¿éÀ´´¦ÀíÊÓÆµÎļþµÄÇëÇó£º
http{#...ÆäËûÅäÖÃ...server{listen80;server_nameexample.com;location/videos/{alias/path/to/your/video/files/;#Ö¸¶¨ÊÓÆµÎļþ´æ·ÅĿ¼autoindexon;#¿ÉÑ¡£¬ÓÃÓÚ·½±ãä¯ÀÀÊÓÆµÁбí?add_header'Access-Control-Allow-Origin''*';#ÔÊÐí¿çÓò·ÃÎÊ#Õë¶ÔÊÓÆµÎļþµÄһЩÓÅ»¯ÅäÖÃsendfileon;tcp_nopushon;tcp_nodelayon;keepalive_timeout65;types{video/mp4mp4;video/x-flvflv;}#»º´æÅäÖã¬Ìá¸ß·ÃÎÊËÙ¶Èexpires30d;}}}
NginxµÄºËÐÄÓÅÊÆÔÚÓÚÆäʼþÇý¶¯¡¢Òì²½·Ç×èÈûµÄÍøÂçI/OÄ£ÐÍ¡£ÕâÒâζ×ÅËüÄܹ»ÒÔ¼«µÍµÄ×ÊÔ´ÏûºÄ´¦Àíº£Á¿²¢·¢Á¬½Ó£¬Õâ¶ÔÓÚÐèҪͬʱ·þÎñ´óÁ¿Óû§µÄÊÓÆµÁ÷ýÌåÓ¦ÓÃÀ´ËµÖÁ¹ØÖØÒª¡£´«Í³µÄ×èÈûʽI/OÄ£ÐÍÔÚ´¦ÀíÊÓÆµÁ÷ÕâÖÖ³¤Ê±¼ä¡¢´óÁ÷Á¿µÄÁ¬½Óʱ£¬ÈÝÒ×Ôì³É×ÊÔ´À˷ѺÍÐÔÄÜÆ¿¾±£¬¶øNginxµÄÉè¼ÆÔòÍêÃÀ¹æ±ÜÁËÕâÒ»ÎÊÌâ¡£
NginxÄ£¿é»¯µÄ¼Ü¹¹Ò²ÎªÆäÔÚÊÓÆµ²¥·ÅÁìÓòµÄÓ¦ÓÃÌṩÁ˼«´óµÄÁé»îÐÔ¡£Í¨¹ý¼ÓÔØ²»Í¬µÄÄ£¿é£¬Nginx¿ÉÒÔÖ§³Ö¶àÖÖÁ÷ýÌåÐÒ飬²¢ÊµÏַḻµÄ?¹¦ÄÜ¡£ÕâʹµÃ¿ª·¢Õß¿ÉÒÔ¸ù¾Ý¾ßÌåÐèÇ󣬶¨ÖÆ»¯µØ¹¹½¨ÊÓÆµ²¥·Å½â¾ö·½°¸£¬¶øÎÞÐèÊÜÏÞÓÚµ¥Ò»µÄ¼¼ÊõÕ»¡£
³ýÁË·þÎñÆ÷¶ËµÄÅäÖã¬ÊÓÆµÄÚÈݵÄÓÅ»¯±¾ÉíÒ²¶Ô²¥·ÅÌåÑéÖÁ¹ØÖØÒª¡£NginxËäÈ»²»ÊÇÒ»¸öÊÓÆµ×ªÂ빤¾ß£¬µ«Ëü¿ÉÒÔÅäºÏһЩµÚÈý·½·þÎñ»ò¹¤¾ß£¬ÊµÏÖÊÓÆµÄÚÈݵÄÔ¤´¦ÀíºÍÓÅ»¯¡£
ÂëÂÊ¿ØÖÆ£ºÔÚÊÓÆµ±àÂë½×¶Î£¬ºÏÀíÉèÖÃÊÓÆµµÄÂëÂÊÊÇÆ½ºâ»ÖʺÍÎļþ´óСµÄ¹Ø¼ü¡£¶ÔÓÚHLSºÍDASH£¬¸üÊÇÐèÒªÌṩ¶àÖÖÂëÂʵÄÊÓÆµÁ÷¡£¹Ø¼üÖ¡ÓÅ»¯£ºÊÓÆµ²¥·ÅµÄseek£¨¿ì½ø/¿ìÍË£©²Ù×÷£¬ÐèÒªÒÀÀµÓڹؼüÖ¡¡£NginxÔÚ´¦ÀíHLS/DASHʱ£¬Æä²¥·ÅÆ÷¿ÉÒÔ¸ù¾ÝË÷ÒýÎļþºÍÊÓÆµÆ¬¶Î¿ìËÙ¶¨Î»µ½²¥·Åµã¡£
MP4/FLVÓÅ»¯£º¶ÔÓÚÖ±½Óͨ¹ýHTTP²¥·ÅµÄMP4»òFLVÎļþ£¬Nginx¿ÉÒÔͨ¹ýngx_http_mp4_moduleµÈÄ£¿é£¬ÓÅ»¯Îļþ½á¹¹£¬Ê¹Æä¸üÊʺÏÁ÷ʽ´«Ê䣬ÀýÈ罫moovatom·Åµ½ÎļþÍ·²¿£¬ÕâÑù²¥·ÅÆ÷ÎÞÐèÏÂÔØÕû¸öÎļþ¼´¿É¿ªÊ¼²¥·Å¡£
Ëæ×ÅÊÓÆµ·þÎñµÄÆÕ¼°£¬°²È«ÎÊÌâÒ²ÈÕÒæÍ¹ÏÔ¡£NginxÌṩÁ˶àÖÖ°²È«»úÖÆÀ´±£»¤ÊÓÆµÁ÷£º
·ÃÎÊ¿ØÖÆ£ºÍ¨¹ýallowºÍdenyÖ¸Á¿ÉÒÔÏÞÖÆÌØ¶¨IPµØÖ·»òÍøÂçµÄ·ÃÎÊ¡£Ç©ÃûURL£º¶ÔÓÚÃô¸Ð»ò¸¶·ÑÊÓÆµ£¬¿ÉÒÔÀûÓÃNginxµÄµÚÈý·½Ä£¿é£¨Èçngx_http_secure_link_module£©Éú³É?ÓÐʱЧÐÔµÄÇ©ÃûURL£¬·ÀÖ¹·Ç·¨·ÖÏí¡£
TLS/SSL¼ÓÃÜ£ºÊ¹ÓÃHTTPSÐÒé¶ÔÊÓÆµÁ÷½øÐмÓÃÜ£¬±£»¤´«Êä¹ý³ÌÖеÄÊý¾Ý°²È«¡£
¶ÔNginxÊÓÆµ·þÎñÆ÷½øÐÐÓÐЧµÄ¼à¿ØÒ²ÊDZز»¿ÉÉٵġ£Í¨¹ýNginxµÄ?stub_statusÄ£¿é£¬¿ÉÒÔʵʱ²é?¿´·þÎñÆ÷µÄÁ¬½ÓÊý¡¢ÇëÇóÊýµÈ¹Ø¼üÖ¸±ê¡£½áºÏPrometheus¡¢GrafanaµÈ¼à¿Ø¹¤¾ß£¬¿ÉÒÔ¹¹½¨ÍêÕûµÄÊÓÆµ·þÎñ¼à¿ØÌåϵ£¬¼°Ê±·¢Ïֺͽâ¾öDZÔÚÎÊÌâ¡£
ÔÚÕâ¸öÅäÖÃÖУ¬rtmp¿é¶¨ÒåÁËÒ»¸öRTMP·þÎñÆ÷£¬¼àÌý1935¶Ë¿Ú¡£applicationlive²¿·Ö¶¨ÒåÁËÒ»¸öÃûΪliveµÄÖ±²¥Ó¦Óã¬liveon;¿ªÆôÁËÖ±²¥¹¦ÄÜ¡£allowpublishºÍallowplay¿ØÖÆÁËÍÆÁ÷ºÍ²¥·ÅµÄȨÏÞ¡£
¸üÖØÒªµÄ?ÊÇ£¬nginx-rtmp-module»¹Ö§³Ö½«RTMPÁ÷ת»»ÎªHLS¸ñʽ¡£ÔÚhttp¿éÖеÄ/hlslocation£¬Í¨¹ýhlson;¡¢hls_pathºÍhls_fragmentµÈÖ¸Á¿ÉÒÔ½«RTMPÖ±²¥Á÷ʵʱµØ·Ö¸î³ÉHLSµÄ.m3u8Ë÷ÒýÎļþºÍ.tsÒôÊÓÆµÆ¬¶Î£¬·½±ãʹÓñê×¼µÄHTTPÐÒé½øÐв¥·Å¡£
Õ⼫´óµØ¼ò»¯ÁËÖ±²¥Á÷µÄ·Ö·¢£¬ÒòΪ¼¸ºõËùÓÐÉ豸ºÍä¯ÀÀÆ÷¶¼Ö§³ÖHTTPÐÒé¡£
ÖÁ´Ë£¬ÎÒÃÇÒѾ³õ²½Á˽âÁËNginxÔÚÊÓÆµ²¥·Å³¡¾°ÏµĻù´¡ÄÜÁ¦£¬°üÀ¨Í¨¹ýHTTPÖ±½Ó²¥·Åµã²¥ÊÓÆµ£¬ÒÔ¼°ÀûÓÃnginx-rtmp-moduleʵÏÖRTMPÖ±²¥ºÍHLSÁ÷ýÌåµÄÉú³É¡£ÒªÕæÕý´òÔìÒ»¸ö¸ßÐÔÄÜ¡¢¸ß¿ÉÓá¢Óû§ÌåÑé׿ԽµÄÊÓÆµ²¥·Åƽ̨£¬»¹ÐèÒª¸üÉîÈëµÄÓÅ»¯ºÍ¸ü¸ß¼¶µÄ¹¦ÄÜ¡£
NginxÊÓÆµ²¥·Å¸ß¼¶ÓÅ»¯Óëʵ¼ù£ºÊµÏÖ¼«ÖµÄÁ÷ýÌåÌåÑé