亚洲人成网站在线播放2019 _日韩国产欧美精品_久久夜色精品国产欧美乱_在线视频福利一区

當前位置:首頁 > 網站舊欄目 > 學習園地 > 設計軟件教程 > 利用lighttpd的X-sendfile提升Rails的下載性能

利用lighttpd的X-sendfile提升Rails的下載性能
2010-01-14 23:31:33  作者:  來源:
傳統(tǒng)的Web服務器在處理文件下載的時候,總是先讀入文件內容到應用程序內存,然后再把內存當中的內容發(fā)送給客戶端瀏覽器。這種方式在應付當今大負載網站,音頻視頻網站力不從心。sendfile是現(xiàn)代操作系統(tǒng)支持的一種高性能網絡IO方式,操作系統(tǒng)內核的sendfile調用可以將文件內容直接推送到網卡的buffer當中,從而避免了Web服務器讀寫文件的開銷,實現(xiàn)了“零拷貝”模式。

作為最流行的輕量級Web服務器的翹楚,lighttpd提供了良好的sendfile支持,JavaEye網站服務器使用的就是lighttpd。在Linux操作系統(tǒng)上面,只需要在lighttpd.conf配置文件如下配置,lighttpd就會使用sendfile方式處理靜態(tài)資源的下載,效率非常高:

引用
server.network-backend = "linux-sendfile"


但是在某些情況下,我們卻無法直接讓lighttpd處理文件的下載,比方說JavaEye網站需要統(tǒng)計帖子附件的下載次數(shù),博客相冊的點擊次數(shù),比方說需要對下載的文件進行權限的控制,特別是對于一些多用戶系統(tǒng),你不能讓用戶上傳的私密文件被其他用戶隨便下載到,例如JavaEye圈子的共享文件不能夠對圈子外的用戶開放下載。因此,文件下載目錄千萬不能放到public目錄下,不能讓用戶直接通過瀏覽器的URL地址訪問到。在這種情況下,文件下載必須由服務器端應用程序來處理。

在RoR應用當中,我們可以在controller中使用send_file方法來控制文件的下載。send_file方法將下載的文件以4KB為單位寫到一個輸出流去。如果我們使用mongrel應用服務器的話,mongrel會在內存當中創(chuàng)建一個StringIO對象,把整個下載文件完整的讀入內存,然后再向客戶端或者前端的Web服務器寫出。如果我們使用fcgi來運行RoR的話,fcgi會直接把輸出流的內容向前端的Web服務器寫出。

毫無疑問,我們可以看到這種下載處理方式有很大的性能缺陷:

1、當使用mongrel的時候,如果下載文件很大,會導致mongrel內存暴漲!

mongrel創(chuàng)建一個StringIO對象緩存整個輸出內容,我們假設用戶下載的是一個100MB的文件,該用戶又很喜歡用多線程下載工具,他開了10個線程并發(fā)下載,那么mongrel的內存占用會暴漲1GB以上。而且最可怕的是,即使當用戶下載結束以后,mongrel的內存都不會迅速回落,而是一直保持如此高的內存占用。這個缺陷非常容易被別有用心的黑客利用,攻擊網站。這也是JavaEye網站為什么始終不用mongrel的原因之一。


2、當使用fcgi的時候,如果前端Web服務器沒有足夠大buffer,會導致fcgi進程被掛住

fcgi自己不開output buffer,而是實時寫出輸出內容,如果前端Web服務器用的是lighttpd,那么你很幸運,lighttpd會照單全收,一個字節(jié)都不拉下;如果前端Web服務器用的是nginx/apache,那么你很不幸,nginx/apache默認只開8K的buffer,收不下的那就對不起了,您慢點嘞,fcgi進程就被掛住了,只要客戶端瀏覽器下載不結束,fcgi進程就被一直占用。

3、即使使用lighttpd+fcgi,也會對服務器造成不小的性能開銷

lighttpd+fcgi是最理想的Rails部署環(huán)境,JavaEye網站使用的就是lighttpd+fcgi。當ruby程序執(zhí)行send_file開始下載的時候,fcgi會以4KB為單位讀入文件內容,然后立刻寫出到lighttpd去,而lighttpd照單全收。因此當下載文件被完整的通過fcgi被flush到lighttpd的內存里面去以后,即使你殺掉fcgi進程,都絲毫不會影響文件下載。

也許你會問,lighttpd都吃下來文件內容,內存會不會暴漲?會的,我們假設同樣的用戶場景,某用戶啟動10個線程下載100MB的文件,fcgi進程內存不會發(fā)生變化,但是lighttpd會暴漲1GB。但所幸的是lighttpd的內存管理的不錯,一旦用戶取消下載,或者下載完畢,lighttpd立刻釋放掉1GB的內存。

但是無論怎么說,ruby還是需要完整的讀取下載文件,而lighttpd也需要開辟足夠大的內存,處理整個文件的下載過程,對服務器開銷還是很大的。我們的問題是,能不能讓帶權限控制的文件下載像lighttpd下載靜態(tài)資源文件那樣快,開銷那樣小呢?答案就是X-sendfile!

使用X-sendfile方式,服務器端應用程序不需要讀取下載文件了,只需要設置response的header信息就足夠了,此外還要附加一個信息“X-LIGHTTPD-send-file”信息給lighttpd,告訴lighttpd,文件下載我就不管了,你自己看著辦吧:

Ruby代碼 復制代碼
  1. response.headers['Content-Type'] = @attachment.content_type   
  2. response.headers['Content-Disposition'] = "attachment; filename=\"#{URI.encode(@attachment.filename)}\""    
  3. response.headers['Content-Length'] = @attachment.size   
  4. response.headers["X-LIGHTTPD-send-file"] = @attachment.public_filename   
  5. render :nothing => true  


X-LIGHTTPD-send-file告訴lighttpd,去硬盤的哪個路徑找要下載的文件,最后一行啥都不輸出了,下載不用ruby來管了。

而lighttpd收到X-LIGHTTPD-send-file信息以后,就會找到硬盤該文件,以靜態(tài)資源文件的下載方式處理,絲毫不消耗lighttpd的內存。還是以某用戶啟動10個線程下載100MB文件為例,10個fcgi進程發(fā)送了response信息就處理完畢了,而lighttpd知道下載的是硬盤的靜態(tài)文件,會以sendfile方式下載,文件內容就會被操作系統(tǒng)內核直接送到網卡的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。

最后要提醒大家?guī)讉問題:

1、lighttpd-1.4.x不認X-sendfile這個header,只認X-LIGHTTPD-send-file

按照lighttpd網站自己的文檔,以及各種各樣流行的X-sendfile文檔,設置的header都是X-sendfile,但是經過我們n次失敗的摸索,才發(fā)現(xiàn)原來必須使用X-LIGHTTPD-send-file,這一點請不要被文檔迷惑,目前好像也只有我們提出這個解決辦法,互聯(lián)網上面尚未看到其他人提出過,看來我們又首開先河了。用RoR就是這點好,你動不動就得自己先去當嘗螃蟹的那個人。

2、lighttpd-1.5.0版本的X-sendfile設置有所改變

lighttpd-1.5.0版本還未發(fā)布正式版本,據說1.5.0已經認識X-sendfile這個header了,這個大家有興趣自己測試吧。
安徽新華電腦學校專業(yè)職業(yè)規(guī)劃師為你提供更多幫助【在線咨詢
亚洲人成网站在线播放2019 _日韩国产欧美精品_久久夜色精品国产欧美乱_在线视频福利一区
色婷婷综合久久久久中文字幕| 激情综合网俺也去| 欧美在线一区二区视频| 91久久精品日日躁夜夜躁国产| 精品综合久久久久久97| 国内精品一区二区三区四区| 久久婷婷国产综合尤物精品| 一区二区精品在线观看| 国产人妻互换一区二区| 国产精品毛片一区视频| 欧美性视频在线| 日韩亚洲精品电影| 欧美与黑人午夜性猛交久久久 | 97碰碰碰免费色视频| 久操成人在线视频| 虎白女粉嫩尤物福利视频| 久久久999国产精品| 欧美日韩系列| 久久视频中文字幕| 黄色一级视频片| 国产精品久久久久久久天堂第1集| 欧美在线视频二区| 国产精品久久色| 国产中文一区二区| 精品国产免费久久久久久尖叫| 国产一区二区在线网站| 欧美成人四级hd版| 国产精品一区=区| 亚洲最大av网站| 91精品国产91久久久久| 亚洲国产精品www| 久久久免费在线观看| 日本一区不卡| 久久久久久久少妇| 激情综合网俺也去| 美日韩精品免费观看视频| 白白操在线视频| 色之综合天天综合色天天棕色| 九一国产精品视频| 欧美日韩一区在线观看视频| 欧美成人精品在线观看| 成人免费毛片播放| 日本一区二区三区www| 久久久精品在线观看| 国产一区二区三区色淫影院| 久久久久国色av免费观看性色| 91av在线播放| 欧美韩国日本精品一区二区三区| 久久亚洲电影天堂| 99热成人精品热久久66| 人人妻人人做人人爽| 精品伦理一区二区三区| 99久久国产综合精品五月天喷水| 午夜精品一区二区在线观看的| 色偷偷88888欧美精品久久久| 免费在线a视频| 亚洲中文字幕无码专区| 色噜噜久久综合伊人一本| 免费特级黄色片| 亚洲精品在线免费看| 日韩在线视频国产| 国产日韩欧美日韩| 日本不卡免费高清视频| 精品九九九九| 久久久99国产精品免费| 免费一级特黄毛片| 少妇精品久久久久久久久久| 国产精品日韩精品| 国产极品尤物在线| 免费毛片网站在线观看| 懂色av粉嫩av蜜臀av| 国产精品久久久久久久7电影| 久无码久无码av无码| 国产一区二区丝袜| 日韩欧美电影一区二区| 国产精品高潮呻吟久久av无限| 91精品免费视频| 蜜桃精品久久久久久久免费影院| 午夜精品一区二区三区在线观看 | 国产精品免费网站| 久久久天堂国产精品女人| 精品一区二区三区自拍图片区| 视频一区二区三| 久久99亚洲精品| 国产精品视频免费在线观看| 久久久中精品2020中文| 国产精品自拍偷拍视频| 欧美亚洲国产日本| 亚洲中文字幕无码一区二区三区| 国产精品视频网址| 久久福利电影| 88国产精品欧美一区二区三区| 国产片侵犯亲女视频播放| 欧美性大战久久久久xxx| 天天干天天色天天爽| 久操成人在线视频| 国产精品久久久久久久久久久久午夜片| 久青草视频在线播放| 99免费在线视频观看| 国产伦一区二区三区色一情| 激情五月宗合网| 日本精品一区二区三区在线播放视频 | 久久亚洲国产成人精品无码区| 国产精品亚洲网站| 国产日韩在线一区| 国内一区在线| 欧美高清视频一区二区三区在线观看| 日韩久久久久久久久久久久| 午夜免费电影一区在线观看| 亚洲一区二区免费在线| 尤物国产精品| 最新av在线免费观看| 九色精品美女在线| 久久综合久久八八| 国产精品久久9| 国产精品传媒毛片三区| 国产精品久久久久免费a∨ | 日韩电影天堂视频一区二区| 日韩av不卡电影| 欧美一级在线看| 日本一本中文字幕| 日本婷婷久久久久久久久一区二区| 亚洲精品女av网站| 亚洲aa中文字幕| 亚洲v国产v在线观看| 亚洲日本精品一区| 亚洲国产高清国产精品| 岛国视频一区| 天堂v在线视频| 日本在线观看一区| 日韩视频在线免费播放| 日韩免费电影一区二区三区| 欧美在线观看视频| 精品人妻大屁股白浆无码| 欧美高清视频一区| 精品视频免费观看| 国产美女久久精品香蕉69| 成人免费福利视频| 91.com在线| 久久久久久久久久av| 日韩在线免费视频| 国产精品久久久久久久午夜| 欧美成人精品在线| 亚洲中文字幕无码不卡电影 | 99热在线国产| 国产成人avxxxxx在线看| 久久久久天天天天| 久久久国产精品亚洲一区| 国产精品国产对白熟妇| 一区二区三视频| 亚洲欧美国产不卡| 日韩欧美在线观看强乱免费| 精品人妻一区二区三区四区在线| 国产欧美亚洲精品| 91精品免费| 久久精品夜夜夜夜夜久久| 久久99国产精品久久久久久久久| 午夜午夜精品一区二区三区文| 日韩暖暖在线视频| 国产自产在线视频| 久久久免费观看视频| 国产精品视频网址| 在线观看国产一区| 欧美在线视频观看免费网站| 国产日韩欧美影视| 久久久欧美精品| 欧美精品生活片| 日本免费在线精品| 国产又粗又爽又黄的视频| 久久久亚洲精品无码| 国产精品久久久久久久久久久久| 亚洲午夜精品久久| 欧美日韩一区二区三区免费| aaa级精品久久久国产片| 日韩在线视频一区| 亚洲一区二区三区在线免费观看| 欧美精品欧美精品| 91精品视频在线看| 国产精品夫妻激情| 日本亚洲精品在线观看| 国产在线青青草| 国产成人精品免费视频| 欧美精品久久久久久久免费观看| 青青青在线视频播放| www日韩av| 国产精品第二页| 欧洲精品久久久| 国产精品99久久久久久大便| 欧美精品在线免费观看| 欧洲亚洲免费视频| 91精品国产综合久久久久久久久 | 欧美人交a欧美精品| 日韩精品av一区二区三区| av动漫免费看| 久久中文字幕视频| 日韩免费在线播放| 91精品国产色综合久久不卡98| 超碰91人人草人人干| 欧美日韩在线不卡一区| 国产不卡一区二区视频|