日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

【Nginx18】Nginx學(xué)習(xí):WebDav文件存儲(chǔ)與圖片媒體處理模塊

 硬核項(xiàng)目經(jīng)理 2023-08-17 發(fā)布于湖南

Nginx學(xué)習(xí):WebDav文件存儲(chǔ)與圖片媒體處理模塊

今天的內(nèi)容怎么說呢?有兩個(gè)感覺非常有意思,另外一些就差點(diǎn)意思。有意思的是,咱們可以直接用 Nginx 的 Webdav 功能搭建一個(gè)網(wǎng)盤,另外也可以實(shí)現(xiàn)動(dòng)態(tài)的圖片處理。這兩個(gè)功能吧,有其局限性,但也非常方便。另外的流媒體部分的內(nèi)容,主要 FLV 和 MP4 這兩種視頻媒體格式的處理,說實(shí)話,沒啥實(shí)際的內(nèi)容,了解一下就好了。

WebDav

關(guān)于 WebDav 是干嘛的,大家可以自己去百度一下。沒學(xué)之前我也不知道這是個(gè)什么東西,我們學(xué)習(xí),其實(shí)往往都是通過某一個(gè)點(diǎn)而延伸到其它方面的。比如說學(xué)習(xí) Nginx ,一直強(qiáng)調(diào)的就是要有網(wǎng)絡(luò)的基礎(chǔ)。然后基于網(wǎng)絡(luò)能干什么事呢?那可就太多了,Web 應(yīng)用服務(wù)器只是 Nginx 其中的一個(gè)功能,而一個(gè)簡(jiǎn)單的基于 HTTP 的網(wǎng)盤,就只是它提供的一個(gè)核心功能中的小功能而已。

這個(gè)功能模塊的命名是 ngx_http_dav_module ,它不是核心源碼中的,所以是需要我們?cè)诰幾g的時(shí)候選裝的。不過,在實(shí)際測(cè)試并且查詢相關(guān)資料之后,發(fā)現(xiàn)原生的模塊是有坑的,還需要再多裝一個(gè)第三方模塊才能更好地使用這個(gè)功能。在這里也不賣關(guān)子,先告訴大家要安裝什么,怎么安裝,然后再看每個(gè)指令,最后測(cè)試的時(shí)候再說到底為啥需要多裝一個(gè)第三方模塊。

首先我們要下載這個(gè)模塊,直接 Github 去下載就好了,放在哪里都可以。

[root@localhost ~]# git clone https://github.com/arut/nginx-dav-ext-module.git

然后就是去源碼包中進(jìn)行編譯安裝,使用 --add-module 添加第三方模塊。

[root@localhost nginx-1.23.0]# ./configure …………………… --with-http_dav_module --add-module=/root/nginx-dav-ext-module/
[root@localhost nginx-1.23.0]# make && make install

安裝完成之后就可以使用了,我們先來看看 WebDav 模塊中的配置指令有哪些,它們都可以配置在 http、server、location 模塊下。

create_full_put_path

允許創(chuàng)建所有需要的中間目錄。

create_full_put_path on | off;

默認(rèn)值是 off ,其實(shí)只要改成 on 的話,我們就可以自己創(chuàng)建新的文件夾,因?yàn)?WebDAV 規(guī)范只允許在已經(jīng)存在的目錄中創(chuàng)建文件。

dav_access

為新創(chuàng)建的文件和目錄設(shè)置訪問權(quán)限。

dav_access users:permissions ...;

默認(rèn)值是 user:rw 。意思就是用戶可以有讀寫權(quán)限,這個(gè)其實(shí)和 Linux 的用戶權(quán)限比較類似。不過一般我們操作的 WebDav 目錄都會(huì)設(shè)置成和 Nginx 中的 user 配置指令一樣的用戶及用戶組,比如我這里就是 www 用戶和用戶組,那么就是對(duì)于 www 用戶來說的權(quán)限。如果指定了任何組或所有訪問權(quán)限,則可以省略用戶權(quán)限,比如直接設(shè)置 group:rw all:r; 就可以了。

dav_methods

允許指定的 HTTP 和 WebDAV 方法。

dav_methods off | method ...;

默認(rèn)值是 off ,表示拒絕所有的方法。這里的方法是什么意思呢?和我們 HTTP 中的 Method 是一樣的,但是 WebDav 的方法不是完全一樣的。比如它支持配置的有:PUT、DELETE、MKCOL、COPY 和 MOVE。

從名字可以看出,PUT 是上傳文件,它會(huì)被寫入到臨時(shí)文件中,然后文件被重命名。DELETE 就是刪除,MKCOL 是創(chuàng)建文件夾,COPY 是復(fù)制,MOVE 就是移動(dòng)啦。貌似和 RESTFul 有點(diǎn)像啊,一種方法代表一種意思。

從版本 0.8.9 開始,臨時(shí)文件和持久存儲(chǔ)可以放在不同的文件系統(tǒng)上。但是,請(qǐng)注意,在這種情況下,文件是跨兩個(gè)文件系統(tǒng)復(fù)制的,而不是廉價(jià)的重命名操作。因此,建議對(duì)于任何給定位置,保存的文件和保存臨時(shí)文件的目錄(由 client_body_temp_path 指令設(shè)置)放在同一個(gè)文件系統(tǒng)上。 使用 PUT 方法創(chuàng)建文件時(shí),可以通過在“Date”標(biāo)頭字段中傳遞修改日期來指定修改日期。

注意,要使用第三方模塊的坑就在這里,一會(huì)我們就會(huì)說到。

min_delete_depth

允許 DELETE 方法刪除文件,前提是請(qǐng)求路徑中的元素?cái)?shù)量不少于指定數(shù)量。

min_delete_depth number;

默認(rèn)值是 0 ,一般不太需要設(shè)置這個(gè)配置,為啥呢?假如,配置這個(gè)選項(xiàng)為 min_delete_depth 4 那么允許刪除請(qǐng)求中的文件路徑是這樣的

/users/00/00/name
/users/00/00/name/pic.jpg
/users/00/00/page.html

而下面這種是不能刪除的。

/users/00/00

是的,就是說只能刪除幾層目錄。0 就表示一層就可以刪,這是比較符合我們?nèi)粘5牧?xí)慣的。

WebDav 測(cè)試

就四個(gè)配置指令,不多吧,但是我們?cè)趯?shí)際的配置中還會(huì)用到其它的一些配置。

location /webdav/ {
    root                  /usr/local/nginx/html;
    autoindex on;

    client_body_temp_path /tmp;

    dav_methods PUT DELETE MKCOL COPY MOVE;
    dav_ext_methods PROPFIND OPTIONS LOCK UNLOCK; # DAV擴(kuò)展支持的請(qǐng)求方法

    create_full_put_path  on;
    dav_access            group:rw  all:r;

  auth_basic "webdav";
  auth_basic_user_file /etc/nginx/conf/htpasswd;

    #limit_except GET {
    #    allow 192.168.56.0/32;
    #    #deny  all;
    #}
}

上面的配置中,我們?yōu)?/webdav/ 這個(gè)目錄設(shè)置一個(gè) location ,注意,目錄要?jiǎng)?chuàng)建好哦,要不和普通頁(yè)面一樣會(huì)一直 403 的。然后就是我們學(xué)過的 root、autoindex、client_body_temp_path ,不用多解釋了吧,autoindex 上篇文章剛學(xué),主要是為了展示我們用瀏覽器也可以看到文件變化。

接著,我們就配置了 dav_methods 和 dav_ext_methods 兩個(gè)指令。dav_ext_methods 是啥?它正是我們所安裝的第三方模塊中帶的配置指令。默認(rèn)情況下,自帶的 ngx_http_dav_module 模塊中,dav_methods 只能設(shè)置上面說的那五個(gè)指令,但是在我的實(shí)際測(cè)試中,比如使用 Mac 訪達(dá)的【前往】->【連接服務(wù)器】進(jìn)行連接時(shí),會(huì)發(fā)送下面這樣一請(qǐng)求。

192.168.56.1 - - [17/Aug/2022:20:46:19 -0400] "OPTIONS /webdav/ HTTP/1.1" 405 157 "-" "WebDAVLib/1.3"

注意,它的請(qǐng)求方法是 OPTIONS ,不在自帶的那五個(gè)方法之中。因此,我們需要擴(kuò)展模塊來實(shí)現(xiàn)對(duì)一些擴(kuò)展方法的支持,否則,這個(gè)請(qǐng)求就會(huì)一直返回 405 狀態(tài),客戶端自然也就連不上。

接下來,設(shè)置 create_full_put_path 為 on ,設(shè)置權(quán)限為 group:rw all:r; ,基本就是常規(guī)的全給權(quán)限的操作了。

再往下,又是我們前面學(xué)過的訪問認(rèn)證的兩個(gè)命令,使用的也是之前我們?cè)O(shè)置過的用戶名和密碼文件。

好了,使用 Mac 的話你就可以使用 Finder 的 【前往】->【連接服務(wù)器】來試試連接了,要輸入用戶名或密碼的話直接輸入 auth_basic 中有的用戶名和密碼就可以了。如果你是 Windows 電腦,也是一樣在通過文件夾中的遠(yuǎn)程訪問工具就可以打開了。

不過,使用這些操作系統(tǒng)原生的文件系統(tǒng)工具,你會(huì)發(fā)現(xiàn)一個(gè)問題,那就是我們沒辦法創(chuàng)建文件或目錄,也沒辦法拖一個(gè)進(jìn)去。這主要是因?yàn)樗鼈儾恢С稚厦婺俏鍌€(gè)完整的 WebDav 方法。所以我們需要去安裝一些支持 WebDav 的工具,比如我在 Mac 的應(yīng)用商店中找到的一個(gè)免費(fèi)的 FE File Explorer 軟件,直接安裝后,選擇創(chuàng)建一個(gè)新的 WebDav 連接,然后填入 URL 地址以及帳號(hào)密碼就可以操作了。

好了?,F(xiàn)在這個(gè)網(wǎng)盤已經(jīng)可以使用了。不過大家也可以試一下,如果不用 auth_basic 會(huì)怎么樣?注釋掉那兩行并重載 Nginx 的話,咱們其實(shí)還可以使用 Linux 的用戶登錄,比如我這里只有 root 用戶,那么我們就可以用 root 的帳號(hào)和密碼進(jìn)行登錄,一樣的可以進(jìn)行文件操作。

另外,在這個(gè) location 中,還可以通過之前學(xué)過的 limit_except 指令來進(jìn)行訪問限制,這樣如果真是的在外網(wǎng)暴露出來當(dāng)做網(wǎng)盤的話,也可以更進(jìn)一步地增加安全性。同時(shí),還可以配置 https 來通過 https 進(jìn)行連接傳輸。

不過話說回來,真正要弄一個(gè)自己個(gè)人的網(wǎng)盤的話,還是買個(gè)大的硬盤和一個(gè)好點(diǎn)的路由或者直接買個(gè)家庭NAS,畢竟電腦搭一個(gè)還費(fèi)更多的電呢~

空?qǐng)D片 empty_gif

空?qǐng)D片?這又是啥?其實(shí)呀,并不是一個(gè)完全的空?qǐng)D片,而是一個(gè)只有 1 個(gè)像素的,并且這個(gè)像素還是透明的一張 GIF 圖片。

location /emptygif/ {
  empty_gif;
}

試試訪問 /emptygif/ 或者這個(gè)路徑下的任意子路徑或文件,返回的都是一個(gè)啥也看不到的 GIF 圖片,使用下載工具的還能下載下來,并且真的是一張圖片。

那么,要這個(gè)東西干嘛呢?如果你接觸過大數(shù)據(jù)技術(shù)的話,其中有一種埋點(diǎn)上報(bào)方式就是前端直接請(qǐng)求一個(gè)類似于這種形式的空?qǐng)D片,然后將埋點(diǎn)數(shù)據(jù)帶到 GET 參數(shù)中。大數(shù)據(jù)相關(guān)的工具直接分析 Nginx 的 access_log ,提取其中的 GET 參數(shù)進(jìn)行數(shù)據(jù)分析。

有一個(gè)最典型的例子,就是百度統(tǒng)計(jì)。

看到?jīng)]有,大家從百度統(tǒng)計(jì)中獲取到的那段統(tǒng)計(jì)代碼,會(huì)加載一個(gè) hm.js 的遠(yuǎn)程 JS 文件并運(yùn)行里面的代碼。然后在這個(gè)文件中,會(huì)收集客戶端瀏覽器的很多信息,并拼接成 GET 參數(shù),最后再使用這些參數(shù)請(qǐng)求一下 hm.gif 這個(gè) empty gif 圖片。

這么做有什么好處呢?這是一種純靜態(tài),不需要數(shù)據(jù)庫(kù),可以支撐超高并發(fā)量的收集數(shù)據(jù)的一種方式。雖說百度的這張圖片返回的響應(yīng)頭顯示的服務(wù)器是 Apache 吧,但用 Nginx 也是一樣的。我們不需要后端程序,也不用將這一堆參數(shù)放到數(shù)據(jù)庫(kù),甚至連緩存都不用,就直接使用 Apache 或者 Nginx 自帶的這種訪問日志的功能,就可以收集到這些海量的請(qǐng)求數(shù)據(jù)了。要知道,普通單臺(tái) Nginx 的并發(fā)量最差最差的配置都是可以達(dá)到幾萬級(jí)別的。

empty_gif

返回一個(gè)透明像素的GIF圖片。

empty_gif;

沒有配置值,也不需要配置值,只能配置在 location 下面。

圖片過濾 ImageFilter

還記得之前我們?cè)?PHP 的文章和視頻中學(xué)過的 GD 庫(kù)、ImageMagick 和 GMagick 這些內(nèi)容嘛?如果不記得的小伙伴就去公眾號(hào)或者我的博客搜索哈,也有對(duì)應(yīng)的標(biāo)簽可以快速地找到。

沒錯(cuò),圖片過濾模塊就是可以像上面說那些 PHP 中的功能一樣,方便快捷地對(duì)圖片進(jìn)行一些簡(jiǎn)單的處理。功能沒有動(dòng)態(tài)語言的強(qiáng)大,但是提供的配置指令說實(shí)話也夠用了。它的全名是 ngx_http_image_filter_module ,需要獨(dú)立安裝,在 configure 中添加 --with-http_image_filter_module 就可以了。此外,它還需要操作系統(tǒng)中有 libgd 庫(kù)的支持,因此,我們還需要安裝 GD 庫(kù)組件。

yum install gd gd-devel

這一個(gè)模塊,我們根據(jù)配置指令的說明,同步地一個(gè)一個(gè)地測(cè)試。除了 image_filter 只能配置在 location 下之外,其它的都可以配置在 http、server、location 中。在此之前,我們還需要準(zhǔn)備好一個(gè) img 目錄和圖片文件。

原始的圖片文件是這樣的。

image_filter

設(shè)置圖像變換的操作。

image_filter off;
image_filter test;
image_filter size;
image_filter rotate 90 | 180 | 270;
image_filter resize width height;
image_filter crop width height;

好多配置選項(xiàng)呀,默認(rèn)是 off 也就是關(guān)閉的。它決定了后面我們其它的指令是否可用,也就是說,如果是 off 狀態(tài),那么其它相關(guān)的配置指令也都不會(huì)起作用。

在這些配置參數(shù)中,test 和 size 是單獨(dú)使用的,后面三個(gè)可以配合使用。這是啥意思?先看解釋,最后再說。

  • test 確保應(yīng)答是 JPEG ,GIF 或 PNG 格式的圖像。否則錯(cuò)誤 415 (Unsupported Media Type) 將被返回。
location /img/ {
 #image_filter test;
}

如果正常訪問上面的路徑,我們可以打開 index.html ,本身這就是一個(gè)正常的 html 頁(yè)面嘛。但是如果開啟上面的注釋,再次訪問 index.html ,就會(huì)發(fā)現(xiàn)返回 415 錯(cuò)誤了。

  • size 以JSON格式返回圖像信息。
location /img3/{
  alias /usr/local/nginx/html/img/;
  image_filter size;
}

訪問 /img3/1.jpeg 和 /img3/2.jepg 會(huì)返回這樣的內(nèi)容。

http://192.168.56.88/img3/1.jpeg
{
    "img": {
        "width": 1920,
        "height": 1200,
        "type": "jpeg"
    }
}

// http://192.168.56.88/img3/2.jpeg
{
    "img": {
        "width": 4878,
        "height": 3215,
        "type": "jpeg"
    }
}
  • rotate 將圖像逆時(shí)針旋轉(zhuǎn)指定角度,參數(shù)的值可以包含變量??梢詥为?dú)使用,或與 resize 和 crop 變換同時(shí)使用。
  • resize width height 按比例縮小圖像至指定大小。 如果想只指定其中一維,另一維可以指定為: - 。 如果有錯(cuò)誤發(fā)生,服務(wù)器會(huì)返回 415 (Unsupported Media Type). 參數(shù)的值可以包含變量。 當(dāng)與 rotate 參數(shù)同時(shí)使用時(shí), 旋轉(zhuǎn)發(fā)生在縮放之后。
location /img1/ {
  alias /usr/local/nginx/html/img/;
  image_filter resize 300 300;
  image_filter rotate 90;
  error_page 415  /emptygif/;
  error_page 404  /emptygif/;
}

我們直接測(cè)試 rotate 和 resize ,注意,rotate 是只能和 resize 或 crop 之一配合。它是旋轉(zhuǎn),另外兩個(gè)都是改變大小。在這個(gè)配置中,我們會(huì)對(duì)圖片進(jìn)行等比例縮放,注意,并不是圖片直接變成 300*300 而是根據(jù)長(zhǎng)寬大小,選擇合適的長(zhǎng)或?qū)挘s放到長(zhǎng)寬都不超 300 的界限。這兩個(gè)值也可以設(shè)置成不一樣的,以小的為準(zhǔn)??纯磮D片的效果是啥樣。

是不是有點(diǎn)意思了,有 ImageMagick 的感覺了吧。另外在這個(gè)路徑的配置中,我們還加入了 error_page ,讓 415 和 404 的錯(cuò)誤都指向上一小節(jié)學(xué)習(xí)到的 empty_gif 模塊中,這樣就不會(huì)出現(xiàn)前面的 415 錯(cuò)誤頁(yè)面啦。

  • crop width height 按比例以圖像的最短邊為準(zhǔn)對(duì)圖像大小進(jìn)行縮小,然后裁剪另一邊多出來的部分。 如果想只指定其中一維,另一維可以指定為: - 。 如果有錯(cuò)誤發(fā)生,服務(wù)器會(huì)返回 415 (Unsupported Media Type). 參數(shù)的值可以包含變量。 當(dāng)與 rotate 參數(shù)同時(shí)使用時(shí), 旋轉(zhuǎn)發(fā)生在裁剪之前。

    location /img2/ {
      alias /usr/local/nginx/html/img/;
      image_filter crop 500 300;
      #image_filter_jpeg_quality 95;
      #image_filter_sharpen 10;
    }

    注意,這個(gè)是裁剪了,指定的寬高是多少,裁剪出來的圖片大小就是多少了。下面注釋的指令我們馬上就講。

對(duì)于后面三個(gè)參數(shù)來說,如果你在有這三個(gè)參數(shù)的 location 中同時(shí)加入了 test 或者 size ,它們的縮放、旋轉(zhuǎn)、裁剪效果馬上就無效了。大家可以自己試試哦,這就是前面說的不兼容的問題。另外 crop 和 resize 放一起會(huì)是什么效果呢?會(huì)以最后設(shè)置的為準(zhǔn)。

image_filter_buffer

設(shè)置用來讀圖像的緩沖區(qū)的最大值。

image_filter_buffer size;

默認(rèn)值是 1M ,訪問我們上面第二張圖片 2.jpeg ,它的大小超過 1M 了,正常情況下會(huì)返回 415 錯(cuò)誤,這時(shí)我們就可以設(shè)置 image_filter_buffer ,調(diào)大之后就可以訪問了,我們可以將它放在 http 或者 server 下面,這樣我們上面測(cè)試的那些路徑就都可以打開第二張圖片了。

image_filter_interlace

啟用圖像隔行掃描的。

image_filter_interlace on | off;

默認(rèn)值是 off ,只對(duì) JPG 圖片有效果。這個(gè)其實(shí)我們?cè)瓉硪舱f過,就是 JPG 圖片在網(wǎng)頁(yè)呈現(xiàn)有兩種方式,一個(gè)是一行一行的出現(xiàn),一個(gè)是先模糊后清晰的。這個(gè)在 PhotoShop 導(dǎo)出 Web 格式圖片時(shí)可以設(shè)置。不過我這里沒裝,所以也不多做演示了。直接配置針對(duì)我從網(wǎng)上找到的這兩張圖片也沒啥效果。

image_filter_jpeg_quality

設(shè)置變換后的JPEG圖像的質(zhì)量。

image_filter_jpeg_quality quality;

默認(rèn)值是 75 ,在上面 crop 的設(shè)置中有注釋,大家可以打開,設(shè)置成 1 看看效果就明白什么意思了。大家應(yīng)該了解過,JPG 是壓縮格式的圖片,我們?cè)?PhotoShop 導(dǎo)出時(shí)也可以對(duì) JPG 格式圖片設(shè)置壓縮比,這個(gè)值越小,圖片越小,但越不清楚。這個(gè)值越大,圖片大小也越大,圖片也越清楚。它只對(duì) JPG 圖片有效果,并且是 resize、rotate、crop 操作之后的 JPG 圖片,其它格式無效。

image_filter_sharpen

增加最終圖像的清晰度。

image_filter_sharpen percent;

默認(rèn)值是 0 ,也就是不做操作。其實(shí)就是圖形工具中的銳化工具,同樣可以在上面 crop 中打開注釋進(jìn)行測(cè)試,和 image_filter_jpeg_quality 的要求一樣,不過可以不只是 JPG 圖片。

image_filter_transparency

定義當(dāng)對(duì)PNG,或者GIF圖像進(jìn)行顏色變換時(shí)是否需要保留透明度。

image_filter_transparency on|off;

默認(rèn)值是 on ,損失透明度有可能可以獲得更高的圖像質(zhì)量,PNG圖像中的alpha通道的透明度默認(rèn)會(huì)一直被保留。我沒有測(cè)試,大家可以自己試試哈。

image_filter_webp_quality

設(shè)置轉(zhuǎn)換后的 WebP 圖像的所需質(zhì)量。

image_filter_webp_quality quality;

和 image_filter_jpeg_quality 類似,只不過它針對(duì)的是 WebP 格式的圖片。這種圖片格式現(xiàn)在也比較流行了,可接受的值在 1 到 100 的范圍內(nèi)。較小的值通常意味著較低的圖像質(zhì)量和較少的數(shù)據(jù)傳輸。參數(shù)值可以包含變量。

一個(gè)好玩的小例子

最后,我們?cè)賮碜鲆粋€(gè)小例子。很多云存儲(chǔ)比如 阿里云的OSS、七牛云、UpYun 的存儲(chǔ)功能中,都有一項(xiàng)是可以動(dòng)態(tài)改變圖片的大小,比如等比例縮放或裁剪等,只需要我們?cè)谡?qǐng)求圖片的 URL 后面加上參數(shù)就可以,比如說七牛是類似于這樣的鏈接:http://xxxx/1.jpg?imageView2/1/w/200/h/200。大部分情況下,如果我們自己實(shí)現(xiàn),可以借助 PHP 配合 ImageMagicK 來達(dá)到同樣的效果。但是在學(xué)完上面的內(nèi)容之后,大家是不是馬上就想到了,通過 Nginx 也可以實(shí)現(xiàn)呀。

location /img4/ {
  alias /usr/local/nginx/html/img/;
  if ($arg_w = "") {
   set $arg_w '-';
  }
  if ($arg_h = "") {
   set $arg_h '-';
  }
  image_filter resize $arg_w $arg_h;
  image_filter_jpeg_quality 95;
}

直接將 resize 的值設(shè)置成變量就可以啦?,F(xiàn)在訪問 /img4/1.jepg ,然后加上參數(shù) ?w=400&h=150 看看效果吧。是不是很有意思,像這樣簡(jiǎn)單的處理,其實(shí)都不需要我們單獨(dú)去安裝 ImageMagicK 以及相應(yīng)的 PHP 擴(kuò)展了。

FLV 文件

ngx_http_flv_module 模塊,為Flash Video(FLV)文件 提供服務(wù)端偽流媒體支持。這個(gè)模塊需要 --with-http_flv_module 編譯安裝,不是核心源碼中的。

FLV

為Flash Video(FLV)文件 提供服務(wù)端偽流媒體支持。

flv;

通過返回以請(qǐng)求偏移位置開始的文件內(nèi)容,該模塊專門處理在查詢串中有 start 參數(shù)的請(qǐng)求, 和有預(yù)先設(shè)置到FLV頭部的請(qǐng)求。只能在 location 中設(shè)置。

不知道咋測(cè)試,所以大家了解一下就好了。

MP4 文件

和上面那個(gè) FLV 的模塊是一樣的,全名是 ngx_http_mp4_module 模塊。為H.264/AAC文件,主要是以 .mp4.m4v、和.m4a為擴(kuò)展名的文件, 提供偽流媒體服務(wù)端支持。

偽流媒體是與Flash播放器一起配合使用的。 播放器向服務(wù)端發(fā)送HTTP請(qǐng)求,請(qǐng)求中的查詢串是以開始時(shí)間為參數(shù)的(以 start簡(jiǎn)單命名),而服務(wù)端以流響應(yīng),這樣流的開始位置就能與請(qǐng)求中的時(shí)間相對(duì)應(yīng)。 例如:

http:///elephants_dream.mp4?start=238.88

這樣就允許隨意拖放,或者從節(jié)目的中途開始回放。

為了支持隨機(jī)訪問,H.264格式將元數(shù)據(jù)放到所謂的"moov atom"中。 "moov atom"是文件的一部分,放有整個(gè)文件的索引信息。

為了開啟回放,播放器首先需要讀取元數(shù)據(jù)。 這是通過發(fā)送一個(gè)特別的以start=0為 參數(shù)請(qǐng)求來完成的。 許多編碼軟件會(huì)將元數(shù)據(jù)插入到文件末尾, 這樣做對(duì)偽流媒體來說是不好的: 元數(shù)據(jù)需要在文件開始時(shí)定位好,否則整個(gè)文件需要下載完才能開始播放。 如果文件組織的很好(將元數(shù)據(jù)放到文件開頭),那么nginx僅僅返回文件的內(nèi)容, 否則,nginx不得不讀取文件并準(zhǔn)備一個(gè)新的流,將元數(shù)據(jù)放在媒體數(shù)據(jù)前面, 這將導(dǎo)致一些CPU,內(nèi)存,磁盤I/O開銷。 所以一個(gè)比較好的主意是為偽流媒體準(zhǔn)備文件 , 而不是讓nginx處理請(qǐng)求時(shí)做。

對(duì)于匹配有非零 start 參數(shù)的請(qǐng)求,nginx從文件中讀取元數(shù)據(jù),從請(qǐng)求的偏移位置開始準(zhǔn)備流數(shù)據(jù)發(fā)送給客戶端。 這與上面描述的情況有同樣的開銷。

如果匹配的請(qǐng)求沒有包含 start 參數(shù),就不會(huì)有額外開銷,而文件僅僅是以靜態(tài)資源被發(fā)送。 一些播放器也支持字節(jié)范圍請(qǐng)求,所以就根本不需要這個(gè)模塊。

這個(gè)模塊默認(rèn)是不安裝的,需要通過 --with-http_mp4_module 來配置開啟。

mp4

配置開啟該模塊處理當(dāng)前路徑。

mp4;

只能定義在 location 當(dāng)中。

mp4_buffer_size

設(shè)置處理MP4文件的初始內(nèi)存大小。

mp4_buffer_size size;

默認(rèn)值是 512K 。

mp4_max_buffer_size

在處理元數(shù)據(jù)時(shí),可能必需較大的緩存。 它的大小不能超過 size 指定的值, 否則 Nginx 將會(huì)返回服務(wù)器錯(cuò)誤。

mp4_max_buffer_size size;

默認(rèn)值是 10M ,返回的是 500 錯(cuò)誤,并記錄日志,日志格式是這樣的:

"/some/movie/file.mp4" mp4 moov atom is too large: 12583268, you may want to increase mp4_max_buffer_size"

總結(jié)

怎么樣,WebDav 和 ImageFilter 功能都是非常有意思的吧。流媒體這一塊的確實(shí)是不知道要怎么測(cè)試。因此,也就沒有更加詳細(xì)的介紹了。如果有了解的小伙伴也希望評(píng)論留言一起學(xué)習(xí)哦。

下篇文章開始,我們要學(xué)習(xí)一個(gè)非常重要的子模塊,那就是 FastCGI 相關(guān)的模塊配置。

參考文檔:

http:///en/docs/http/ngx_http_dav_module.html

http:///en/docs/http/ngx_http_empty_gif_module.html

http:///en/docs/http/ngx_http_image_filter_module.html

http:///en/docs/http/ngx_http_flv_module.html

http:///en/docs/http/ngx_http_mp4_module.html

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多