小知识:通过Nginx服务器获取大文件MD5值的配置方法

HTTP协议新增了Content-MD5 HTTP头,但是nginx并不支持这个功能,而且官方也明确表示不会增加这项功能,为什么呢?因为每次请求都需要读取整个文件来计算MD5值,以性能著称的nginx绝对不愿意干出违背软件宗旨的事情。但是有些应用中,需要验证文件的正确性,有些人通过下载当前文件,然后计算MD5值来比对当前文件是否正确。不仅仅浪费带宽资源也浪费了大把的时间。有需求就有解决方案,网友开发了filemd5模块。

1. 下载模块file-md5
?
1
2
3
# 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

?
1
2
3
4
5
6
# 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

如果你已经安装了nginx,仅需要增加file-md5模块即可。

3. 配置file-md5 3.1 MD5追加到http响应头中

?
1
2
3
4
5
6
7
8
9
10
11
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的请求,都会在响应http头部增加Content-MD5,值为这个文件的MD5,看如下测试:

?
1
2
3
4
5
6
7
8
9
10
11
# 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 直接响应MD5值到内容中
?
1
2
3
4
5
6
7
8
9
10
11
12
13
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模块需要额外安装),只需在下载的文件后面加上参数&md5=true即可得到MD5值,使用过程中,参数可以随心定义。下面来测试一下。

?
1
2
# curl test.ttlsa.com/download/1.exe?md5=true 
6adda4a06dbad3ac9b53a08f4ff9c4f8

直接得到md5值,与第一种方法得到同样的MD5。

4. 最后

使用nginx模块也是一种方法,这种方法有个不足支持,每个请求都需要从新计算一次MD5值。想减小他的压力,可以在nginx加缓存,或者借用memcache以及使用perl或者lua等模块,希望大家继续支持运维生存时间。

项目地址:https://github.com/cfsego/file-md5

项目文档:https://github.com/cfsego/file-md5/blob/master/README

PS:nginx大文件下载优化

默认情况下proxy_max_temp_file_size值为1024MB,也就是说后端服务器的文件不大于1G都可以缓存到nginx代理硬盘中,如果超过1G,那么文件不缓存,而是直接中转发送给客户端.如果proxy_max_temp_file_size设置为0,表示不使用临时缓存。

在大文件的环境下,如果想启用临时缓存,那么可以修改配置,值改成你想要的。

修改nginx配置
?
1
2
3
4
5
6
location /
{
proxy_max_temp_file_size 2048m;
}

重启nginx

?
1
# /usr/local/nginx-1.7.0/sbin/nginx -s reload
声明: 猿站网有关资源均来自网络搜集与网友提供,任何涉及商业盈利目的的均不得使用,否则产生的一切后果将由您自己承担! 本平台资源仅供个人学习交流、测试使用 所有内容请在下载后24小时内删除,制止非法恶意传播,不对任何下载或转载者造成的危害负任何法律责任!也请大家支持、购置正版! 。本站一律禁止以任何方式发布或转载任何违法的相关信息访客发现请向站长举报,会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。本网站的资源部分来源于网络,如有侵权烦请发送邮件至:2697268773@qq.com进行处理。
建站知识

小知识:Nginx配置srcache_nginx模块搭配Redis建立缓存系统

2023-5-2 0:54:55

建站知识

小知识:Nginx配置统计流量带宽请求及记录实时请求状态的方法

2023-5-2 1:13:35

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索