ÔÚÖÚ¶àµÄÊý×ÖÄÚÈݺ£ÑóÖУ¬ÊÓÆµÔçÒѳÉΪ×îÊܽӴýµÄ±í´ï·½·¨Ö®Ò»¡£´ÓË¢¶ÌÊÓÆµµ½Ô¢Ä¿¸ßÇåÓ°Ï·£¬Á÷ͨ¡¢Îȹ̵IJ¥·ÅÌåÑéÊÇÓû§×î»ù±¾µÄÐèÇó¡£¶øÔÚÕâ±³ºó£¬Ç¿Ê¢µÄ·þÎñÆ÷ÊÖÒÕÊÎÑÝ×ÅÖÁ¹ØÖ÷ÒªµÄ½ÇÉ«¡£½ñÌ죬ÎÒÃÇÒªÉîÈë̽Ìֵ쬼´ÊÇÁ÷ýÌåÁìÓòºÕºÕÖøÃûµÄ¡°ÈðÊ¿¾üµ¶¡±¡ª¡ª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;ĬÈÏÇéÐÎϲ»Â¼ÖÆÖ±²¥Á÷£¬ÈôÊÇÐèÒªÂ¼ÖÆ£¬¿ÉÒÔÉèÖÃΪ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µÄÁ÷ýÌåÐÒ飬ÒòÆä³ö?É«µÄ¿çƽ̨¼æÈÝÐÔºÍ×Ô˳ӦÄÜÁ¦£¬ÒѾ³ÉΪÊÂʵÉϵıê×¼¡£
±¾²¿·Ö£¬ÎÒÃǽ«ÉîÈë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µÄÉèÖÃÑ¡ÏîºÍÐÔÄÜÓÅ»¯¼¼ÇÉ£¬Äã¿ÉÒÔÓÐÓõؽâ¾öÊÓÆµ²¥·ÅÀú³ÌÖеÄÖÖÖÖÌôÕ½£¬ÎªÓû§´øÀ´Á÷ͨ¡¢Îȹ̡¢µÍÑÓ³ÙµÄԢĿÌåÑé¡£
ÎÞÂÛÊÇÊ×´´µÄÖ±²¥Æ½Ì¨£¬ÕվɳÉ?ÊìµÄÊÓÆµµã²¥·þÎñ£¬Nginx¶¼ÊÇÄãÖµµÃÐÅÈεÄǿʢºóÔ®¡£Óµ±§Nginx£¬¿ªÆôÄãµÄÊÓÆµÁ÷ýÌåÐÂÆªÕ°ɣ¡