通過(guò)Nginx服務(wù)器獲取大文件MD5值的配置方法
HTTP協(xié)議新增了Content-MD5 HTTP頭,但是nginx并不支持這個(gè)功能,而且官方也明確表示不會(huì)增加這項(xiàng)功能,為什么呢?因?yàn)槊看握?qǐng)求都需要讀取整個(gè)文件來(lái)計(jì)算MD5值,以性能著稱(chēng)的nginx絕對(duì)不愿意干出違背軟件宗旨的事情。但是有些應(yīng)用中,需要驗(yàn)證文件的正確性,有些人通過(guò)下載當(dāng)前文件,然后計(jì)算MD5值來(lái)比對(duì)當(dāng)前文件是否正確。不僅僅浪費(fèi)帶寬資源也浪費(fèi)了大把的時(shí)間。有需求就有解決方案,網(wǎng)友開(kāi)發(fā)了file-md5模塊。
1. 下載模塊file-md5
# cd /usr/local/src # wget https://github.com/cfsego/file-md5/archive/master.zip -O file-md5-master.zip # unzip file-md5-master.zip
2. 安裝模塊file-md5
# wget http://nginx.org/download/nginx-1.4.2.tar.gz # tar -xzf nginx-1.4.2.tar.gz # cd nginx-1.4.2 # ./configure --prefix=/usr/local/nginx-1.4.2 --add-module=../file-md5-master # make # make isntall
如果你已經(jīng)安裝了nginx,僅需要增加file-md5模塊即可。
3. 配置file-md5
3.1 MD5追加到http響應(yīng)頭中
server { listen 80; server_name test.ttlsa.com; root /data/site/test.ttlsa.com; # for add content-md5 to http header location ~ /download { add_header Content-MD5 $file_md5; } }
所有請(qǐng)求download的請(qǐng)求,都會(huì)在響應(yīng)http頭部增加Content-MD5,值為這個(gè)文件的MD5,看如下測(cè)試:
# curl -I test.ttlsa.com/download/1.exe HTTP/1.1 200 OK Server: nginx Date: Wed, 26 Feb 2014 03:00:05 GMT Content-Type: application/octet-stream Content-Length: 1535488 Last-Modified: Mon, 24 Feb 2014 10:08:10 GMT Connection: keep-alive ETag: "530b1a0a-176e00" Content-MD5: 6adda4a06dbad3ac9b53a08f4ff9c4f8 Accept-Ranges: bytes
大家可以看到Content-MD5: 6adda4a06dbad3ac9b53a08f4ff9c4f8,這個(gè)就是1.exe文件的MD5值.
3.2 直接響應(yīng)MD5值到內(nèi)容中
server { listen 80; server_name test.ttlsa.com; root /data/site/test.ttlsa.com; # for add content-md5 to http header location ~ /download { if ( $arg_md5 ~* "true" ){ echo $file_md5; } } }
這邊直接使用echo輸出MD5值(echo模塊需要額外安裝),只需在下載的文件后面加上參數(shù)&md5=true即可得到MD5值,使用過(guò)程中,參數(shù)可以隨心定義。下面來(lái)測(cè)試一下。
# curl test.ttlsa.com/download/1.exe?md5=true 6adda4a06dbad3ac9b53a08f4ff9c4f8
直接得到md5值,與第一種方法得到同樣的MD5。
4. 最后
使用nginx模塊也是一種方法,這種方法有個(gè)不足支持,每個(gè)請(qǐng)求都需要從新計(jì)算一次MD5值。想減小他的壓力,可以在nginx加緩存,或者借用memcache以及使用perl或者lua等模塊,希望大家繼續(xù)支持運(yùn)維生存時(shí)間。
項(xiàng)目地址:https://github.com/cfsego/file-md5
項(xiàng)目文檔:https://github.com/cfsego/file-md5/blob/master/README
PS:nginx大文件下載優(yōu)化
默認(rèn)情況下proxy_max_temp_file_size值為1024MB,也就是說(shuō)后端服務(wù)器的文件不大于1G都可以緩存到nginx代理硬盤(pán)中,如果超過(guò)1G,那么文件不緩存,而是直接中轉(zhuǎn)發(fā)送給客戶(hù)端.如果proxy_max_temp_file_size設(shè)置為0,表示不使用臨時(shí)緩存。
在大文件的環(huán)境下,如果想啟用臨時(shí)緩存,那么可以修改配置,值改成你想要的。
修改nginx配置
location / { ... proxy_max_temp_file_size 2048m; ... }
重啟nginx
# /usr/local/nginx-1.7.0/sbin/nginx -s reload
相關(guān)文章
HAProxy和Nginx搭建負(fù)載均衡器的實(shí)現(xiàn)
負(fù)載均衡器是一個(gè)常用于分布式計(jì)算和網(wǎng)絡(luò)應(yīng)用中的系統(tǒng)組件,主要用于將客戶(hù)端的請(qǐng)求分發(fā)到多個(gè)后端服務(wù)器上,以實(shí)現(xiàn)高可用性、高性能和可擴(kuò)展性,本文主要介紹了HAProxy和Nginx搭建負(fù)載均衡器的實(shí)現(xiàn),感興趣的可以了解一下,感興趣的可以了解一下2023-11-11nginx?攔截指定ip訪(fǎng)問(wèn)指定url的實(shí)現(xiàn)示例
本文主要介紹了nginx?攔截指定ip訪(fǎng)問(wèn)指定url的實(shí)現(xiàn)示例,使用$http_x_forwarded_for變量來(lái)獲取客戶(hù)端的真實(shí)IP地址,感興趣的可以了解一下2024-12-12OpenResty中實(shí)現(xiàn)按QPS、時(shí)間范圍、來(lái)源IP進(jìn)行限流的方法
OpenResty是一個(gè)基于Nginx與Lua的高性能Web平臺(tái),它通過(guò)LuaJIT在Nginx中運(yùn)行高效的Lua腳本和模塊,可以用來(lái)處理復(fù)雜的網(wǎng)絡(luò)請(qǐng)求,并且支持各種流量控制和限制的功能,這篇文章主要介紹了OpenResty中實(shí)現(xiàn)按QPS、時(shí)間范圍、來(lái)源IP進(jìn)行限流,需要的朋友可以參考下2024-02-02Nginx服務(wù)器高性能優(yōu)化的配置方法小結(jié)
這篇文章主要介紹了Nginx服務(wù)器高性能優(yōu)化的配置方法小結(jié),包括一些內(nèi)核參數(shù)的優(yōu)化介紹,需要的朋友可以參考下2015-12-12Nginx 如何部署指定文件夾下的項(xiàng)目(本地測(cè)試)
這篇文章主要介紹了Nginx 如何部署指定文件夾下的項(xiàng)目(本地測(cè)試),分為配置vue.config.js,指定生成環(huán)境的包,配置路由模式為hash(history模式刷新后,找不到頁(yè)面),本文講解的非常詳細(xì),需要的朋友可以參考下2024-01-01詳解Nginx實(shí)戰(zhàn)之讓用戶(hù)通過(guò)用戶(hù)名密碼認(rèn)證訪(fǎng)問(wèn)web站點(diǎn)
這篇文章主要介紹了詳解Nginx實(shí)戰(zhàn)之讓用戶(hù)通過(guò)用戶(hù)名密碼認(rèn)證訪(fǎng)問(wèn)web站點(diǎn),有興趣的可以了解一下。2016-11-11Nginx代理Partainer的實(shí)現(xiàn)
本文主要介紹了Nginx代理Partainer的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07