麻豆传媒视频在线,国产91精品不卡视频,欧美jizz19性欧美,污视频网站在线观看,91涩漫在线观看,伊人发布在线,九色porny丨首页在线,福利视频一区,久久av网址,久久人人视频

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

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

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

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


但是在某些情況下,我們卻無法直接讓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的內存都不會迅速回落,而是一直保持如此高的內存占用。這個缺陷非常容易被別有用心的黑客利用,攻擊網站。這也是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,文件下載我就不管了,你自己看著辦吧:

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信息以后,就會找到硬盤該文件,以靜態資源文件的下載方式處理,絲毫不消耗lighttpd的內存。還是以某用戶啟動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了,這個大家有興趣自己測試吧。
安徽新華電腦學校專業職業規劃師為你提供更多幫助【在線咨詢
久久av资源站| 麻豆乱码国产一区二区三区| 久久精品男人的天堂| 国产不卡在线播放| 国产一区二区三区久久久| 麻豆高清免费国产一区| 国产专区综合网| 国产高清亚洲一区| 懂色av一区二区三区免费观看| 国产精品中文有码| 99久久精品国产观看| 99久久精品免费看国产免费软件| 成人免费精品视频| 国产欧美一区二区三区在线看蜜臀| 成人综合在线观看| 久久视频一区二区| 亚洲欧美偷拍卡通变态| 一区二区三区精品在线观看| 亚洲超碰精品一区二区| 欧美在线免费观看亚洲| 日韩一区二区三免费高清| 亚洲激情免费观看| 久久激情视频免费观看| 66m—66摸成人免费视频| 国产精品91久久| 日本性视频网| 欧美美乳在线| 92久久精品| 国产精品亚洲欧美日韩一区在线 | 国产精品午夜免费| 亚洲综合区在线| 欧洲国内综合视频| 亚洲精品av在线| 欧美精品情趣视频| 国产精品国模在线| 免费在线黄色影片| 欧美动物xxx| 加勒比久久综合| 视频一区中文字幕国产| 久久久久国产精品人| 欧美性猛交xxxx| 亚洲视频精品在线| 国产精品视频免费在线| 免费a在线看| 9l视频自拍九色9l视频成人| 午夜精品免费| 国产成人综合在线观看| 亚洲三级小视频| 欧美精三区欧美精三区| 欧美另类第一页| 在线国产福利| 国产精欧美一区二区三区蓝颜男同| 欧美日韩一区二区三区不卡视频| 久久九九精品| 亚洲欧美日韩国产中文在线| 精品美女一区二区| 91国在线精品国内播放| 久久久久久青草| 99精品女人在线观看免费视频| 一本精品一区二区三区| 成人高清在线视频| 91官网在线观看| 欧美国产日韩在线| 国产在线视频资源| 国产精品成人**免费视频| 欧美日本在线| 日本一区二区视频在线| 91精品免费在线| 538国产精品一区二区免费视频| 欧美日韩在线看片| 九九热线有精品视频99| 成人午夜电影网站| 精品久久久三级丝袜| 国产精品av电影| 欧美大电影免费观看| 鲁大师影院一区二区三区| 亚洲成人第一页| 久久久久久久久国产精品| 18+视频在线观看| 忘忧草精品久久久久久久高清| 国产亚洲综合av| 美女色狠狠久久| 在线影院av| 日韩av黄色| 激情都市一区二区| 欧美猛男超大videosgay| 国产精品wwww| 亚洲日韩中文字幕一区| 激情综合五月婷婷| 欧美videossexotv100| 性色a∨人人爽网站| 成人av综合网| 欧美精彩视频一区二区三区| 中文字幕九色91在线| 日本高清视频在线播放| 欧美午夜久久| 欧美日韩亚洲国产一区| 国产精品视频精品视频| 亚洲精品高潮| 久久久国产精品午夜一区ai换脸| www.日韩不卡电影av| 草草在线视频| 国产一区二区三区香蕉| 精品无人国产偷自产在线| 成人在线观看黄色| 在线欧美亚洲| 欧美一级片免费看| 国产小视频在线观看| 好看的日韩av电影| 欧美电影影音先锋| 成人免费在线观看| 免费在线亚洲| 日韩精品欧美国产精品忘忧草| а天堂8中文最新版在线官网| 欧美另类视频| 91精品欧美久久久久久动漫| 国产在线一二| 麻豆9191精品国产| 亚洲国语精品自产拍在线观看| 国产视频第一区| 香蕉久久a毛片| 亚洲精品第一页| 77thz桃花论族在线观看| 国产一区欧美一区| www国产亚洲精品久久网站| 欧美日韩激情电影| 中文字幕成人在线观看| 国产成人精品亚洲精品| 国产毛片一区二区三区| 日本精品免费观看高清观看| 在线免费av网址| 一区二区久久| 中文字幕综合在线| crdy在线观看欧美| 一区二区三区精密机械公司| 特黄特黄的视频| 国产亚洲欧洲| 一区二区三欧美| 欧美www视频| 欧美成人精品三级在线观看| 欧美美女被草| 亚洲成年人网站在线观看| 黄色av网站在线观看| 欧美区一区二| 国产午夜精品麻豆| 免费在线观看一区| 国产精品视频你懂的| 国产主播喷水一区二区| 激情综合中文娱乐网| 国产亚洲精品久久久优势| 欧美在线se| 精品久久久在线观看| 2019中文字幕在线视频| 成人av手机在线观看| 国产精品88a∨| 一区二区三区成人精品| www.99久久热国产日韩欧美.com| 一本一道久久a久久| 欧美图区在线视频| 国产一二在线播放| 一区二区三区中文字幕电影| 国产视频三级在线观看播放| 九一久久久久久| 欧美影院在线播放| 亚洲女同一区| 一本大道亚洲视频| 日韩高清影视在线观看| 精品国产乱码久久久久久蜜臀| 日韩毛片免费看| 色噜噜久久综合| 春色校园综合激情亚洲| 亚洲综合色噜噜狠狠| 污污影院在线观看| 一区二区三区四区不卡在线 | 亚洲欧洲性图库| 国产在线观看网站| 99精品热视频| 在线看的网站你懂| 不卡视频在线观看| 四虎精品成人免费网站| 99re这里只有精品视频首页| 在线免费国产| 国产午夜精品久久久久久久 | 欧美日精品一区视频| 电影亚洲精品噜噜在线观看| 欧美性猛交xxxx免费看漫画| 性欧美18xxxhd| 色婷婷久久久综合中文字幕| 久久av日韩| 日韩欧美精品在线视频| 日韩精品久久久久久久软件91| 日韩精品专区在线影院重磅| 欧美中文一区| 日韩在线小视频| 国产精品久久久久久模特| 国产精品自产拍高潮在线观看| 国产69精品久久777的优势| 裸体xxxx视频在线| 亚洲一区二三区| 99精品美女视频在线观看热舞|