Nginx100%ÊÓÆµ»úÄÜ£º²»½ö½öÊÇWeb·þÎñÆ÷£¬¸üÊÇÁ÷ýÌåµÄÍõÕß
ÔÚµ±½ñÐÅÏ¢±¬Õ¨µÄʱÆÚ£¬ÊÓÆµÄÚÈÝÒÑÈ»³ÉΪÐÅÏ¢´«²¼ºÍÓéÀÖÏû·ÑµÄÖ÷Á÷¡£´Ó¸ßÇåµçÓ°¡¢ÔÚÏ߿γ̵½Ö±²¥»¥¶¯£¬Óû§¶ÔÊÓÆµµÄÁ÷³©¶ÈºÍ¼ÓÔØ¿ì¶Å×Ð׎üºõ¿Ì±¡µÄ?ÒªÇó¡£¶øÔÚÕⳡºäºäÁÒÁÒµÄÁ÷ýÌå¸ïÉäÖУ¬Nginx£¬Õâ¸öÒԸ߻úÄÜ¡¢¸ß²¢·¢Öø³ÆµÄWeb·þÎñÆ÷£¬Õýƾ½èÆä׳´óµÄÄÜÁ¦£¬Öð²½ÏÔ¶³öÆäÔÚÊÓÆµÁ÷ýÌåÁìÓò¡°ÍõÕß¡±µÄDZÖÊ¡£
ºÜ¶àÈË¿ÉÄÜÖ»½«NginxÊÓΪ²¿ÊðÍøÕ¾µÄÀûÆ÷£¬Êâ²»Öª£¬Í¨¹ý¾«ÃîµÄÅäÖúÍÉî¿ÌµÄÀí½â£¬Nginx¿ÉÄܽ«ÊÓÆµ´«ÊäµÄ»úÄÜÌáÉýÖÁ¼«Ö£¬ÊµÏÖ¿¿½ü¡°100%¡±µÄ»úÄܲû·¢¡£Õâ²¢·Ç¿ä´óµÄÐû´«£¬¶øÊÇ»ùÓÚNginx¹ÖÒì¼Ü¹¹ºÍ·á˶ģ¿éµÄÉî¶ÈÍÚ¾ò¡£
NginxÖ®ËùÒÔÄÜÔÚÊÓÆµÁìÓò´ó·ÅÒì²Ê£¬ÓëÆä¸ßЧµÄÊÂÎñÇý¶¯¡¢Òì²½·Ç×èÈûI/OÄ£ÐÍÃܲ»³É·Ö¡£´«Í³µÄ·þÎñÆ÷Ä£ÐÍÍùÍùѡȡ¹ý³Ì/Ïß³Ì?Ä£ÐÍ£¬Ã¿¸öÏνӶ¼±ØÒª¿÷ËðÒ»¸ö¹ý³Ì»òỊ̈߳¬Ôڸ߲¢·¢³¡¾°Ï£¬×ÊÔ´¿÷Ëð¾Þ´ó£¬»úÄÜÆ¿¾±ËæÖ®¶øÀ´¡£¶øNginxÔòͨ¹ýÊÂÎñÇý¶¯»úÔ죬¿ÉÄÜÓü«ÉٵĹý³Ì/Ïß³Ì?´¦ÖóÉǧÉÏÍòµÄ²¢·¢Ïνӡ£
¶ÔÓÚÊÓÆµÁ÷ýÌå¶øÑÔ£¬ÕâÒâζ×ÅNginxÄܹ»¸ßЧµØ´¦ÖôóÁ¿¿Í»§¶ËͬʱҪÇóÊÓÆµ×ÊÔ´£¬¶ø²»»áÓÉÓÚÏνÓÊý¼¤Ôö¶øµ¼Ö»úÄÜÖè½µ¡£
¸ü³ÁÒªµÄÊÇ£¬NginxµÄÄÚ´æÖÎÀí»ººÍ³åÇø»úÔìҲΪÆäÊÓÆµ»úÄܵÄ׿Խ²û·¢µì¶¨ÁË»ù´¡?¡£Ëü¿ÉÄÜÓÐЧµØÖÎÀíÄڴ棬Ï÷¼õ²»ÓÃÒªµÄÄڴ濽±´£¬²¢Í¨¹ý¾«ÃܵĻº³åÇø½ÚÔ죬ÓÅ»¯Êý¾ÝÔÚÍøÂç´«?ÊäÖеÄÁ÷¶¯£¬´Ó¶ø½µµÍÑÓ³¤£¬Ìá¸ßÍÌÍÂÁ¿¡£
Nginx²¢·ÇÌìÉú¾ÍÊÇÊÓÆµÁ÷ýÌå·þÎñÆ÷£¬µ«Æä׳´óµÄÀ©´óÐÔÔÊÐíÎÒÃÇͨ¹ý¼ÓÔØÌØ¶¨µÄÄ£¿éÀ´¸³ÓèËü׳´óµÄ?ÊÓÆµ´¦ÖÃÄÜÁ¦¡£
RTMPÄ£¿é£ºÖ±²¥µÄÖ÷ÌâÒýÇæ¶ÔÓÚʵʱÊÓÆµÁ÷£¬RTMP(Real-TimeMessagingProtocol)ÊÇĿǰ×îÖ÷Á÷µÄºÍ̸֮һ¡£Í¨¹ý×°ÖÃnginx-rtmp-module£¬NginxÄܹ»ÇáËÉתÐÍΪ׳´óµÄRTMP·þÎñÆ÷¡£
Ëü¿ÉÄܽӹÜÀ´×ÔOBS¡¢FFmpegµÈÍÆÁ÷¶ËµÄÊÓÆµÁ÷£¬²¢½«Æä·Ö·¢¸ø´óÁ¿¹Û¶à¡£Õâ¸öÄ£¿é²»½öÖ§³ÖRTMPÍÆÁ÷ºÍ²¥·Å£¬»¹ÌṩÁËHLS(HTTPLiveStreaming)ºÍDASH(DynamicAdaptiveStreamingoverHTTP)µÄתÂëºÍ·Ö·¢ÄÜÁ¦£¬¼«´óµØÀ©´óÁËNginxµÄÊÓÆµ´¦ÖÃÁìÓò¡£
HTTPÄ£¿é£ºµã²¥µÄ¼áʵºóÔ®¶ÔÓÚÊÓÆµµã²¥£¬NginxµÄÔÉúHTTPÄ£¿éÒѾ×㹻׳´ó¡£Í¨¹ýÅäÖÃsendfileÖ¸ÁNginxÄܹ»ÊµÏÖÁ㿽±´µÄÎļþ´«Ê䣬½«ÊÓÆµÎļþÖ±½Ó´Ó´ÅÅÌ·¢Ë͵½ÍøÂç½Ó¿Ú£¬´ó´óÏ÷¼õCPUµÄ¿ªÏúºÍÄڴ濽±´µÄ´ÎÊý¡£
aio(AsynchronousI/O)µÄÖ§³Ö½øÒ»²½ÌáÉýÁËNginx´¦ÖôóÎļþI/OµÄЧÄÜ¡£
ProxyÄ£¿é£º¹¹½¨×³´óµÄCDN¼Ü¹¹µ±ÊÓÆµÁ÷Á¿¾Þ´óʱ£¬µ¥Ì¨Nginx·þÎñÆ÷ÄÑÒÔÖ§³Ö¡£NginxµÄproxy_passÖ¸ÁîʹÆä³ÉΪ¹¹½¨ÄÚÈÝ·Ö·¢ÍøÂç(CDN)µÄÃÎÏëÑ¡Ôñ¡£Í¨¹ý½«Nginx×÷Ϊ»ØÔ´·þÎñÆ÷»ò±ßÔµ½Úµã£¬Äܹ»½«ÊÓÆµÄÚÈÝ»º´æµ½ÀëÓû§¸ü½üµÄ´¦Ëù£¬´ó·ùËõ¶Ì½Ó¼ûÑÓ³¤?£¬Ìá¸ß²¥·ÅÂÄÀú¡£
¡°100%»úÄÜ¡±²¢·Ç¾ø¶ÔµÄÊý×Ö£¬¶øÊÇÖ¸ÔÚÌØ¶¨Ó²¼þºÍÍøÂç»·¾³Ï£¬Nginx¿ÉÄÜ×î´ó»¯µØÀûÓÃϵͳ×ÊÔ´£¬´ïµ½ÀíÂÛÉϵļ«Ö´«ÊäЧÄÜ¡£ÒªÊµÏÖÕâÒ»µã£¬±ØÒª´Ó¶à¸öά¶È½øÐÐÉî¿ÌµÄÓÅ»¯£º
RTMP£ºÈ·±£RTMPÄ£¿éÅäÖúÏÀí£¬ÀýÈçÉèÖÃÊʵ±µÄchunk_size¡¢bufferµÈ²ÎÊý£¬ÒÔÆ¥ÅäÍÆÁ÷¶ËºÍ²¥·Å¶ËµÄÍøÂçÇé¿ö¡£HLS/DASH£ºNginx-rtmp-moduleÖ§³Ö½«RTMPÁ÷ת»»ÎªHLS/DASH£¬ÕâÁ½ÖÖºÍ̸ÀûÓÃHTTP½øÐд«Ê䣬¸üÒ×ÓÚ´©Í¸·À»ðǽ£¬ÇÒÓµÓÐÓÅÁ¼µÄ×ÔÊÊÓ¦ÂëÂÊÄÜÁ¦¡£
¹Ø¼üÔÚÓÚÅäÖúÃÇÐÆ¬Ê±³¤¡¢±àÂë²ÎÊýÒÔ¼°´ò°ü¾àÀ룬ÒÔÆ½ºâ²¥·ÅµÄÁ÷³©ÐÔºÍʵʱÐÔ¡£HTTPµã²¥£º¶ÔÓÚMP4µÈÎļþ£¬Ö±½ÓʹÓÃNginxµÄHTTP·þÎñ£¬¹²Í¬sendfileon;¡¢tcp_nopushon;¡¢tcp_nodelayon;µÈÖ¸ÁÄܹ»ÏÔÖøÌáÉý´«ÊäЧÄÜ¡£
ÄÚ´æÓ뻺³åÇøµÄ¾«Ãܵ÷ÓÅ£ºNginxµÄclient_body_buffer_size¡¢proxy_buffer_size¡¢proxy_buffersµÈ²ÎÊý£¬ÒÔ¼°RTMPÄ£¿éµÄbuffer¡¢max_chunk_sizeµÈ£¬¶¼±ØÒªÆ¾¾ÝÏÖʵÁ÷Á¿ºÍÊÓÆµ¸öÐÔ½øÐе÷Õû¡£
¹ýÓ׵Ļº³åÇø¿ÉÄܵ¼ÖÂÆµÈÔµÄI/O²Ù×÷£¬¹ý´óµÄ»º³åÇøÔò¿ÉÄÜÀË·ÑÄÚ´æ¡£
²¢·¢ÏνӵÄÖÎÀí£ºworker_processes¡¢worker_connectionsÊÇNginx´¦Öø߲¢·¢µÄ¹Ø¼ü²ÎÊý¡£±ØÒªÆ¾¾Ý·þÎñÆ÷CPUÖ÷ÌâÊýºÍÄÚ´æ´óÓ×À´ºÏÀíÉèÖá£keepalive_timeoutµÄÉèÖÃÒ²Ó°Ïì×ÅÏνӵÄ?¸´ÓÃÂÊ¡£
»º´æ?Õ½ÊõµÄÓÅ»¯£º¶ÔÓÚ¸ßÆµ½Ó¼ûµÄÊÓÆµ£¬ÀûÓÃNginxµÄproxy_cacheÖ°ÄÜÄܹ»¼«´óµØ¼õÇáºó¶Ë·þÎñÆ÷µÄѹÁ¦¡£ÉèÖúÏÀíµÄ»º´æ¼ü¡¢»º´æ¹ýÆÚ¹¦·òÒÔ¼°»º´æÄÚÈÝ£¬¿ÉÄÜÏÔÖøÌáÉýµã²¥µÄÏìÓ¦¿ìÂÊ¡£
Ó²¼þÓëÍøÂçµÄÐͬ£ºNginxµÄ?»úÄܲûÑïÒ²Êܵ½?µ×²ãÓ²¼þºÍÍøÂç»·¾³µÄÔìÔ¼¡£SSDÓ²ÅÌ¡¢¸ß´ø¿íÍø¿¨¡¢µÍÑÓ³¤µÄÍøÂçÏνӣ¬ÒÔ¼°ÓÅ»¯µÄÍøÂçºÍ̸ջ£¬¶¼ÊÇʵÏÖ¡°100%¡±ÊÓÆµ»úÄܲ»³É»òȱµÄ×é³É²¿ÃÅ¡£
Nginx100%ÊÓÆµ»úÄÜ£º´Ó»ù´¡ÅäÖõ½¸ß¼¶½ø½×µÄÈ«·½Î»½âÎö
ÔÚÉÏÒ»²¿ÃÅ£¬ÎÒÃÇÉî¿Ì̽ÇóÁËNginxÔÚÊÓÆµÁ÷ýÌåÁìÓòµÄÖ÷ÌâÓÅÊÆ¼°ÆäʵÏÖ¡°100%¡±»úÄܵÄÀíÂÛ»ù´¡¡£´Ë¿Ì£¬ÎÒÃǽ«¾Û½¹ÓÚ¾ßÌåµÄʵ¼Ê²ãÃæ£¬´Ó»ù´¡ÅäÖö¯ÊÖ£¬Öð²½½ø½×µ½¸ü¸ß¼¶µÄÓÅ»¯¼¼ÇÉ£¬Ô®ÊÖÄúÕæÕý½âËøNginxµÄÊÓÆµÁ÷ýÌåDZÁ¦¡£
¶ÔÓÚÊÓÆµÁ÷ýÌ壬×î³£¼ûµÄÁ½ÖÖ³¡¾°ÊÇÊÓÆµÖ±²¥ºÍÊÓÆµµã²¥¡£
RTMPÖ±²¥·þÎñÆ÷´î½¨(ʹÓÃnginx-rtmp-module)
Äú±ØÒª±àÒë×°ÖÃNginx²¢Ô̺¬nginx-rtmp-module¡£×°ÖÃʵÏÖºó£¬ÔÚNginxµÄÖ÷ÅäÖÃÎļþnginx.confÖÐÔö³¤rtmp¿é£º
worker_processesauto;events{worker_connections1024;#ƾ¾Ý·þÎñÆ÷ÄÜÁ¦µ÷Õû}http{#...ÄúµÄhttpÅäÖÃ...}rtmp{server{listen1935;#RTMPĬÈ϶˿Úchunk_size4096;#µ÷ÕûÒÔÊÊÓ¦·ÖÆçÍøÂç»·¾³applicationlive{liveon;recordoff;#ƾ¾Ý±ØÒª¿ªÆô¼Ôì#HLS/DASHתÂëÓë·Ö·¢hlson;hls_path/tmp/hls;#HLSƬ¶Î´æ´¢Ä¿Â¼hls_fragment3s;#HLSÇÐÆ¬Ê±³¤hls_playlist_length60s;#HLS²¥·ÅÁÐ±í³¤¶Èdashon;dash_path/tmp/dash;#DASHƬ¶Î´æ´¢Ä¿Â¼dash_fragment2s;#DASHÇÐÆ¬Ê±³¤dash_playlist_length30s;#DASH²¥·ÅÁÐ±í³¤¶È}}}
ÅäÖÃʵÏÖºó£¬Æô¶¯Nginx¡£´Ëʱ£¬ÄúÄܹ»Ê¹ÓÃOBSµÈÍÆÁ÷Èí¼þ£¬½«ÊÓÆµÁ÷ÍÆË͵½rtmp://your_server_ip/live/stream_name£¬¶øºóͨ¹ýHLS(ÀýÈçhttp://your_server_ip/hls/stream_name.m3u8)»òDASH²¥·Å¡£
¶ÔÓÚÊÓÆµµã²¥£¬NginxµÄÔÉúHTTPÖ°Äܼ´¿ÉʤÈΡ£Ö»Ð轫ÊÓÆµÎļþ·ÅÔÚNginxµÄrootĿ¼Ï£¬²¢È·±£?sendfileºÍtcp_nopushµÈÖ¸Áî±»ÆôÓãº
http{sendfileon;tcp_nopushon;tcp_nodelayon;keepalive_timeout65;server{listen80;server_nameyour_domain.com;root/var/www/html/videos;#´æ·ÅÊÓÆµÎļþµÄĿ¼location/{autoindexon;#¿ÉÑ¡£¬ÓÃÓÚչʾÎļþÁбí}#Õë¶ÔÌØ¶¨ÊÓÆµÌåʽµÄÓÅ»¯(¿ÉÑ¡)location~*\.(mp4|mov|avi)${add_headerCache-Controlpublic;add_headerExpires1y;}}}
ÕâÑù£¬Óû§¾ÍÄܹ»Í¨¹ýhttp://your_domain.com/your_video.mp4À´½Ó¼ûÊÓÆµ¡£
»ù´¡?ÅäÖÃÖ»ÊÇÆðÍ·£¬ÒªÊµÏÖ¡°100%¡±µÄÊÓÆµ»úÄÜ£¬»¹±ØÒª½øÐÐһϵÁÐÉî¿ÌµÄÓÅ»¯¡£
worker_connections£ºÆ¾¾Ý·þÎñÆ÷µÄÄÚ´æºÍCPU×ÊÔ´£¬ºÏÀíÉèÖÃworker_connections¡£Í¨³£À´Ëµ£¬Ò»¸öworker¹ý³ÌÄܹ»´¦ÖÃÊýǧ¸öÏνӡ£client_body_buffer_sizeÓëproxy_buffer_size£º¶ÔÓÚ´óÎļþ´«Ê䣬±ØÒªÊʵ±Ôö´óÕâЩ»º³åÇø´óÓ×£¬ÒÔÏ÷¼õ¶Ô´ÅÅÌµÄÆµÈÔ½Ó¼û¡£
sendfileÓëaio£ºÎñ±Ø¿ªÆôsendfileon;£¬²¢Ë¼¿¼ÔÚÌØ¶¨³¡¾°ÏÂÆôÓÃaio(±ØÒªNginx±à?Òëʱ֧³Ö?ngx_http_v2_module)£¬ÒÔ½øÒ»²½ÌáÉýI/OЧÄÜ¡£
proxy_cache£º¶ÔÓÚCDN³¡¾°£¬ÉèÖÃproxy_cache_key¡¢proxy_cache_valid¡¢proxy_cache_min_usesµÈ²ÎÊý£¬¾«ÃܽÚÔ컺´æµÄÄÚÈݺÍʱ³¤¡£open_file_cache£º»º´æ?´ò¿ªµÄÎļþÃèÊö·ûºÍÔªÊý¾Ý£¬Ï÷¼õopen()ºÍstat()µÈϵͳŲÓã¬Ìá¸ßÎļþ½Ó¼û¿ìÂÊ¡£
open_file_cachemax=1000inactive=20s;open_file_cache_valid30s;open_file_cache_min_uses2;open_file_cache_errorsoff;
¸ºÔØÆ½ºâÓë¸ß¿ÉÓ㺵±µ¥Ì¨·þÎñÆ÷ÎÞ·¨Âú×ãÐèҪʱ£¬NginxµÄ¸ºÔØÆ½ºâÄÜÁ¦¾ÍÏÔµÃÓÈΪ³ÁÒª¡£Í¨¹ýupstreamÄ£¿é£¬Äܹ»½«Á÷Á¿·Ö·¢µ½¶ą̀ºó¶Ë·þÎñÆ÷£¬²¢¹²Í¬keepaliveºÍhealth_checkÄ£¿é£¬ÊµÏָ߿ÉÓÃÐÔ¡£
upstreamvideo_backend{serverbackend1.example.com;serverbackend2.example.com;#...}server{#...location/{proxy_passhttp://video_backend;#...»º´æºÍÆäËû´úÀíÅäÖÃ...}}
HTTPS£ºÎªÊÓÆµ²¥·ÅÆôÓÃHTTPS£¬È·±£Êý¾Ý´«ÊäµÄ°²È«ÐÔ¡£DDoS·À»¤£ºÍ¨¹ýNginxµÄÏνÓÏÞ¶È(limit_conn)¡¢ÒªÇóƵÂÊÏÞ¶È(limit_req)µÈÄ£¿é£¬µÖ?ÓùDDoS¹¥»÷¡£HTTP/2&HTTP/3£ºÉý¼¶µ½HTTP/2»òHTTP/3ºÍ̸£¬ÀûÓöà·¸´Óá¢Í·²¿Ñ¹ËõµÈ¸öÐÔ£¬½øÒ»²½ÌáÉý´«ÊäЧÄÜ£¬ÓÈÆäÊÇÔÚ¸ßÑÓ³¤ÍøÂç»·¾³Ï¡£
»úÄÜ¼à¿ØÓëÕï¶Ï£ºÊ¹ÓÃngx_http_stub_status_moduleÄ£¿é²é¿´NginxµÄʵʱÏνÓÊý¡¢ÒªÇóÊýµÈÐÅÏ¢¡£½áºÏPrometheus,GrafanaµÈ¹¤¾ß½øÐиüÈ«ÃæµÄ»úÄÜ¼à¿ØºÍÈÕÖ¾·ÖÎö£¬ÒÔ±ãʵʱ·¢Ïֺͽâ¾ö»úÄÜÆ¿¾±¡£
NginxµÄ»úÄÜÔÙÇ¿£¬Ò²Àë²»¿ªµ×²ãÓ²¼þºÍÍøÂçµÄÖ§³Ö¡£
Ó²¼þ£º¸ß»úÄÜCPU¡¢´óÈÝÁ¿ÄÚ´æ¡¢¸ß¿ìSSDÓ²ÅÌ¡¢ÍòÕ×Íø¿¨£¬¶¼ÊÇÌáÉýÊÓÆµÁ÷ýÌå»úÄܵĻù´¡¡£ÍøÂ磺µÍÑÓ³¤¡¢¸ß´ø¿íµÄÍøÂç»·¾³ÊÇÊÓÆµÁ÷³©²¥·ÅµÄ¹Ø¼ü¡£È·±£·þÎñÆ÷µÄÍøÂçÏνӲ»±äÇÒ¿ìÂÊ´ï±ê¡£²Ù×÷ϵͳµ÷ÓÅ£º¶ÔLinuxÄں˲ÎÊý½øÐÐÊʵ±µ÷Õû£¬ÀýÈçÔö´óÎļþ¾ä±úÊý(ulimit-n)¡¢µ÷ÕûTCP/IP²ÎÊýµÈ£¬Ò²ÄÜΪNginxµÄ¸ß»úÄÜÔËÐдòϼáʵ»ù´¡¡£
ʵÏÖNginxµÄ¡°100%ÊÓÆµ»úÄÜ¡±ÊÇÒ»¸öϵͳ¹¤³Ì£¬ËüÒªÇóÎÒÃÇÉî¿ÌÀí½âNginxµÄ¹¤×÷µÀÀí£¬´¿Êì°ÑÎÕ¸÷ÀàÅäÖÃÖ¸Á²¢½áºÏ¾ßÌåµÄÒµÎñ³¡¾°½øÐо«ÃÜ»¯µ÷ÓÅ¡£´ÓRTMPÖ±²¥µ½HTTPµã²¥£¬´Ó»ù´¡µÄÅäÖõ½¸ß¼¶µÄ»º´æÕ½ÊõºÍ¸ºÔØÆ½ºâ£¬Nginx¶¼Õ¹Ê¾³öÁËÆä׳´óµÄÊÊÓ¦ÐÔºÍ׿ԽµÄ»úÄÜ¡£
ͨ¹ý²»ÐݵØÊµ¼ÊºÍË÷Çó£¬Äú½«¿ÉÄܳä·Ö¿ªÊÍNginxµÄDZÁ¦£¬ÎªÄúµÄÓû§Ìṩ¼«ÖÂÁ÷³©µÄÊÓÆµÂÄÀú£¬ÔÚÇ¿ÁÒµÄÁ÷ýÌåÊг¡ÖÐÍÑÓ±¶ø³ö¡£Nginx²»?½ö½öÊÇÒ»¸öWeb·þÎñÆ÷£¬Ëü¸üÊÇÄú¹¹½¨¸ß»úÄÜÊÓÆµÆ½Ì¨µÄ׳´ó»ùʯ£¬¸³ÄÜÄúµÄÁ÷ýÌåÒµÎñ£¬×ßÏòÎÞÏÞ¿ÉÄÜ¡£