tenginx+ImageMagick+Lua+FastDfs分布式自动缩略图

简介:

1.安装ImageMagick图片处理软件

[root@node2 ~]# tar xvf ImageMagick-6.4.0-0.tar.gz 

[root@node2 ~]# cd ImageMagick-6.4.0

[root@node2 ImageMagick-6.4.0]# ./configure --prefix=/usr/local/ImageMagick-6.4.0

[root@node2 ImageMagick-6.4.0]# make && make install

[root@node2 ImageMagick-6.4.0]#


2.安装lua脚本语言

[root@node2 ~]# yum install lua* -y


3.安装tenginx服务(必须先下载ngx_cache_purge和fastdfs-nginx-module模块)

[root@node2 ~]# tar xvf tengine-2.1.0.tar.gz

[root@node2 ~]# cd tengine-2.1.0

[root@node2 tengine-2.1.0]#  --prefix=/usr/local/tenginx-2.1.0 --with-file-aio --with-poll_module --with-pcre=/usr/local/pcre-8.37 --without-http_autoindex_module --without-http_ssi_module --without-maingx_cache_purgel_pop3_module --without-mail_smtp_module --without-mail_imap_module --with-http_lua_module --with-ld-opt=-Wl,-rpath,/usr/local/lib --with-http_realip_module --with-http_concat_module --add-module=/root/ngx_cache_purge-1.6 --add-module=/root/fastdfs-nginx-module/src

[root@node2 tengine-2.1.0]# make -j4 && make install

[root@node2 tengine-2.1.0]# vim /usr/local/tenginx-2.1.0/conf/nginx.conf

server {

  listen 800;

  server_name localhost;

  location / {

     root html  ;

     index  index.html index.htm;

  }

[root@node2 tengine-2.1.0]# /usr/local/tenginx-2.1.0/sbin/nginx 

wKioL1fSckjTjwHRAADBS1-rh4E704.png-wh_50


4.安装fastDFS分布式文件系统

fastDFS必须有三个节点,一个tracker节点,两个storage节点.tracker节点是管理,监控,维护两个数据节点,文件上传.storage数据节点是做文件存储,校验,容灾.tenginx必须装在storage节点上.

node1节点:(tracker节点)

[root@node1 ~]# tar xvf fastdfs-5.04.tar.gz 

[root@node1 ~]# cd fastdfs-5.04

[root@node1 fastdfs-5.04]# ./make.sh 

[root@node1 fastdfs-5.04]# ./make.sh install

[root@node1 ~]# vim /etc/fdfs/tracker.conf 

[root@node1 ~]# egrep -v '^#|^$' /etc/fdfs/tracker.conf 

disabled=false      --不禁用服务

bind_addr=192.168.2.112   --本机的IP地址

port=22122            --服务端口

connect_timeout=30      --客户端会话连接超时

network_timeout=60      --网络连接超时

base_path=/home/fastdfs   --存储目录

max_connections=256      --最大连接数

accept_threads=2        --访问线程

work_threads=4         --工作线程

store_group=group1      --组名

download_server=0       --下载方式(0  是轮循,1  是指定节点)

reserved_storage_space = 10%   --预留存储空间

log_level=info         --日志级别

run_by_group=         --以哪个用户组运行

run_by_user=

allow_hosts=*         --允许哪个IP访问

http.server_port=800    --web访问的端口

http.check_alive_interval=30

http.check_alive_type=tcp

http.check_alive_uri=/status.html

[root@node1 ~]# egrep -v '^#|^$' /etc/fdfs/client.conf 

connect_timeout=30

network_timeout=60

base_path=/home/fastdfs          --存储目录

tracker_server=192.168.2.112:22122   --tracker节点的IP和端口

log_level=info

use_connection_pool = false

connection_pool_max_idle_time = 3600

load_fdfs_parameters_from_tracker=false

use_storage_id = false

storage_ids_filename = storage_ids.conf

http.tracker_server_port=800

[root@node1 ~]# 


node2和node3节点:(storage节点)

[root@node2 ~]# tar xvf fastdfs-5.04.tar.gz 

[root@node2 ~]# cd fastdfs-5.04

[root@node2 fastdfs-5.04]# ./make.sh 

[root@node2 fastdfs-5.04]# ./make.sh install

[root@node2 fastdfs-5.04]# egrep -v '^#|^$' /etc/fdfs/storage.conf 

disabled=false

group_name=group1

bind_addr=192.168.2.114    --本机IP地址

client_bind=true

port=23000             --storage节点的端口

connect_timeout=30

network_timeout=60

heart_beat_interval=30

stat_report_interval=60

base_path=/home/fastdfs    --存储目录

max_connections=256

buff_size = 256KB

accept_threads=1

work_threads=4

disk_rw_separated = true

disk_reader_threads = 1

disk_writer_threads = 1

sync_wait_msec=50

sync_interval=0

sync_start_time=00:00

sync_end_time=23:59

write_mark_file_freq=500

store_path_count=1

store_path0=/home/fastdfs

subdir_count_per_path=256

tracker_server=192.168.2.112:22122    --tracker节点的IP和端口

log_level=info

run_by_group=

run_by_user=

allow_hosts=*

file_distribute_path_mode=0

file_distribute_rotate_count=100

fsync_after_written_bytes=0

sync_log_buff_interval=10

sync_binlog_buff_interval=10

sync_stat_file_interval=300

thread_stack_size=512KB

upload_priority=10

if_alias_prefix=

check_file_duplicate=0

file_signature_method=hash

key_namespace=FastDFS

keep_alive=0

use_access_log = false

rotate_access_log = false

access_log_rotate_time=00:00

rotate_error_log = false

error_log_rotate_time=00:00

rotate_access_log_size = 0

rotate_error_log_size = 0

file_sync_skip_invalid_record=false

use_connection_pool = false

connection_pool_max_idle_time = 3600

http.domain_name=

http.server_port=800

[root@node2 fastdfs-5.04]# cd 

[root@node2 ~]# tar xvf fastdfs-nginx-module_v1.16.tar.gz  --加载fastdfs-nginx-module模块配置文件

[root@node2 ~]# cp -a fastdfs-nginx-module/src/mod_fastdfs.conf  /etc/fdfs/

[root@node2 ~]# egrep -v '^$|^#' /etc/fdfs/mod_fastdfs.conf 

connect_timeout=2

network_timeout=30

base_path=/home/fastdfs

load_fdfs_parameters_from_tracker=true

storage_sync_file_max_delay = 86400

use_storage_id = false

storage_ids_filename = storage_ids.conf

tracker_server=192.168.2.112:22122      --tracker节点的IP和端口

storage_server_port=23000

group_name=group1

url_have_group_name = true

store_path_count=1

store_path0=/home/fastdfs

log_level=info

log_filename=

response_mode=proxy

if_alias_prefix=

flv_support = true

flv_extension = flv

group_count = 0

[group1]

group_name=group1

storage_server_port=23000

store_path_count=1

store_path0=/home/fastdfs

[root@node2 ~]# cp fastdfs-5.04/init.d/fdfs_storaged  /etc/init.d/

[root@node2 ~]# chkconfig --add fdfs_storaged

[root@node2 ~]# chkconfig fdfs_storaged on

node3同node2配置是一样的,只是绑定的IP不一样而已


5.在storage节点1上修改tenginx的配置文件

[root@node2 ~]# vim /usr/local/tenginx-2.1.0/conf/nginx.conf

server {

  listen 800;

  server_name localhost;

  location /lua {

     default_type 'text/plain';

     content_by_lua 'ngx.say("hello,lua")';

     }

  location ~* /group1/M00/  {

      ngx_fastdfs_module;

      set $needCreateImg 0;

      if ( !-f $request_filename) {

         set $needCreateImg "${needCreateImg}1";

      }


     if ($uri ~* "/group1/M00/(\d+)/(\d+)/([A-Za-z0-9_-]+).(gif|jpg|jpeg|png).(\d+x\d+).(gif|jpg|jpeg|png)") {

         set $needCreateImg "${needCreateImg}2";

         set $conUri     "/$1/$2/$3.$4.$5.$6";

      }


      if ($needCreateImg = "012") {

         set $image_root "/home/fastdfs/data";

         set $file "$image_root$conUri";

            rewrite_by_lua '

               local index = string.find(ngx.var.conUri, "([0-9]+)x([0-9]+)");

               local originalUri = string.sub(ngx.var.conUri, 0, index-2);

               local area = string.sub(ngx.var.conUri, index);

               index = string.find(area, "([.])");

               area = string.sub(area, 0, index-1);


               function table.contains(table, element)

                 for _, value in pairs(table) do                 

                   if value == element then

                     return true

                   end

                  end

                  return false

                end


                local c = "/usr/local/GraphicsMagick-1.3.23/bin/gm convert " .. ngx.var.image_root ..  originalUri  .. " -thumbnail " .. area .. " - ";

                local f = assert(io.popen(c, "r"))

                local s = assert(f:read("*a"))

                f:close()

                ngx.say(s) ';

              }

           alias /home/fastdfs/data/;

        }

[root@node2 ~]# /usr/local/tenginx-2.1.0/sbin/nginx -s reload

ngx_http_fastdfs_set pid=5233

[root@node2 ~]# 


6.在tracker节点上传图片

[root@node2 ~]# fdfs_test /etc/fdfs/client.conf upload 26.jpg 

This is FastDFS client test program v5.02


Copyright (C) 2008, Happy Fish / YuQing


FastDFS may be copied only under the terms of the GNU General

Public License V3, which may be found in the FastDFS source kit.

Please visit the FastDFS Home Page http://www.csource.org/ 

for more detail.


[2016-09-09 17:07:03] DEBUG - base_path=/home/fastdfs, connect_timeout=30, network_timeout=60, tracker_server_count=1, anti_steal_token=0, anti_steal_secret_key length=0, use_connection_pool=0, g_connection_pool_max_idle_time=3600s, use_storage_id=0, storage server id count: 0


tracker_query_storage_store_list_without_group: 

server 2. group_name=, ip_addr=192.168.2.114, port=23000

server 3. group_name=, ip_addr=192.168.2.146, port=23000


group_name=group1, ip_addr=192.168.2.114, port=23000

storage_upload_by_filename

group_name=group1, remote_filename=M00/00/00/wKgCclfSe76AYHqXAAB9uxsIydU803.jpg

source ip address: 192.168.2.114

file timestamp=2016-09-09 17:07:10

file size=32187

file crc32=453560789

example file url: http://192.168.2.114:800/group1/M00/00/00/wKgCclfSe76AYHqXAAB9uxsIydU803.jpg

storage_upload_slave_by_filename

group_name=group1, remote_filename=M00/00/00/wKgCclfSe76AYHqXAAB9uxsIydU803_big.jpg

source ip address: 192.168.2.114

file timestamp=2016-09-09 17:07:10

file size=32187

file crc32=453560789

example file url: http://192.168.2.114:800/group1/M00/00/00/wKgCclfSe76AYHqXAAB9uxsIydU803_big.jpg

[root@node2 ~]# 


7.访问图片并切图

http://192.168.2.114:800/group1/M00/00/00/wKgCclfSe76AYHqXAAB9uxsIydU803.jpg

http://192.168.2.114:800/group1/M00/00/00/wKgCclfSe76AYHqXAAB9uxsIydU803.jpg_200x200.jpg

http://192.168.2.114:800/group1/M00/00/00/wKgCclfSe76AYHqXAAB9uxsIydU803.jpg_400x400.jpg

wKiom1fSfq_jKY-gAAXS7zrAmFk366.png-wh_50

wKioL1fSfrDxgIbrAAFWdvo1qmQ527.png-wh_50

wKiom1fSfrKgToeXAAKiIbMn_tI945.png-wh_50










本文转自 z597011036 51CTO博客,原文链接:http://blog.51cto.com/tongcheng/1851176,如需转载请自行联系原作者
目录
相关文章
|
存储 负载均衡 应用服务中间件
分布式文件系统FastDFS
 FastDFS是一个开源的轻量级分布式文件系统,由阿里巴巴余庆大神开发,底层采用C语言,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
579 0
|
缓存 NoSQL 算法
高并发秒杀系统实战(Redis+Lua分布式锁防超卖与库存扣减优化)
秒杀系统面临瞬时高并发、资源竞争和数据一致性挑战。传统方案如数据库锁或应用层锁存在性能瓶颈或分布式问题,而基于Redis的分布式锁与Lua脚本原子操作成为高效解决方案。通过Redis的`SETNX`实现分布式锁,结合Lua脚本完成库存扣减,确保操作原子性并大幅提升性能(QPS从120提升至8,200)。此外,分段库存策略、多级限流及服务降级机制进一步优化系统稳定性。最佳实践包括分层防控、黄金扣减法则与容灾设计,强调根据业务特性灵活组合技术手段以应对高并发场景。
4116 7
|
消息中间件 NoSQL Java
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
Redis系列学习文章分享---第六篇(Redis实战篇--Redis分布式锁+实现思路+误删问题+原子性+lua脚本+Redisson功能介绍+可重入锁+WatchDog机制+multiLock)
996 0
|
缓存 NoSQL 搜索推荐
【📕分布式锁通关指南 03】通过Lua脚本保证redis操作的原子性
本文介绍了如何通过Lua脚本在Redis中实现分布式锁的原子性操作,避免并发问题。首先讲解了Lua脚本的基本概念及其在Redis中的使用方法,包括通过`eval`指令执行Lua脚本和通过`script load`指令缓存脚本。接着详细展示了如何用Lua脚本实现加锁、解锁及可重入锁的功能,确保同一线程可以多次获取锁而不发生死锁。最后,通过代码示例演示了如何在实际业务中调用这些Lua脚本,确保锁操作的原子性和安全性。
1101 6
【📕分布式锁通关指南 03】通过Lua脚本保证redis操作的原子性
|
缓存 NoSQL Java
【Redis】5、Redis 的分布式锁、Lua 脚本保证 Redis 命令的原子性
【Redis】5、Redis 的分布式锁、Lua 脚本保证 Redis 命令的原子性
1304 0
|
缓存 NoSQL Java
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
457 3
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
|
NoSQL Java API
lua+redis:分布式锁解决方案
分布式锁的是确保在多个进程或多个节点之间对共享资源的访问是有序、互斥和原子的,以避免竞态条件和数据不一致性问题。在多进程或多节点环境中,分布式锁广泛应用于协调共享资源的安全访问。
558 1
|
存储 索引
32分布式电商项目 - FastDFS文件上传与下载流程
32分布式电商项目 - FastDFS文件上传与下载流程
335 0
32分布式电商项目 - FastDFS文件上传与下载流程
|
存储 缓存 NoSQL
redis集群+JedisCluster+lua脚本实现分布式锁
redis集群+JedisCluster+lua脚本实现分布式锁
704 0
|
NoSQL Redis
redisTemplate+redis+lua解决redis分布式锁集群报错问题
redisTemplate+redis+lua解决redis分布式锁集群报错问题
470 0

热门文章

最新文章