×÷Ϊ×îÁ÷ÐеÄÇáÁ¿¼¶Web·þÎñÆ÷µÄÇ̳þ£¬lighttpdÌṩÁËÁ¼ºÃµÄsendfileÖ§³Ö£¬JavaEyeÍøÕ¾·þÎñÆ÷ʹÓõľÍÊÇlighttpd¡£ÔÚLinux²Ù×÷ϵͳÉÏÃæ£¬Ö»ÐèÒªÔÚlighttpd.confÅäÖÃÎļþÈçÏÂÅäÖã¬lighttpd¾Í»áʹÓÃsendfile·½Ê½´¦Àí¾²Ì¬×ÊÔ´µÄÏÂÔØ£¬Ð§Âʷdz£¸ß£º
ÒýÓÃ
server.network-backend = "linux-sendfile"
µ«ÊÇÔÚijЩÇé¿öÏ£¬ÎÒÃÇÈ´ÎÞ·¨Ö±½ÓÈÃlighttpd´¦ÀíÎļþµÄÏÂÔØ£¬±È·½ËµJavaEyeÍøÕ¾ÐèҪͳ¼ÆÌû×Ó¸½¼þµÄÏÂÔØ´ÎÊý£¬²©¿ÍÏà²áµÄµã»÷´ÎÊý£¬±È·½ËµÐèÒª¶ÔÏÂÔØµÄÎļþ½øÐÐȨÏ޵ĿØÖÆ£¬ÌرðÊǶÔÓÚһЩ¶àÓû§ÏµÍ³£¬Äã²»ÄÜÈÃÓû§ÉÏ´«µÄ˽ÃÜÎļþ±»ÆäËûÓû§Ëæ±ãÏÂÔØµ½£¬ÀýÈçJavaEyeȦ×ӵĹ²ÏíÎļþ²»Äܹ»¶ÔȦ×ÓÍâµÄÓû§¿ª·ÅÏÂÔØ¡£Òò´Ë£¬ÎļþÏÂÔØÄ¿Â¼Ç§Íò²»Äܷŵ½publicĿ¼Ï£¬²»ÄÜÈÃÓû§Ö±½Óͨ¹ýä¯ÀÀÆ÷µÄURLµØÖ··ÃÎʵ½¡£ÔÚÕâÖÖÇé¿öÏ£¬ÎļþÏÂÔØ±ØÐëÓÉ·þÎñÆ÷¶ËÓ¦ÓóÌÐòÀ´´¦Àí¡£
ÔÚRoRÓ¦Óõ±ÖУ¬ÎÒÃÇ¿ÉÒÔÔÚcontrollerÖÐʹÓÃsend_file·½·¨À´¿ØÖÆÎļþµÄÏÂÔØ¡£send_file·½·¨½«ÏÂÔØµÄÎļþÒÔ4KBΪµ¥Î»Ð´µ½Ò»¸öÊä³öÁ÷È¥¡£Èç¹ûÎÒÃÇʹÓÃmongrelÓ¦Ó÷þÎñÆ÷µÄ»°£¬mongrel»áÔÚÄÚ´æµ±Öд´½¨Ò»¸öStringIO¶ÔÏ󣬰ÑÕû¸öÏÂÔØÎļþÍêÕûµÄ¶ÁÈëÄڴ棬ȻºóÔÙÏò¿Í»§¶Ë»òÕßǰ¶ËµÄWeb·þÎñÆ÷д³ö¡£Èç¹ûÎÒÃÇʹÓÃfcgiÀ´ÔËÐÐRoRµÄ»°£¬fcgi»áÖ±½Ó°ÑÊä³öÁ÷µÄÄÚÈÝÏòǰ¶ËµÄWeb·þÎñÆ÷д³ö¡£
ºÁÎÞÒÉÎÊ£¬ÎÒÃÇ¿ÉÒÔ¿´µ½ÕâÖÖÏÂÔØ´¦Àí·½Ê½ÓкܴóµÄÐÔÄÜȱÏÝ£º
1¡¢µ±Ê¹ÓÃmongrelµÄʱºò£¬Èç¹ûÏÂÔØÎļþºÜ´ó£¬»áµ¼ÖÂmongrelÄڴ汩ÕÇ£¡
mongrel´´½¨Ò»¸öStringIO¶ÔÏ󻺴æÕû¸öÊä³öÄÚÈÝ£¬ÎÒÃǼÙÉèÓû§ÏÂÔØµÄÊÇÒ»¸ö100MBµÄÎļþ£¬¸ÃÓû§ÓÖºÜϲ»¶ÓöàÏß³ÌÏÂÔØ¹¤¾ß£¬Ëû¿ªÁË10¸öÏ̲߳¢·¢ÏÂÔØ£¬ÄÇômongrelµÄÄÚ´æÕ¼ÓûᱩÕÇ1GBÒÔÉÏ¡£¶øÇÒ×î¿ÉŵÄÊÇ£¬¼´Ê¹µ±Óû§ÏÂÔØ½áÊøÒÔºó£¬mongrelµÄÄÚ´æ¶¼²»»áѸËÙ»ØÂ䣬¶øÊÇÒ»Ö±±£³ÖÈç´Ë¸ßµÄÄÚ´æÕ¼Óá£Õâ¸öȱÏݷdz£ÈÝÒ×±»±ðÓÐÓÃÐĵĺڿÍÀûÓ㬹¥»÷ÍøÕ¾¡£ÕâÒ²ÊÇJavaEyeÍøÕ¾ÎªÊ²Ã´Ê¼ÖÕ²»ÓÃmongrelµÄÔÒòÖ®Ò»¡£
2¡¢µ±Ê¹ÓÃfcgiµÄʱºò£¬Èç¹ûǰ¶ËWeb·þÎñÆ÷ûÓÐ×ã¹»´óbuffer£¬»áµ¼ÖÂfcgi½ø³Ì±»¹Òס
fcgi×Ô¼º²»¿ªoutput buffer£¬¶øÊÇʵʱд³öÊä³öÄÚÈÝ£¬Èç¹ûǰ¶ËWeb·þÎñÆ÷ÓõÄÊÇlighttpd£¬ÄÇôÄãºÜÐÒÔË£¬lighttpd»áÕÕµ¥È«ÊÕ£¬Ò»¸ö×Ö½Ú¶¼²»ÀÏ£»Èç¹ûǰ¶ËWeb·þÎñÆ÷ÓõÄÊÇnginx/apache£¬ÄÇôÄãºÜ²»ÐÒ£¬nginx/apacheĬÈÏÖ»¿ª8KµÄbuffer£¬ÊÕ²»ÏµÄÄǾͶԲ»ÆðÁË£¬ÄúÂýµãàÏ£¬fcgi½ø³Ì¾Í±»¹ÒסÁË£¬Ö»Òª¿Í»§¶Ëä¯ÀÀÆ÷ÏÂÔØ²»½áÊø£¬fcgi½ø³Ì¾Í±»Ò»Ö±Õ¼Óá£
3¡¢¼´Ê¹Ê¹ÓÃlighttpd+fcgi£¬Ò²»á¶Ô·þÎñÆ÷Ôì³É²»Ð¡µÄÐÔÄÜ¿ªÏú
lighttpd+fcgiÊÇ×îÀíÏëµÄRails²¿Êð»·¾³£¬JavaEyeÍøÕ¾Ê¹ÓõľÍÊÇlighttpd+fcgi¡£µ±ruby³ÌÐòÖ´ÐÐsend_file¿ªÊ¼ÏÂÔØµÄʱºò£¬fcgi»áÒÔ4KBΪµ¥Î»¶ÁÈëÎļþÄÚÈÝ£¬È»ºóÁ¢¿Ìд³öµ½lighttpdÈ¥£¬¶ølighttpdÕÕµ¥È«ÊÕ¡£Òò´Ëµ±ÏÂÔØÎļþ±»ÍêÕûµÄͨ¹ýfcgi±»flushµ½lighttpdµÄÄÚ´æÀïÃæÈ¥ÒԺ󣬼´Ê¹Äãɱµôfcgi½ø³Ì£¬¶¼Ë¿ºÁ²»»áÓ°ÏìÎļþÏÂÔØ¡£
Ò²ÐíÄã»áÎÊ£¬lighttpd¶¼³ÔÏÂÀ´ÎļþÄÚÈÝ£¬ÄÚ´æ»á²»»á±©ÕÇ£¿»áµÄ£¬ÎÒÃǼÙÉèͬÑùµÄÓû§³¡¾°£¬Ä³Óû§Æô¶¯10¸öÏß³ÌÏÂÔØ100MBµÄÎļþ£¬fcgi½ø³ÌÄÚ´æ²»»á·¢Éú±ä»¯£¬µ«ÊÇlighttpd»á±©ÕÇ1GB¡£µ«ËùÐÒµÄÊÇlighttpdµÄÄÚ´æ¹ÜÀíµÄ²»´í£¬Ò»µ©Óû§È¡ÏûÏÂÔØ£¬»òÕßÏÂÔØÍê±Ï£¬lighttpdÁ¢¿ÌÊͷŵô1GBµÄÄÚ´æ¡£
µ«ÊÇÎÞÂÛÔõô˵£¬ruby»¹ÊÇÐèÒªÍêÕûµÄ¶ÁÈ¡ÏÂÔØÎļþ£¬¶ølighttpdÒ²ÐèÒª¿ª±Ù×ã¹»´óµÄÄڴ棬´¦ÀíÕû¸öÎļþµÄÏÂÔØ¹ý³Ì£¬¶Ô·þÎñÆ÷¿ªÏú»¹ÊǺܴóµÄ¡£ÎÒÃǵÄÎÊÌâÊÇ£¬Äܲ»ÄÜÈôøÈ¨ÏÞ¿ØÖƵÄÎļþÏÂÔØÏñlighttpdÏÂÔØ¾²Ì¬×ÊÔ´ÎļþÄÇÑù¿ì£¬¿ªÏúÄÇÑùÐ¡ÄØ£¿´ð°¸¾ÍÊÇX-sendfile£¡
ʹÓÃX-sendfile·½Ê½£¬·þÎñÆ÷¶ËÓ¦ÓóÌÐò²»ÐèÒª¶ÁÈ¡ÏÂÔØÎļþÁË£¬Ö»ÐèÒªÉèÖÃresponseµÄheaderÐÅÏ¢¾Í×ã¹»ÁË£¬´ËÍ⻹Ҫ¸½¼ÓÒ»¸öÐÅÏ¢“X-LIGHTTPD-send-file”ÐÅÏ¢¸ølighttpd£¬¸æËßlighttpd£¬ÎļþÏÂÔØÎҾͲ»¹ÜÁË£¬Äã×Ô¼º¿´×Űì°É£º
- response.headers['Content-Type'] = @attachment.content_type
- response.headers['Content-Disposition'] = "attachment; filename=\"#{URI.encode(@attachment.filename)}\""
- response.headers['Content-Length'] = @attachment.size
- response.headers["X-LIGHTTPD-send-file"] = @attachment.public_filename
- render :nothing => true
X-LIGHTTPD-send-file¸æËßlighttpd£¬È¥Ó²Å̵ÄÄĸö·¾¶ÕÒÒªÏÂÔØµÄÎļþ£¬×îºóÒ»ÐÐɶ¶¼²»Êä³öÁË£¬ÏÂÔØ²»ÓÃrubyÀ´¹ÜÁË¡£
¶ølighttpdÊÕµ½X-LIGHTTPD-send-fileÐÅÏ¢ÒԺ󣬾ͻáÕÒµ½Ó²Å̸ÃÎļþ£¬ÒÔ¾²Ì¬×ÊÔ´ÎļþµÄÏÂÔØ·½Ê½´¦Àí£¬Ë¿ºÁ²»ÏûºÄlighttpdµÄÄÚ´æ¡£»¹ÊÇÒÔijÓû§Æô¶¯10¸öÏß³ÌÏÂÔØ100MBÎļþΪÀý£¬10¸öfcgi½ø³Ì·¢ËÍÁËresponseÐÅÏ¢¾Í´¦ÀíÍê±ÏÁË£¬¶ølighttpdÖªµÀÏÂÔØµÄÊÇÓ²Å̵ľ²Ì¬Îļþ£¬»áÒÔsendfile·½Ê½ÏÂÔØ£¬ÎļþÄÚÈݾͻᱻ²Ù×÷ϵͳÄÚºËÖ±½ÓË͵½Íø¿¨µÄbufferÀïÃæ£¬¼È²»ÏûºÄruby½ø³Ì£¬Ò²²»ÏûºÄlighttpd£¬½Ô´ó»¶Ï²¡£
ÔÚlighttpd-1.4.18°æ±¾ÀïÃæ£¬fastcgi·½Ê½ÒѾÄÚÖÃX-sendfileÖ§³Ö£¬½ö½öÐèÒªÄãÔÚÅäÖÃÎļþ´ò¿ª¾Í¿ÉÒÔÁË£º
ÒýÓÃ
"allow-x-send-file"="enable"
JavaEyeÍøÕ¾ÔÚʹÓÃÁËX-sendfile¹¦ÄÜÖ®ºó£¬lighttpdµÄÄÚ´æÕ¼ÓÃÓÐÃ÷ÏÔµÄϽµ¡£Î´Ê¹ÓÃX-sendfile֮ǰ£¬lighttpdÓÐʱºòÄÚ´æÕ¼Óûᵽ200MBÒÔÉÏ(ÓÐÓû§¶àÏß³ÌÏÂÔØ¸½¼þ)£¬ÔÚʹÓÃX-sendfileÖ®ºó£¬lighttpdµÄÄÚ´æÕ¼Óû¹´ÓÎ´Í»ÆÆ20MB¡£
×îºóÒªÌáÐÑ´ó¼Ò¼¸¸öÎÊÌ⣺
1¡¢lighttpd-1.4.x²»ÈÏX-sendfileÕâ¸öheader£¬Ö»ÈÏX-LIGHTTPD-send-file
°´ÕÕlighttpdÍøÕ¾×Ô¼ºµÄÎĵµ£¬ÒÔ¼°¸÷ÖÖ¸÷ÑùÁ÷ÐеÄX-sendfileÎĵµ£¬ÉèÖõÄheader¶¼ÊÇX-sendfile£¬µ«ÊǾ¹ýÎÒÃÇn´Îʧ°ÜµÄÃþË÷£¬²Å·¢ÏÖÔÀ´±ØÐëʹÓÃX-LIGHTTPD-send-file£¬ÕâÒ»µãÇë²»Òª±»ÎĵµÃÔ»ó£¬Ä¿Ç°ºÃÏñÒ²Ö»ÓÐÎÒÃÇÌá³öÕâ¸ö½â¾ö°ì·¨£¬»¥ÁªÍøÉÏÃæÉÐδ¿´µ½ÆäËûÈËÌá³ö¹ý£¬¿´À´ÎÒÃÇÓÖÊ׿ªÏȺÓÁË¡£ÓÃRoR¾ÍÊÇÕâµãºÃ£¬Ä㶯²»¶¯¾ÍµÃ×Ô¼ºÏÈÈ¥µ±³¢ó¦Ð·µÄÄǸöÈË¡£
2¡¢lighttpd-1.5.0°æ±¾µÄX-sendfileÉèÖÃÓÐËù¸Ä±ä
lighttpd-1.5.0°æ±¾»¹Î´·¢²¼Õýʽ°æ±¾£¬¾Ý˵1.5.0ÒѾÈÏʶX-sendfileÕâ¸öheaderÁË£¬Õâ¸ö´ó¼ÒÓÐÐËȤ×Ô¼º²âÊÔ°É¡£
°²»ÕлªµçÄÔѧУרҵְҵ¹æ»®Ê¦ÎªÄãÌṩ¸ü¶à°ïÖú¡¾ÔÚÏß×Éѯ¡¿