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

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

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

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

例如下面的代碼:

<?php
  // 用戶身份認(rèn)證,若驗(yàn)證失敗跳轉(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)過一個(gè)固定的 buffer 去循環(huán)讀取到內(nèi)存,再發(fā)送給前端 web 服務(wù)器,最后才到達(dá)用戶。當(dāng)需要下載的文件很大的時(shí)候,這種方式將消耗大量?jī)?nèi)存,甚至引發(fā) php 進(jìn)程超時(shí)或崩潰。Cache 也很頭疼,更不用說中斷重連的情況了。
一個(gè)理想的解決方式應(yīng)該是,由 php 程序進(jìn)行權(quán)限檢查等邏輯判斷,一切通過后,讓前臺(tái)的 web 服務(wù)器直接將文件發(fā)送給用戶——像 Nginx 這樣的前臺(tái)更善于處理靜態(tài)文件。這樣一來 php 腳本就不會(huì)被 I/O 阻塞了。

二、什么是 X-Sendfile?

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

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

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

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

不同的 web 服務(wù)器實(shí)現(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 的缺點(diǎn)是你失去了對(duì)文件傳輸機(jī)制的控制。例如如果你希望在完成文件下載后執(zhí)行某些操作,比如只允許用戶下載文件一次,這個(gè) X-Sendfile 是沒法做到的,因?yàn)楹笈_(tái)的 php 腳本并不知道下載是否成功。

三、怎樣使用?

Apache 請(qǐng)參考mod_xsendfile模塊。下面我介紹 Nginx 的用法。

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

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

表示這個(gè)路徑只能在 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);
?>

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

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

相關(guān)文章

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

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

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

    Nginx配置及熱升級(jí)的詳細(xì)介紹

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

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

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

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

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

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

    這篇文章主要介紹了Nginx負(fù)載均衡/SSL配置的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(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)鍵字屏蔽頁面

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

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

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

    Nginx負(fù)載均衡中的Memcached緩存模塊

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

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

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

最新評(píng)論

荆州市| 台前县| 额尔古纳市| 屏南县| 扎囊县| 新宾| 绍兴市| 遂平县| 保康县| 孝感市| 和硕县| 托克逊县| 青河县| 正宁县| 芮城县| 长治县| 丘北县| 禹州市| 西乌珠穆沁旗| 竹山县| 大名县| 贵州省| 上高县| 涞源县| 武隆县| 开化县| 冕宁县| 赣州市| 定日县| 江都市| 临颍县| 左贡县| 定远县| 原平市| 南丰县| 留坝县| 江陵县| 白朗县| 富裕县| 湖州市| 竹山县|