通过fastdfs上传图片,若当上传图片中有主图和缩略图,fastdfs主图和缩略图的文件id有共性
如:
主图:/group1/M00/00/00/wKgUDlpVwc2AcFSBAAl5WLU-YRY024.jpg
缩略图:/group1/M00/00/00/wKgUDlpVwc2AcFSBAAl5WLU-YRY024_150X150.jpg
如果用purge来清理,则需要多次清理:
请求1:http://192.168.20.11/purge/group1/M00/00/00/wKgUDlpVwc2AcFSBAAl5WLU-YRY024.jpg
请求2:
http://192.168.20.11/purge/group1/M00/00/00/wKgUDlpVwc2AcFSBAAl5WLU-YRY024_150X150.jpg
为了实现一次请求处理,可以借助nodejs来实现,具体如下:
1.nginx配置
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 300m;
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 16k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
proxy_cache_path /fastdfs/cache/nginx/proxy_cache levels=1:2
keys_zone=http-cache:500m max_size=10g inactive=30d;
proxy_temp_path /fastdfs/cache/nginx/proxy_cache/tmp;
upstream fdfs_group1 {
server 192.168.20.13:8888 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.20.14:8888 weight=1 max_fails=2 fail_timeout=30s;
}
upstream fdfs_group2 {
server 192.168.20.15:8888 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.20.16:8888 weight=1 max_fails=2 fail_timeout=30s;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location /group1/M00 {
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_cache http-cache;
proxy_cache_valid 200 304 12h;
proxy_cache_key $uri$is_args$args;
proxy_pass http://fdfs_group1;
expires 30d;
}
location /group2/M00 {
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_cache http-cache;
proxy_cache_valid 200 304 12h;
proxy_cache_key $uri$is_args$args;
proxy_pass http://fdfs_group2;
expires 30d;
}
location ~/purge(/.*) {
allow 127.0.0.1;
allow 192.168.224.0/24;
# deny all;
proxy_cache_purge http-cache $1$is_args$args;
}
location /clear {
proxy_pass http://127.0.0.1:8182;
proxy_redirect default;
}
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
2.新建clear.js文件,编辑内容如下:
var http = require('http');
var crypto = require('crypto');
var exec = require('child_process').exec;
http.createServer(function (request, response) {
// 发送 HTTP 头部
// HTTP 状态值: 200 : OK
// 内容类型: text/plain
response.writeHead(200, {'Content-Type': 'text/plain'});
// 发送响应数据 "Hello World"
// response.end('Hello World\n');
// md5.update("/group2/M00/00/00/wKgUEFpUOumAX-s_AAQGorOvlvU806.jpg");
// var str = md5.digest('hex');
var url = request.url;// /clear?fileId=/group2/M00/00/00/wKgUEFpUOumAX-s_AAQGorOvlvU806.jpg&thumb=150X150,200X200
var cacheDir = "/fastdfs/cache/nginx/proxy_cache";
var fileIds = [];
var thumbs = [];
var result = 'need params ';
if (url.indexOf("?") != -1) {
var params = url.split("?");
if (params[1].indexOf("&") != -1) {
var segements = params[1].split("&");
for (var i = 0; i < segements.length; i++) {
var segTemp = segements[i];
if (segTemp.indexOf("=") != -1) {
var temp = segTemp.split("=");
if (temp[0] == 'fileId') {
fileIds.push(temp[1]);
}
if (temp[0] == 'thumb') {
if (temp[1].indexOf(",") != -1) {
var thTemps = temp[1].split(",");
for (var j = 0; j < thTemps.length; j++) {
thumbs.push(thTemps[j]);
}
} else {
thumbs.push(temp[1]);
}
}
}
}
} else {
if (params[1].indexOf("=") != -1) {
var temp = params[1].split("=");
fileIds.push(temp[1]);
}
}
if (fileIds != null && fileIds.length > 0) {
var k = fileIds[0].split(".");
var prefix = k[0];
var suffix = "." + k[1];
for (var m = 0; m < thumbs.length; m++) {
fileIds.push(prefix + "_" + thumbs[m] + suffix);
}
var result = "Success!\n";
for (var n = 0; n < fileIds.length; n++) {
var fileId = fileIds[n];
var md5 = crypto.createHash("md5");
md5.update(fileId);
var fileIdMd5 = md5.digest('hex');
// 取MD5的后三位
var dir1 = fileIdMd5.substring(31);
var dir2 = fileIdMd5.substring(29, 31);
var path = cacheDir + "/" + dir1 + "/" + dir2 + "/" + fileIdMd5;
var cmdStr = "sudo rm -rf " + path;
exec(cmdStr, function (err, stdout, stderr) {
if (err) {
console.log('clear cache failure:' + stderr);
} else {
//result += "fileId:" + fileId + " key:" + path + "\n";
}
});
result += "fileId:" + fileId + " key:" + path + "\n";
}
}
}
response.end(result + '\n');
}).listen(8182);
// 终端打印如下信息
console.log('Server running at http://127.0.0.1:8182/');
3.启动服务
nohup node clear.js > myLog.log 2>&1 &
4.通过地址清除缓存
http://192.168.20.11/clear?fileId=/group1/M00/00/00/wKgUDlpVwc2AcFSBAAl5WLU-YRY024.jpg&thumb=150x150,200X200
输出结果如下:
Success! fileId:/group1/M00/00/00/wKgUDlpVwc2AcFSBAAl5WLU-YRY024.jpg key:/fastdfs/cache/nginx/proxy_cache/f/cb/db80ac669203ce1d21accaadba71acbf fileId:/group1/M00/00/00/wKgUDlpVwc2AcFSBAAl5WLU-YRY024_150x150.jpg key:/fastdfs/cache/nginx/proxy_cache/0/7e/b5ab1f0790b95e507bf823e3177b87e0