最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在Nginx中使用X-Sendfile頭提升PHP文件下載的性能(針對大文件下載)

 更新時間:2014年07月04日 12:06:56   投稿:junjie  
這篇文章主要介紹了在Nginx中使用X-Sendfile頭提升PHP文件下載的性能,可以用在針對大文件下載的情況,下載非網(wǎng)站W(wǎng)eb目錄文件的需求,提供下載權(quán)限控制的場景,需要的朋友可以參考下

很多時候用戶需要從網(wǎng)站下載文件,如果文件是可以通過一個固定鏈接公開獲取的,那么我們只需將文件存放到 webroot下的目錄里就好。但大多數(shù)情況下,我們需要做權(quán)限控制,例如下載 PDF 賬單,又例如下載網(wǎng)盤里的檔案。這時,我們通常借助于腳本代碼來實現(xiàn),而這無疑會增加服務(wù)器的負擔(dān)。

例如下面的代碼:

<?php
  // 用戶身份認證,若驗證失敗跳轉(zhuǎn)
  authenticate();
  // 獲取需要下載的文件,若文件不存在跳轉(zhuǎn)
  $file = determine_file();
  // 讀取文件內(nèi)容
  $content=file_get_contents($file);
  // 發(fā)送合適的 HTTP 頭
  header("Content-type: application/octet-stream");
  header('Content-Disposition: attachment; filename="' . basename($file) . '"');
  header("Content-Length: ". filesize($file));
  echo $content; // 或者 readfile($file);
?>

一、這樣做有什么問題?

這樣做意味著我們的程序需要將文件內(nèi)容從磁盤經(jīng)過一個固定的 buffer 去循環(huán)讀取到內(nèi)存,再發(fā)送給前端 web 服務(wù)器,最后才到達用戶。當(dāng)需要下載的文件很大的時候,這種方式將消耗大量內(nèi)存,甚至引發(fā) php 進程超時或崩潰。Cache 也很頭疼,更不用說中斷重連的情況了。
一個理想的解決方式應(yīng)該是,由 php 程序進行權(quán)限檢查等邏輯判斷,一切通過后,讓前臺的 web 服務(wù)器直接將文件發(fā)送給用戶——像 Nginx 這樣的前臺更善于處理靜態(tài)文件。這樣一來 php 腳本就不會被 I/O 阻塞了。

二、什么是 X-Sendfile?

X-Sendfile 是一種將文件下載請求由后端應(yīng)用轉(zhuǎn)交給前端 web 服務(wù)器處理的機制,它可以消除后端程序既要讀文件又要處理發(fā)送的壓力,從而顯著提高服務(wù)器效率,特別是處理大文件下載的情形下。

X-Sendfile 通過一個特定的 HTTP header 來實現(xiàn):在 X-Sendfile 頭中指定一個文件的地址來通告前端 web 服務(wù)器。當(dāng) web 服務(wù)器檢測到后端發(fā)送的這個 header 后,它將忽略后端的其他輸出,而使用自身的組件(包括 緩存頭 和 斷點重連 等優(yōu)化)機制將文件發(fā)送給用戶。

不過,在使用 X-Sendfile 之前,我們必須明白這并不是一個標(biāo)準(zhǔn)特性,在默認情況下它是被大多數(shù) web 服務(wù)器禁用的。而不同的 web 服務(wù)器的實現(xiàn)也不一樣,包括規(guī)定了不同的 X-Sendfile 頭格式。如果配置失當(dāng),用戶可能下載到 0 字節(jié)的文件。

使用 X-Sendfile 將允許下載非 web 目錄中的文件(例如/root/),即使文件在 .htaccess 保護下禁止訪問,也會被下載。

不同的 web 服務(wù)器實現(xiàn)了不同的 HTTP 頭

SENDFILE 頭 使用的 WEB 器
X-Sendfile Apache, Lighttpd v1.5, Cherokee
X-LIGHTTPD-send-file Lighttpd v1.4
X-Accel-Redirect Nginx, Cherokee

使用 X-SendFile 的缺點是你失去了對文件傳輸機制的控制。例如如果你希望在完成文件下載后執(zhí)行某些操作,比如只允許用戶下載文件一次,這個 X-Sendfile 是沒法做到的,因為后臺的 php 腳本并不知道下載是否成功。

三、怎樣使用?

Apache 請參考mod_xsendfile模塊。下面我介紹 Nginx 的用法。

Nginx 默認支持該特性,不需要加載額外的模塊。只是實現(xiàn)有些不同,需要發(fā)送的 HTTP 頭為 X-Accel-Redirect。另外,需要在配置文件中做以下設(shè)定

location /protected/ {
 internal;
 root  /some/path;
}

表示這個路徑只能在 Nginx 內(nèi)部訪問,不能用瀏覽器直接訪問防止未授權(quán)的下載。


于是 PHP 發(fā)送 X-Accel-Redirect 給 Nginx:

]<?php
  $filePath = '/protected/iso.img';
  header('Content-type: application/octet-stream');
  header('Content-Disposition: attachment; filename="' . basename($file) . '"');
  //讓Xsendfile發(fā)送文件
  header('X-Accel-Redirect: '.$filePath);
?>

這樣用戶就會下載到 /some/path/protected/iso.img 這個路徑下的文件。
如果你想發(fā)送的是 /some/path/iso.img 文件,那么 Nginx 配置應(yīng)該是

location /protected/ {
 internal;
 alias  /some/path/; # 注意最後的斜杠
}

相關(guān)文章

  • Nginx?502?bad?gateway錯誤解決的九種方案及原因

    Nginx?502?bad?gateway錯誤解決的九種方案及原因

    一般在訪問某些網(wǎng)站或者我們在做本地測試的時候,服務(wù)器突然返回502?Bad?Gateway?Nginx,這種問題相信大家也遇到不少了,下面這篇文章主要給大家介紹了關(guān)于Nginx?502?bad?gateway錯誤解決的九種方案及原因,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-08-08
  • Nginx配置及熱升級的詳細介紹

    Nginx配置及熱升級的詳細介紹

    Nginx與Apache一樣,都是web服務(wù)器,但是Nginx比Apache多一些功能,比如Nginx可以做代理,可以做負載均衡,這篇文章主要介紹了Nginx配置以及熱升級,需要的朋友可以參考下
    2024-07-07
  • Nginx限制搜索引擎爬蟲頻率、禁止屏蔽網(wǎng)絡(luò)爬蟲配置示例

    Nginx限制搜索引擎爬蟲頻率、禁止屏蔽網(wǎng)絡(luò)爬蟲配置示例

    這篇文章主要介紹了Nginx限制搜索引擎爬蟲頻率、禁止屏蔽網(wǎng)絡(luò)爬蟲配置示例,限制爬蟲頻率用于一些無良爬蟲,禁止爬蟲用于一些不需要收錄的網(wǎng)站,需要的朋友可以參考下
    2014-07-07
  • Nginx禁止國外IP訪問我的網(wǎng)站的實現(xiàn)

    Nginx禁止國外IP訪問我的網(wǎng)站的實現(xiàn)

    本文主要介紹了Nginx禁止國外IP訪問我的網(wǎng)站的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Nginx負載均衡/SSL配置的實現(xiàn)

    Nginx負載均衡/SSL配置的實現(xiàn)

    這篇文章主要介紹了Nginx負載均衡/SSL配置的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • 解決nginx訪問頁面中文亂碼的問題

    解決nginx訪問頁面中文亂碼的問題

    這篇文章主要為大家介紹了nginx訪問頁面中文亂碼解決方案,文中有相關(guān)的代碼示例供大家參考,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2023-09-09
  • 詳解Nginx如何根據(jù)swagger關(guān)鍵字屏蔽頁面

    詳解Nginx如何根據(jù)swagger關(guān)鍵字屏蔽頁面

    這篇文章主要為大家詳細介紹了Nginx 如何根據(jù)swagger關(guān)鍵字屏蔽頁面的實現(xiàn)方案,文中有詳細的解決方案,對我們的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-08-08
  • Nginx反向代理實現(xiàn)Vue跨域的示例

    Nginx反向代理實現(xiàn)Vue跨域的示例

    本文主要介紹了Nginx反向代理實現(xiàn)Vue跨域的示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Nginx負載均衡中的Memcached緩存模塊

    Nginx負載均衡中的Memcached緩存模塊

    Nginx?的?ngx_http_memcached_module?模塊本身并沒有提供緩存功能,它只是一個將用戶請求轉(zhuǎn)發(fā)到?Memcached?服務(wù)器的代理模塊,這篇文章主要介紹了Nginx負載均衡之Memcached緩存模塊,需要的朋友可以參考下
    2024-06-06
  • 如何利用nginx處理DDOS進行系統(tǒng)優(yōu)化詳解

    如何利用nginx處理DDOS進行系統(tǒng)優(yōu)化詳解

    防御DDOS是一個系統(tǒng)工程,攻擊花樣多,防御的成本高瓶頸多,防御起來即被動又無奈,下面這篇文章主要給大家介紹了關(guān)于如何利用nginx處理DDOS進行系統(tǒng)優(yōu)化的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2018-08-08

最新評論

和田县| 开阳县| 聊城市| 永登县| 伊宁市| 高邮市| 清远市| 团风县| 舞钢市| 郯城县| 青冈县| 黑山县| 临泽县| 广水市| 敦化市| 慈溪市| 运城市| 固原市| 安远县| 青铜峡市| 东乌珠穆沁旗| 吴旗县| 大庆市| 高雄市| 石景山区| 谷城县| 札达县| 淮安市| 含山县| 马山县| 沾益县| 凤庆县| 防城港市| 江川县| 宜昌市| 宁陵县| 巴彦县| 明溪县| 西城区| 宣汉县| 乐陵市|