通過Nginx服務(wù)器獲取大文件MD5值的配置方法
HTTP協(xié)議新增了Content-MD5 HTTP頭,但是nginx并不支持這個功能,而且官方也明確表示不會增加這項功能,為什么呢?因為每次請求都需要讀取整個文件來計算MD5值,以性能著稱的nginx絕對不愿意干出違背軟件宗旨的事情。但是有些應(yīng)用中,需要驗證文件的正確性,有些人通過下載當前文件,然后計算MD5值來比對當前文件是否正確。不僅僅浪費帶寬資源也浪費了大把的時間。有需求就有解決方案,網(wǎng)友開發(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; } }
所有請求download的請求,都會在響應(yīng)http頭部增加Content-MD5,值為這個文件的MD5,看如下測試:
# 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,這個就是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值,使用過程中,參數(shù)可以隨心定義。下面來測試一下。
# curl test.ttlsa.com/download/1.exe?md5=true 6adda4a06dbad3ac9b53a08f4ff9c4f8
直接得到md5值,與第一種方法得到同樣的MD5。
4. 最后
使用nginx模塊也是一種方法,這種方法有個不足支持,每個請求都需要從新計算一次MD5值。想減小他的壓力,可以在nginx加緩存,或者借用memcache以及使用perl或者lua等模塊,希望大家繼續(xù)支持運維生存時間。
項目地址:https://github.com/cfsego/file-md5
項目文檔:https://github.com/cfsego/file-md5/blob/master/README
PS:nginx大文件下載優(yōu)化
默認情況下proxy_max_temp_file_size值為1024MB,也就是說后端服務(wù)器的文件不大于1G都可以緩存到nginx代理硬盤中,如果超過1G,那么文件不緩存,而是直接中轉(zhuǎn)發(fā)送給客戶端.如果proxy_max_temp_file_size設(shè)置為0,表示不使用臨時緩存。
在大文件的環(huán)境下,如果想啟用臨時緩存,那么可以修改配置,值改成你想要的。
修改nginx配置
location / { ... proxy_max_temp_file_size 2048m; ... }
重啟nginx
# /usr/local/nginx-1.7.0/sbin/nginx -s reload
相關(guān)文章
nginx?攔截指定ip訪問指定url的實現(xiàn)示例
本文主要介紹了nginx?攔截指定ip訪問指定url的實現(xiàn)示例,使用$http_x_forwarded_for變量來獲取客戶端的真實IP地址,感興趣的可以了解一下2024-12-12OpenResty中實現(xiàn)按QPS、時間范圍、來源IP進行限流的方法
OpenResty是一個基于Nginx與Lua的高性能Web平臺,它通過LuaJIT在Nginx中運行高效的Lua腳本和模塊,可以用來處理復(fù)雜的網(wǎng)絡(luò)請求,并且支持各種流量控制和限制的功能,這篇文章主要介紹了OpenResty中實現(xiàn)按QPS、時間范圍、來源IP進行限流,需要的朋友可以參考下2024-02-02Nginx服務(wù)器高性能優(yōu)化的配置方法小結(jié)
這篇文章主要介紹了Nginx服務(wù)器高性能優(yōu)化的配置方法小結(jié),包括一些內(nèi)核參數(shù)的優(yōu)化介紹,需要的朋友可以參考下2015-12-12詳解Nginx實戰(zhàn)之讓用戶通過用戶名密碼認證訪問web站點
這篇文章主要介紹了詳解Nginx實戰(zhàn)之讓用戶通過用戶名密碼認證訪問web站點,有興趣的可以了解一下。2016-11-11