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 去下載就好了,放在哪里都可以。
然后就是去源碼包中進(jìn)行編譯安裝,使用
安裝完成之后就可以使用了,我們先來看看 WebDav 模塊中的配置指令有哪些,它們都可以配置在 http、server、location 模塊下。 create_full_put_path允許創(chuàng)建所有需要的中間目錄。
默認(rèn)值是 off ,其實(shí)只要改成 on 的話,我們就可以自己創(chuàng)建新的文件夾,因?yàn)?WebDAV 規(guī)范只允許在已經(jīng)存在的目錄中創(chuàng)建文件。 dav_access為新創(chuàng)建的文件和目錄設(shè)置訪問權(quán)限。
默認(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è)置 dav_methods允許指定的 HTTP 和 WebDAV 方法。
默認(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ù)量。
默認(rèn)值是 0 ,一般不太需要設(shè)置這個(gè)配置,為啥呢?假如,配置這個(gè)選項(xiàng)為
而下面這種是不能刪除的。
是的,就是說只能刪除幾層目錄。0 就表示一層就可以刪,這是比較符合我們?nèi)粘5牧?xí)慣的。 WebDav 測(cè)試就四個(gè)配置指令,不多吧,但是我們?cè)趯?shí)際的配置中還會(huì)用到其它的一些配置。
上面的配置中,我們?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)求。
注意,它的請(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)限為 再往下,又是我們前面學(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 圖片。
試試訪問 /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圖片。
沒有配置值,也不需要配置值,只能配置在 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ù)組件。
這一個(gè)模塊,我們根據(jù)配置指令的說明,同步地一個(gè)一個(gè)地測(cè)試。除了 image_filter 只能配置在 location 下之外,其它的都可以配置在 http、server、location 中。在此之前,我們還需要準(zhǔn)備好一個(gè) img 目錄和圖片文件。 原始的圖片文件是這樣的。 image_filter設(shè)置圖像變換的操作。
好多配置選項(xiàng)呀,默認(rèn)是 off 也就是關(guān)閉的。它決定了后面我們其它的指令是否可用,也就是說,如果是 off 狀態(tài),那么其它相關(guān)的配置指令也都不會(huì)起作用。 在這些配置參數(shù)中,test 和 size 是單獨(dú)使用的,后面三個(gè)可以配合使用。這是啥意思?先看解釋,最后再說。
如果正常訪問上面的路徑,我們可以打開 index.html ,本身這就是一個(gè)正常的 html 頁(yè)面嘛。但是如果開啟上面的注釋,再次訪問 index.html ,就會(huì)發(fā)現(xiàn)返回 415 錯(cuò)誤了。
訪問 /img3/1.jpeg 和 /img3/2.jepg 會(huì)返回這樣的內(nèi)容。
我們直接測(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è)面啦。
對(duì)于后面三個(gè)參數(shù)來說,如果你在有這三個(gè)參數(shù)的 location 中同時(shí)加入了 test 或者 size ,它們的縮放、旋轉(zhuǎn)、裁剪效果馬上就無效了。大家可以自己試試哦,這就是前面說的不兼容的問題。另外 crop 和 resize 放一起會(huì)是什么效果呢?會(huì)以最后設(shè)置的為準(zhǔn)。 image_filter_buffer設(shè)置用來讀圖像的緩沖區(qū)的最大值。
默認(rèn)值是 1M ,訪問我們上面第二張圖片 2.jpeg ,它的大小超過 1M 了,正常情況下會(huì)返回 415 錯(cuò)誤,這時(shí)我們就可以設(shè)置 image_filter_buffer ,調(diào)大之后就可以訪問了,我們可以將它放在 http 或者 server 下面,這樣我們上面測(cè)試的那些路徑就都可以打開第二張圖片了。 image_filter_interlace啟用圖像隔行掃描的。
默認(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ì)量。
默認(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增加最終圖像的清晰度。
默認(rèn)值是 0 ,也就是不做操作。其實(shí)就是圖形工具中的銳化工具,同樣可以在上面 crop 中打開注釋進(jìn)行測(cè)試,和 image_filter_jpeg_quality 的要求一樣,不過可以不只是 JPG 圖片。 image_filter_transparency定義當(dāng)對(duì)PNG,或者GIF圖像進(jìn)行顏色變換時(shí)是否需要保留透明度。
默認(rèn)值是 on ,損失透明度有可能可以獲得更高的圖像質(zhì)量,PNG圖像中的alpha通道的透明度默認(rèn)會(huì)一直被保留。我沒有測(cè)試,大家可以自己試試哈。 image_filter_webp_quality設(shè)置轉(zhuǎn)換后的 WebP 圖像的所需質(zhì)量。
和 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)呀。
直接將 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ù)端偽流媒體支持。
通過返回以請(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文件,主要是以 偽流媒體是與Flash播放器一起配合使用的。 播放器向服務(wù)端發(fā)送HTTP請(qǐng)求,請(qǐng)求中的查詢串是以開始時(shí)間為參數(shù)的(以 http:///elephants_dream.mp4?start=238.88 這樣就允許隨意拖放,或者從節(jié)目的中途開始回放。 為了支持隨機(jī)訪問,H.264格式將元數(shù)據(jù)放到所謂的"moov atom"中。 "moov atom"是文件的一部分,放有整個(gè)文件的索引信息。 為了開啟回放,播放器首先需要讀取元數(shù)據(jù)。 這是通過發(fā)送一個(gè)特別的以 對(duì)于匹配有非零 如果匹配的請(qǐng)求沒有包含 這個(gè)模塊默認(rèn)是不安裝的,需要通過 --with-http_mp4_module 來配置開啟。 mp4配置開啟該模塊處理當(dāng)前路徑。
只能定義在 location 當(dāng)中。 mp4_buffer_size設(shè)置處理MP4文件的初始內(nèi)存大小。
默認(rèn)值是 512K 。 mp4_max_buffer_size在處理元數(shù)據(jù)時(shí),可能必需較大的緩存。 它的大小不能超過 size 指定的值, 否則 Nginx 將會(huì)返回服務(wù)器錯(cuò)誤。
默認(rèn)值是 10M ,返回的是 500 錯(cuò)誤,并記錄日志,日志格式是這樣的:
總結(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 |
|