Ò»¡¢Îձ𿨶٣ºNginxÈôºÎ³ÉΪÊÓÆµÓÅ»¯µÄ¡°¿ìÂʵ£ÈΡ±
ÔÚµ±½ñÐÅÏ¢±¬Õ¨µÄʱÆÚ£¬ÊÓÆµÒѾ³ÉΪ×îÊÜÓ½ÓµÄÄÚÈÝÏû·Ñ´ó¾ÖÖ®Ò»¡£ÎÞÂÛÊǽܳöµÄÈüÊÂÖ±²¥¡¢ÒýÈËÈëʤµÄÓ°ÊӾ缯£¬»¹ÊÇ»îÆÃÓÐȤµÄ½²ÊÚ¶ÌÆ¬£¬Á÷³©µÄÅÔ¹ÛÂÄÀúÊÇÓû§×î¸ù»ùÒ²ÊÇ×î³ÁÒªµÄÐèÒª¡£·þÎñÆ÷´ø¿í²»¼°¡¢ÍøÂçÑÓ³¤¡¢²¢·¢Óû§¹ý¶àµÈÎÊÌ⣬ʱʱÈÃÓû§ÔÚÅÔ¹ÛÊÓÆµÊ±¹ÄÊÜ¿¨¶Ù¡¢¼ÓÔØ»ºÂýÖ®¿à¡£
ÐÒÔ˵ÄÊÇ£¬Nginx£¬Õâ¸öÒԸ߻úÄÜ¡¢¸ß²¢·¢Öø³ÆµÄWeb·þÎñÆ÷£¬Æ¾½èÆä׳´óµÄÖ°ÄܺͽýݵÄÅäÖ㬿ÉÄܳÉΪ½â¾öÊÓÆµÓÅ»¯ÄÑÌâµÄ¡°¿ìÂʵ£ÈÎ?¡±¡£
NginxÖ®ËùÒÔÄÜÔÚÊÓÆµÓÅ»¯ÁìÓò´ó·ÅÒì²Ê£¬Àë²»¿ªÆä¾«ÃîµÄ¼Ü¹¹Éè¼ÆºÍһϵÁиßЧµÄÄ£¿é¡£NginxѡȡÊÂÎñÇý¶¯¡¢Òì²½·Ç×èÈûµÄ¹¤×÷ģʽ£¬ÕâÒâζ×ÅËüÄܹ»Í¬Ê±´¦ÖóÉǧÉÏÍò¸ö²¢?·¢Ïνӣ¬¶ø²»?»áÏñ´«Í³µÄApache·þÎñÆ÷ÄÇÑùΪÿ¸öÏνӴ´½¨Ò»¸ö¶ÀÁ¢µÄ¹ý³Ì»òÏß³Ì?£¬´Ó¶ø¼«´óµØ½µµÍÁË·þÎñÆ÷µÄ×ÊÔ´¿÷Ëð£¬ÌáÉýÁË´¦ÖÃÄÜÁ¦¡£
¶ÔÓÚÊÓÆµÕâÖÖ±ØÒª³ÖÐø¡¢´óÁ¿Êý¾Ý´«ÊäµÄÀûÓó¡¾°¶øÑÔ£¬ÕâÖÖ¸ßЧµÄ²¢·¢´¦ÖÃÄÜÁ¦ÊÇÖÁ¹Ø³ÁÒªµÄ¡£
Nginx׳´óµÄ»º´æ»úÔìÊÇʵÏÖÊÓÆµÓÅ»¯µÄ¹Ø¼üÖ®Ò»¡£Í¨¹ýÅäÖÃNginxµÄproxy_cache»òfastcgi_cacheµÈÄ£¿é£¬ÎÒÃÇÄܹ»½«Óû§ÒªÇó¹ýµÄÊÓÆµÎļþ»º´æÔÚ·þÎñÆ÷±¾µØ»òCDN±ßÔµ½Úµã¡£µ±?ÆäËûÓû§ÔÙ´ÎÒªÇóͳһÊÓÆµÊ±£¬NginxÄܹ»Ö±½Ó´Ó»º´æÖжÁÈ¡Êý¾Ý²¢·µ»Ø£¬ÎÞÐèÔÙ´ÎÏòÔ´·þÎñÆ÷ÌáÒéÒªÇ󣬴ó?´óËõ¶ÌÁËÏìÓ¦¹¦·ò£¬¼õÇáÁËÔ´·þÎñÆ÷µÄѹÁ¦¡£
¸ü³ÁÒªµÄÊÇ£¬NginxµÄ?»º´æÄܹ»ÅäÖÃΪÖÇÄÜ»º´æ£¬ÀýÈçÆ¾¾ÝÒªÇóÍ·ÐÅÏ¢£¨ÈçIf-Modified-Since£©À´ÅжÏ×ÊÔ´ÊÇ·ñÒѸüУ¬±Ü?Ã⻺´æ¹ýÆÚʧЧ£¬Í¬Ê±Ò²ÄÜÓÐЧÀûÓûº´æ?¿Õ¼ä¡£¶ÔÓÚÊÓÆµÕâÖÖÌåÁ¿´ó¡¢¸üÐÂÆµÂÊÏà¶Ô½ÏµÍµÄÄÚÈÝ£¬»º´æµÄ×÷ÓÃÓÈΪÏÔÖø¡£
ÔÙÕߣ¬Nginx¶ÔHTTP/2ºÍHTTP/3ºÍ̸µÄÓÅÁ¼Ö§³Ö£¬ÎªÊÓÆµ´«Êä´øÀ´Á˸ïÃüÐÔµÄÌáÉý¡£HTTP/2ÒýÈëÁ˶à·¸´Óã¨Multiplexing£©¼¼Êõ£¬ÔÊÐí¿Í»§¶Ëͨ¹ýµ¥¸öTCPÏνӲ¢Ðз¢ËͶà¸öÒªÇ󣬲¢ÔÚ·þÎñÆ÷¶Ë²¢Ðд¦Ö㬶øºóÔÚͳһ¸öÏνÓÉÏÒÔÂÒÐòµÄ·½Ê½·µ»ØÏìÓ¦¡£
ÕâÒâζ׿´±ãÔÚ´«ÊäÊÓÆµµÄ¸÷¸ö·Ôì¬Ê±£¬ÆäËû×ÊÔ´£¨ÈçͼƬ¡¢CSS¡¢JavaScript£©Ò²Äܹ»Í¬Ê±±»¼ÓÔØ£¬¼«´óµØÏ÷¼õÁËÏνӳÉÁ¢µÄ¿ªÏúºÍ¶ÓÍ·×èÈû£¨Head-of-LineBlocking£©ÎÊÌ⣬ÏÔÖøÌáÉýÁËÒ³Ãæ¼ÓÔØ¿ìÂʺÍÊÓÆµ²¥·ÅµÄÕØÊ¼¿ìÂÊ¡£¶ø¼´½«±é¼°µÄHTTP/3£¬¸üÊÇ»ùÓÚQUICºÍ̸£¬½øÒ»²½½â¾öÁËTCPÔÚÍøÂç²»ÎȰ´Ê±µÄÓµÈû½ÚÔìÎÊÌ⣬´øÀ´Á˸üµÍµÄÑÓ³¤ºÍ¸ü¸ßµÄÍÌÍÂÁ¿¡£
Nginx׳´óµÄGzipºÍBrotliѹËõÖ°ÄÜ£¬Ò²ÄÜÔÚÊÓÆµ´«Êä¹ý³ÌÖвûÑï³ÁÒª×÷Ó᣹ÌÈ»ÊÓÆµÎļþ×ÔÉíͨ³£ÒѾÊǸ߶ÈѹËõµÄÌåʽ£¨ÈçH.264,H.265,VP9µÈ£©£¬µ«ÊÓÆµ²¥·ÅÆ÷ÔÚÒªÇóÊÓÆµµÄÔªÊý¾ÝÎļþ£¨Èç.m3u8²¥·ÅÁÐ±í¡¢.mpdÇåµ¥Îļþ£©Ê±£¬ÕâЩÎı¾ÎļþÄܹ»Í¨¹ýGzip»òBrotli½øÐÐѹËõ£¬Ï÷¼õ´«ÊäÁ÷Á¿£¬¼Ó¿ì½âÎö¿ìÂÊ¡£
¸ü³ÁÒªµÄÊÇ£¬¶ÔÓÚһЩ·ÇÊÓÆµÄÚÈݵĸ¨Öú×ÊÔ´£¬Èç×ÖÄ»Îļþ¡¢JavaScriptÎļþµÈ£¬GzipºÍBrotliµÄѹËõ³ÉЧ½«¸üΪÏÔÖø£¬Ö±½ÓÌáÉýÁËÕûÌåµÄ¼ÓÔØÐ§ÄÜ¡£
Nginx»¹ÌṩÁËÁ÷Á¿½ÚÔ죨RateLimiting£©Ö°ÄÜ£¬ÕâÔÚÊÓÆµ·Ö·¢³¡?¾°ÏÂÓÈΪ³ÁÒª¡£Í¨¹ýÅäÖÃlimit_req_zoneºÍlimit_reqÖ¸ÁÎÒÃÇÄܹ»Ï޶ȵ¥Ôª¹¦·òÄÚÀ´×ÔͳһIPµØÖ·µÄÒªÇóÊýÁ¿£¬ÓÐЧԤ·ÀÒò¶ñÒâÅÀ³æ»òÍ»·¢Á÷Á¿¹¥»÷µ¼Ö·þÎñÆ÷¹ýÔØ£¬´Ó¶ø±£ÕÏÕý³£Óû§¿ÉÄÜ»ñµÃ²»±äÁ÷³©µÄÅÔ¹ÛÂÄÀú¡£
¾«ÃܵÄÁ÷Á¿½ÚÔìÒ²Äܹ»Öú?ÖúÔËÓªÉ̸üºÃµØÖÎÀí´ø¿í×ÊÔ´£¬Ô¤·ÀijЩÓû§¹ý¶È¿÷Ëð´ø¿í¶øÓ°ÏìÆäËûÓû§µÄ·þÎñÖÊÁ¿¡£
NginxÔÚHTTPS¼ÓÃÜ·½ÃæµÄÖ§³Ö?Ò²ÊÇÊÓÆµÓÅ»¯µÄÒ»¸ö³ÁÒª×é³É?²¿ÃÅ¡£¹ÌÈ»¼ÓÃÜ»á´øÀ´¿Ï¶¨µÄ»úÄÜ¿ªÏú£¬µ«¶ÔÓÚ±£»¤Óû§ÒþÖÔºÍÊý¾Ý°²È«ÖÁ¹Ø³ÁÒª¡£Nginx¿ÉÄܸßЧµØ´¦?ÀíTLS/SSLÎÕÊÖ£¬²¢Í¨¹ýÖîÈçOCSPStapling¡¢SessionResumptionµÈ¼¼ÊõÀ´ÓÅ»¯HTTPSµÄ»úÄÜ£¬×î´óÏ޶ȵØÏ÷¼õ¼ÓÃÜ´øÀ´µÄÑÓ³¤£¬È·±£ÊÓÆµ´«ÊäµÄ°²È«Óë¸ßЧ¡£
×ܶøÑÔÖ®£¬Nginxͨ¹ýÆäÊÂÎñÇý¶¯¼Ü¹¹¡¢×³´óµÄ»º´æ?»úÔì¡¢¶Ô×îÐÂHTTPºÍ̸µÄÖ§³Ö¡¢¸ßЧµÄ?ѹËõËã·¨¡¢¾«ÃܵÄÁ÷Á¿½ÚÔìÒÔ¼°ÓÅ»¯µÄHTTPSʵÏÖ£¬¿ÉÄÜÈ«ÃæÌáÉýÊÓÆµÄÚÈݵĴ«?ÊäЧÄܺÍÓû§ÂÄÀú£¬ÊÇʵÏÖ¡°Nginx100%ÊÓÆµÓÅ»¯¡±²»³É»òȱµÄÀûÆ÷¡£
½ÓÏÂÀ´µÄ?part2£¬ÎÒÃǽ«Éî¿Ì̽Çó¾ßÌåµÄÅäÖòß?ÂÔºÍʵ¼Ê¼¼ÇÉ£¬ÖúÄúÇáËɹ¹½¨¼«ÖÂÁ÷³©µÄÊÓÆµ·þÎñ¡£
ÔÚÀí½âÁËNginxÔÚÊÓÆµÓÅ»¯·½ÃæµÄÖ÷ÌâÓÅÊÆºó£¬½ÓÏÂÀ´ÎÒÃǽ«Éî¿Ì̽Çó¾ßÌåµÄÅäÖÃÕ½ÊõºÍʵ¼Ê¼¼ÇÉ£¬ÈÃÄú¿ÉÄܽ«NginxµÄDZÁ¦²ûÑïµ½¼«Ö£¬ÕæÕýʵÏÖ¡°100%ÊÓÆµÓÅ»¯¡±¡£
NginxµÄproxy_cacheÄ£¿éÊÇʵÏÖ¸ßЧ»º´æµÄ¹Ø¼ü¡£¶ÔÓÚÊÓÆµÎļþ£¬ÎÒÃÇͨ³£±ØÒªÅäÖÃÒ»¸öרÃŵĻº´æÇøÓò£¬²¢ÉèÖúÏÀíµÄ¹ýÆÚ¹¦·ò¡£
http{proxy_cache_path/var/cache/nginxlevels=1:2keys_zone=video_cache:100mmax_size=10ginactive=60muse_temp_path=off;server{listen80;server_nameyour_video_domain.com;location~*\.(mp4|mkv|avi|mov|flv|webm)${proxy_passhttp://your_backend_video_server;proxy_cachevideo_cache;proxy_cache_valid20030210m;#»º´æ200ºÍ302״̬ÂëµÄÏìÓ¦10·ÖÖÓproxy_cache_valid4041m;#»º´æ404״̬ÂëµÄÏìÓ¦1·ÖÖÓproxy_cache_key"$scheme$request_method$host$request_uri";add_headerX-Cache-Status$upstream_cache_status;}#...ÆäËûÅäÖÃ...}}proxy_cache_path:½ç˵ÁË»º´æÎļþµÄ´æ´¢õè¾¶¡¢²ã¼¶¡¢»º´æÇøÓòÃû³Æ£¨video_cache£©¡¢ÄÚ´æ¹²ÏíÇø´óС£¨100m£©¡¢×î´ó»º´æ¿Õ¼ä£¨10g£©¡¢»º´æÎļþ²»?½Ó¼ûµÄ¹ýÆÚ¹¦·ò£¨60m£©¡£
use_temp_path=offÄܹ»Ô¤·À¶î±íµÄ´ÅÅÌI/O¡£location~*\.(mp4|mkv|avi|mov|flv|webm)$:Æ¥Åä³£¼ûµÄÊÓÆµÎļþºó׺¡£proxy_passhttp://your_backend_video_server;:Ö¸¶¨ºó¶ËÊÓÆµÔ´·þÎñÆ÷¡£
proxy_cachevideo_cache;:ÆôÓÃÃûΪvideo_cacheµÄ»º´æÇøÓò¡£proxy_cache_valid20030210m;:ÉèÖöÔHTTP״̬ÂëΪ200ºÍ302µÄÏìÓ¦£¬»º´æ10·ÖÖÓ¡£ÄúÄܹ»Æ¾¾ÝÊÓÆµÄÚÈݵĸüÐÂÆµÂʵ÷ÕûÕâ¸ö¹¦·ò¡£
proxy_cache_key"$scheme$request_method$host$request_uri";:½ç˵»º´æµÄ¼ü£¬È·±£·ÖÆçµÄÒªÇó¿ÉÄÜÕýÈ·Æ¥Åäµ½»º´æ¡£add_headerX-Cache-Status$upstream_cache_status;:Ôö³¤Ò»¸öÏìӦͷ£¬·½±ãÄú²é¿´»º´æÉäÖÐÇé¿ö£¨HIT¡¢MISS¡¢EXPIREDµÈ£©¡£
È·±£ÄúµÄ?Nginx°æ?±¾Ö§³ÖHTTP/2»òHTTP/3£¬²¢ÔÚ·þÎñÆ÷ÅäÖÃÖÐÆôÓÃËüÃÇ¡£
server{listen443sslhttp2;#ÆôÓÃSSLºÍHTTP/2server_nameyour_video_domain.com;ssl_certificate/path/to/your/certificate.crt;ssl_certificate_key/path/to/your/private.key;#...ÆäËûSSLÓйØÅäÖÃ...location/{#...ÄãµÄÆäËûlocationÅäÖÃ...}}
ÈôÊÇÄúʹÓõÄÊǽÏа汾µÄNginx£¬²¢ÇÒ·þÎñÆ÷ÒѾ²¿ÊðÁËQUICÄ£¿é£¬Äú»¹Äܹ»ÅäÖÃHTTP/3£º
server{listen443sslhttp2quicreuseport;#ÆôÓÃSSL,HTTP/2,QUICserver_nameyour_video_domain.com;#...SSLºÍQUICÓйØÅäÖÃ...location/{#...ÄãµÄÆäËûlocationÅäÖÃ...}}
HTTP/2ºÍHTTP/3µÄÀûÓ㬳ö¸ñÊÇÆä¶à·¸´ÓøöÐÔ£¬¿ÉÄÜÏÔÖøÏ÷¼õÊÓÆµ²¥·Å¹ý³ÌÖÐÒò¶à¸ö·Ôì¬ÒªÇó¶ø²úÉúµÄ?ÑÓ³¤£¬´ó?·ùÌáÉýÊÓÆµµÄÆô¶¯¿ìÂʺÍÕûÌåµÄÁ÷³©¶È¡£
¹ÌÈ»ÊÓÆµ×ÔÉíÄÑÒÔѹËõ£¬µ«ÊÓÆµ²¥·ÅÁÐ±í£¨.m3u8,.mpd£©ºÍ×ÖÄ»ÎļþµÈ¸¨Öú×ÊÔ´£¬È´Äܹ»ÊÜÒæÓÚGzip»òBrotliѹËõ¡£
http{gzipon;gzip_typestext/plaintext/cssapplication/jsonapplication/javascripttext/xmlapplication/xmlapplication/xml+rsstext/javascriptimage/svg+xml;gzip_comp_level6;gzip_min_length1024;#ÈôÊÇ×°ÖÃÁËBrotliÄ£¿é£¬Äܹ»Ë¼¿¼Ê¹ÓÃBrotli#brotlion;#brotli_typestext/plaintext/cssapplication/jsonapplication/javascripttext/xmlapplication/xmlapplication/xml+rsstext/javascriptimage/svg+xml;#brotli_comp_level4;#brotli_min_length1024;#...ÆäËûÅäÖÃ...}gzipon;:ÆôÓÃGzipѹËõ¡£
gzip_types:Ö¸¶¨±ØÒªÑ¹ËõµÄMIMEÀàÐÍ¡£gzip_comp_level:GzipѹËõ¼¶±ð£¬¼¶±ðÔ½¸ßѹËõÂÊÔ½¸ß£¬µ«CPU¿÷ËðÒ²Ô½´ó¡£gzip_min_length:Ö¸¶¨×îÓ×ѹËõ³¤¶È£¬Ó×Óڴ˳¤¶ÈµÄ²»?»á±»Ñ¹Ëõ¡£
¶ÔÓÚÃæÏòÈ«ÇòÓû§µÄÊÓÆµ·þÎñ£¬ÓëCDN(ContentDeliveryNetwork)¼¯³ÉÊDZز»?¿ÉÉٵġ£NginxÄܹ»×÷ΪCDNµÄ»ØÔ´·þÎñÆ÷£¬»òÕßÖ±½Ó×÷Ϊ±ßÔµ½Úµã²¿Êð¡£
×÷Ϊ»ØÔ´·þÎñÆ÷:ÅäÖÃNginxµÄproxy_cacheÖ¸ÏòCDNµÄ»º´æ½Úµã£¬µ±CDN½Úµã»º´æÊ§Ð§Ê±£¬ÒªÇó»á»ØÔ´µ½Nginx¡£×÷Ϊ±ßÔµ½Úµã:Ö±½Ó²¿ÊðNginx×÷ΪCDNµÄ±ßÔµ½Úµã£¬³ä?·ÖÀûÓÃNginxµÄ¸ß»úÄÜ»ººÍ´æÄÜÁ¦£¬ÎªÓû§Ìṩ×î¼±¾ç¶ÈµÄÊÓÆµ·þÎñ¡£
ΪÁËÓ¦¶ÔÍ»·¢Á÷Á¿ºÍDZÔڵĹ¥»÷£¬ÅäÖÃÁ÷Á¿½ÚÔìÊDZØÒªµÄ¡£
http{#½ç˵һ¸öÇøÓò£¬Ã¿ÃëÔÊÐí100¸öÒªÇó£¬ÁîÅÆÍ°ÈÝÁ¿Îª100limit_req_zone$binary_remote_addrzone=mylimit:10mrate=100r/s;server{#...location~*\.(mp4|mkv|avi|mov|flv|webm)${proxy_passhttp://your_backend_video_server;proxy_cachevideo_cache;proxy_cache_valid20030210m;proxy_cache_valid4041m;proxy_cache_key"$scheme$request_method$host$request_uri";add_headerX-Cache-Status$upstream_cache_status;limit_reqzone=mylimitburst=100nodelay;#ÀûÓÃÁ÷Á¿ÏÞ¶È}#...}}limit_req_zone:½ç˵һ¸öÃûΪmylimitµÄÇøÓò£¬ÒÔ¿Í»§¶ËIP($binary_remote_addr)×÷Ϊ±êʶ£¬ÔÊÐíÿÃë100¸öÒªÇó£¬ÁîÅÆÍ°ÈÝÁ¿Îª100¡£
limit_reqzone=mylimitburst=100nodelay;:ÔÚlocationÖÐÀûÓøÃÏÞ¶È£¬burst=100ÔÊÐí¶ÌÔݵij¬³öÏÞ¶È£¬nodelay°µÊ¾³¬³öÏ޶ȵÄÒªÇóµ±¼´±»»Ø¾ø¡£
¶ÔÓÚHLS(HTTPLiveStreaming)ºÍDASH(DynamicAdaptiveStreamingoverHTTP)µÈ×ÔÊÊÓ¦±ÈÌØÂÊÁ÷ýÌåºÍ̸£¬NginxͬÑù²û·¢½Ü³ö¡£Æä¸ßЧµÄÎļþ´«ÊäÄÜÁ¦Äܹ»È·±£.ts»ò.m4sµÈýÌå·Ô쬿ÉÄܼ±¾ç¡¢²»±äµØ´«Ê䏸Óû§¡£
¹²Í¬»º´æ£¬¼´±ãÊÇÅÔ¹ÛÈȵãÊÓÆµ£¬Ò²Äܱ£Õϼ«¸ßµÄ²¢·¢³ÐÔØÄÜÁ¦¡£
ͨ¹ýÒÔÉÏÕâЩÅäÖÃÕ½ÊõµÄ×éºÏÀûÓã¬ÄúÄܹ»³ä·ÖÍÚ¾òNginxµÄDZÁ¦£¬´òÔìÒ»¸ö»úÄÜ׿Խ¡¢ÂÄÀú¼«ÖµÄÊÓÆµ·þÎñƽ̨¡£Îձ𿨶٣¬Óµ±§Á÷³©£¬ÈÃÄúµÄÓû§ÔÚÅÔ¹ÛÊÓÆµÊ±£¬ÏíÊܵ½Ç°ËùδÓеijÁ½þʽÂÄÀú£¡