千万级图片资源存储、裁剪方案
目标
搭建千万级图片资源存储服务,方便快捷切割所需高宽以及精度图片。
方案
利用fastdfs做文件分布式存储;
lighttpd结合imagemagic扩展开发,支持通过HTTP请求传入高宽以及精度截取需要的图片;
外加varnish文件缓存。
即,
如原图为:http://xxx/group1/M00/00/00/1.jpg
通过链接 http://xxx/group1/M00/00/00/1_500_400_30.jpg
即可获取高为400,宽为400,精度为30%的图片;
用户请求时,临时生成,且立即存入缓存和物理存储,以后直接从缓存中获取。
1、两台服务器做存储分发(tracker 192.168.20.28,192.168.20.27)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
//安装 libevent./configure --prefix=/usrmakemake install//安装 fastdfs//修改 make.sh 支持内置httpd#WITH_HTTPD=1 => WITH_HTTPD=1//安装目录TARGET_PREFIX=/opt/server/fastdfsTARGET_CONF_PATH=$TARGET_PREFIX/etc./make.sh./make.sh install//配置 fastdfs tracker//使用内置serverhttp.disabled=false//端口http.server_port=8080//启动/opt/server/fastdfs/bin/fdfs_trackerd /opt/server/fastdfs/etc/tracker.conf |
2、两台服务器做物理存储(storage 192.168.20.24,192.168.20.25)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
//安装 libevent./configure --prefix=/usrmakemake install//安装 fastdfs//修改 make.sh 支持内置httpd#WITH_HTTPD=1 => WITH_HTTPD=1//安装目录TARGET_PREFIX=/opt/server/fastdfsTARGET_CONF_PATH=$TARGET_PREFIX/etc./make.sh./make.sh install//配置 fastdfs storage//使用内置serverhttp.disabled=false//端口http.server_port=8099//设置 trackertracker_server=192.168.20.28:22122tracker_server=192.168.20.27:22122//启动/opt/server/fastdfs/bin/fdfs_storaged /opt/server/fastdfs/etc/storage.conf |
3、存储测试
|
1
2
3
4
5
|
//上传/opt/server/fastdfs/bin/fdfs_test /opt/server/fastdfs/etc/client.conf upload 3.jpg//获取wget http://192.168.20.28:8080/group1/M00/00/00/wKgUGE_yR6bou3MSAACABLw5CM4429_big.jpg |
4、PHP扩展 (需先安装fastdfs服务)(安装在web服务器192.168.20.231,192.168.20.232)
编译源码 /php_client 下
安装
|
1
2
3
4
|
/opt/server/php/bin/phpize./configure --with-php-config=/opt/server/php/bin/php-configmakemake install |
配置
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
[fastdfs]extension = fastdfs_client.so; the base pathfastdfs_client.base_path = /tmp; connect timeout in seconds; default value is 30sfastdfs_client.connect_timeout = 30; network timeout in seconds; default value is 30sfastdfs_client.network_timeout = 60; standard log level as syslog, case insensitive, value list:;;; emerg for emergency;;; alert;;; crit for critical;;; error;;; warn for warning;;; notice;;; info;;; debugfastdfs_client.log_level = info; set the log filename, such as /usr/local/fastdfs/logs/fastdfs_client.log; empty for output to stderrfastdfs_client.log_filename = /opt/server/fastdfs/logs/fastdfs_client.log; secret key to generate anti-steal token; this parameter must be set when http.anti_steal.check_token set to true; the length of the secret key should not exceed 128 bytesfastdfs_client.http.anti_steal_secret_key =; FastDFS cluster count, default value is 1fastdfs_client.tracker_group_count = 1; config file of FastDFS cluster ;, based 0; must include absolute path, such as fastdfs_client.tracker_group0; the config file is same as conf/client.conffastdfs_client.tracker_group0 = /opt/server/fastdfs/etc/client.conf |
其中/opt/server/fastdfs/etc/client.conf配置
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
# connect timeout in seconds# default value is 30sconnect_timeout=30# network timeout in seconds# default value is 30snetwork_timeout=60# the base path to store log filesbase_path=/opt/server/fastdfs# tracker_server can ocur more than once, and tracker_server format is# "host:port", host can be hostname or ip addresstracker_server=192.168.20.28:22122tracker_server=192.168.20.27:22122log_level=info#HTTP settingshttp.tracker_server_port=8080#use "#include" directive to include HTTP other settiongs#include http.conf |
上传&获取测试
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
<html><body><form action="upload.php?action=upload" method="post" enctype="multipart/form-data"><label for="file">Filename:</label><input type="file" name="file" id="file" /><input type="submit" name="submit" value="Submit" /></form></body></html><?php if('upload' == $_GET['action']) { //调用上传 move_uploaded_file($_FILES["file"]["tmp_name"], $_FILES["file"]["name"]); $re = upload($_FILES["file"]["name"]); var_dump($re); } //文件上传 function upload($fileName, $fileExtName = null, $metaList = array(), $groupName = null) { $tracker = fastdfs_tracker_get_connection(); $storage = fastdfs_tracker_query_storage_store(); return fastdfs_storage_upload_by_filename($fileName, $fileExtName, $metaList, $groupName, $tracker, $storage); }?> |
5、图片处理imagemagic(192.168.20.28,192.168.20.27)
安装
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
//libpng-1.2.10.tar.bz2./configure --prefix=/usrmakemake installldconfig//jpegsrc.v7.tar.gz./configure --prefix=/usrmakemake installldconfig//freetype-2.4.6.tar.bz2./configure --prefix=/usrmakemake installldconfig//imagemagic./configure --prefix=/opt/server/imagemagickmakemake instll测试convert logo: logo.gif |
6、图片处理调度WEB服务(192.168.20.28,192.168.20.27)
定制化开发的lighttpd,调用特定URL,控制图片处理生成需求图片。 下载地址
安装
|
1
2
3
|
./configure --prefix=/opt/server/lighttpdmakemake install |
配置
vi /opt/server/lighttpd/conf/lighttpd.conf
|
1
2
3
4
5
6
7
|
# FastDFS Configurationfastdfs.conf = "/opt/server/fastdfs/etc/client.conf"fastdfs.convert-enable = "enable"fastdfs.convert-filesize = ( "*", "_100_100" )fastdfs.convert-filetypes = ( ".gif", ".jpg", ".jpeg", ".png" )server.port = 81 |
启动
|
1
|
/opt/server/lighttpd/sbin/lighttpd -f /opt/server/lighttpd/conf/lighttpd.conf |
裁剪图片测试
浏览器访问:
|
1
|
http://192.168.20.28/group1/M00/00/00/wKgUGE_yrsPEiKq-AARlTan74rg752_500_500_30.jpg |
其中500_500 长宽,30为精度
7、图片获取varnish缓存 (192.168.20.28,192.168.20.27)
安装
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
//pcre-8.30./configure --prefix=/usrmakemake installldconfig//varnish-3.0.2export PKG_CONFIG_PATH=/usr/lib/pkgconfig./configure --prefix=/opt/server/varnishmakemake install |
配置
指向后端图片处理lighttpd.
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
backend rs{.host = "192.168.20.28";.port = "81";}acl purge{"localhost";"127.0.0.1";"192.168.20.0"/24;}sub vcl_recv{if (req.http.host ~"^rs.mo.dev$"){set req.backend = rs;}if (req.request == "PURGE"){if (!client.ip~purge){error 405 "Not allowed.";return (lookup);}}}sub vcl_hit{if (req.request == "PURGE"){set obj.ttl = 0s;error 200 "Purged.";}}sub vcl_miss{if (req.request == "PURGE"){error 404 "Not in cache.";}}sub vcl_fetch{set req.grace = 30s;if (req.request == "GET" && req.url ~ "\.(css|js)$"){set beresp.ttl = 3600s;}else{set beresp.ttl = 30d;}return (deliver);}sub vcl_deliver{return (deliver);} |
启动
|
1
|
/opt/server/varnish/sbin/varnishd -f /opt/server/varnish/etc/varnish/my.vcl -n /opt/server/varnish/var/cache -a 0.0.0.0:80 -T 0.0.0.0:3500 -u www -s malloc,10G -w 2,500,300 |
8、最前端配置资源获取服务器nginx (安装在web服务器192.168.20.231,192.168.20.232)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
upstream rs{server 192.168.20.28:80;server 192.168.20.27:80;}server {listen 80;server_name rs.mo.dev;location / {proxy_pass http://rs/;proxy_hide_header Content-Type;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}log_format rs.mo.dev '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" $http_x_forwarded_for';access_log /opt/server/nginx/logs/rs.log rs.mo.dev;} |
通过浏览器访问
|
1
|
http://rs.mo.dev/group1/M00/00/00/wKgUGE_yrsPEiKq-AARlTan74rg752_500_500_30.jpg |
9、总结
通过6台服务器,配置的图片服务,具有以下特点:
1、具备基本的图片以及其他资源文件上传下载
2、避免单点故障,不会因为某台tracker或者storage挂掉,而服务终止
3、根据传入参数,实时切割所需图片,参数支持长、宽、以及精度
4、切割好的图片立即被缓存,提高图片访问速度


浙公网安备 33010602011771号