1. 程式人生 > >Apache,Nginx Lighttpd分別使用X-sendfile功能提升檔案下載效能

Apache,Nginx Lighttpd分別使用X-sendfile功能提升檔案下載效能

               

關於mod_xsendfile

Lighttpd中的X-sendfile

使用X-sendfile方式,伺服器端應用程式不需要讀取下載檔案了,只需要設定response的header資訊就足夠了,此外還要附加一個資訊“X-LIGHTTPD-send-file”資訊給lighttpd,告訴lighttpd,檔案下載就不管了

Apache中的X-sendfile

不經過PHP這層, 直接讓Webserver直接把檔案傳送,使用Apache的module mod_xsendfile, 讓Apache直接傳送這個檔案給使用者給使用者

<?php    $file = "/tmp/中文名.tar.gz";$filename = basename($file);header("Content-type: application/octet-stream"
);//處理中文檔名    $ua = $_SERVER["HTTP_USER_AGENT"];    $encoded_filename = urlencode($filename);    $encoded_filename = str_replace("+", "%20", $encoded_filename);    if (preg_match("/MSIE/", $ua)) {     header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');    } else if (preg_match("/Firefox/"
, $ua)) {     header("Content-Disposition: attachment; filename*=\"utf8''" . $filename . '"');    } else {     header('Content-Disposition: attachment; filename="' . $filename . '"');    }     header('Content-Disposition: attachment; filename="' . basename($file) . '"');     //讓Xsendfile傳送檔案    header("X-Sendfile: $file"
);

Nginx中的X-Accel-Redirect

傳送靜態檔案使用的是一個叫做X-sendfile的header特性.
nginx當然也有這個特性,但是實現的略微不同,在nginx中叫做X-Accel-Redirect.

有兩個特性需要闡述:
1.header 中必須包括URI
2.本地必須宣告為 internal,用於內部redirect和X-Accel-Redirect responses。

配置例子:
程式碼
location /public/ { 
internal; 
root  /專案目錄; 
}

應用程式介面:
程式碼
x_accel_redirect "/專案目錄/public", :filename => "iso.img"

這樣,nginx將傳送/專案目錄/public/iso.img 檔案。
其他例子:
引用
x_accel_redirect(‘/path/to/image.jpg’, :type => ‘image/jpeg’, :disposition=>’inline’)

header還支援如下屬性:
程式碼
X-Accel-Limit-Rate: 1024 
X-Accel-Buffering: yes|no 
X-Accel-Charset: utf-8