Tadashi Gallery介绍
- Tadashi Gallery是什么鬼?
Tadashi Gallery简称为TG,TG是一个类似于淘宝图片管理系统的简单版,便于将图片按文件夹进行分类管理,方便图片进行多次利用展示。 - TG应用背景
在通常情况下大多数网站都是采用要使用时就进行图片上传,这样是很方便,但是遇到图片重复利用次数过多的网站时,这无非增加了存储空间也增加了图片传输的带宽,而且在多点的站点是部署配置也是非常麻烦,非常不利用扩展。在此环境下TG就诞生了,也借鉴了淘宝图库的一些想法。 - TG的好处
TG在图片重复利用展示的特点就非常明显了,减少服务器的存储空间,减少带宽的压力等。也可以进行二次开发进行,很方便的进行扩展。也可以和fastDFS结合是组合成高性能的的分布式图片系统。 - TG的弊端
TG是采用Lua开发的,并结合OpenResty一起才可运行,相对于用PHP来说没有那么普及并且部署不方便,考虑到TG一旦部署完毕后都不在进行更改的关系,以上因素都可以简单的忽略。
TG可以结合我之前写过的《openresty+Lua+GraphicsMagick进行类似淘宝的图片处理》进行自动图片进行各种尺寸的裁剪,非常适用于电商网站的使用。
OpenResty的安装
TG的开发离不开OpenResty的支持,OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。相关内容可以查看其官网:http://openresty.org
安装drizzle
$ wget https://openresty.org/download/drizzle7-2011.07.21.tar.gz $ tar -xf drizzle7-2011.07.21.tar.gz $ cd drizzle7-2011.07.21/ $ ./configure --without-server $ make libdrizzle-1.0 $ make install-libdrizzle-1.0
安装OpenResty
$ wget https://openresty.org/download/ngx_openresty-1.9.3.2.tar.gz $ tar -xf ngx_openresty-1.9.3.2.tar.gz $ cd ngx_openresty-1.9.3.2 $ ./configure --prefix=/opt/openresty --with-http_drizzle_module --with-lua51 --with-luajit --without-mail_pop3_module --without-mail_imap_module --without-mail_smtp_module $ gmake $ gmake install $ ln -s /opt/openresty/nginx/conf /etc/nginx
编写OpenResty的启动服务脚本
$ vim /etc/init.d/openresty #!/bin/bash # OpenResty Startup script for the Nginx HTTP Server # this script create it by ivan at 2010.12.29. # # chkconfig: - 85 15 # description: OpenResty is a high-performance web and proxy server. # It has a lot of features, but it's not for everyone. # processname: nginx # pidfile: /var/run/nginx.pid # config: /etc/nginx/nginx.conf nginxd=/opt/openresty/nginx/sbin/nginx nginx_config=/etc/nginx/nginx.conf nginx_pid=/var/run/nginx.pid RETVAL=0 prog="nginx" # Source function library. . /etc/rc.d/init.d/functions # Source networking configuration. . /etc/sysconfig/network # Check that networking is up. [ ${NETWORKING} = "no" ] && exit 0 [ -x $nginxd ] || exit 0 # Start nginx daemons functions. start(){ if [ -e $nginx_pid ]; then echo "nginx already running..." exit 1 fi echo -n $"Starting $prog:" daemon $nginxd -c ${nginx_config} RETVAL=$? echo [ $RETVAL = 0 ] && touch /var/lock/subsys/nginx return $RETVAL } # Stop nginx daemons functions. stop(){ echo -n $"Stopping $prog:" killproc $nginxd RETVAL=$? echo [ $RETVAL = 0 ] && rm -f /var/lock/subsys/nginx /var/run/nginx.pid } #reload nginx service functions. reload(){ echo -n $"Reloading $proc:" killproc $nginxd -HUP RETVAL=$? echo } # See how we were called. case "$1" in start) start ;; stop) stop ;; reload) reload ;; restart) stop start ;; status) status $prog RETVAL=$? ;; *) echo $"Usage: $prog {start|stop|restart|reload|status|help}" exit 1 esac exit $RETVAL $ chmod +x /etc/init.d/openresty $ chkconfig --add openresty $ chkconfig openresty on
安装TG
将TG的所有文件拷贝到服务器上
$ git clone https://github.com/ivanszl/tadashigallery.git $ cd tadashigallery
配置好前端的访问地址跟图片访问域名
$ vim js/common.js define(function(require, exports, modules){ String.prototype.htmlEncode = function() { var tmp = document.createElement("div"); (tmp.textContent != null) ? (tmp.textContent = this) : (tmp.innerText = this); var output = tmp.innerHTML; tmp = null; return output; }; String.prototype.htmlDecode = function() { var tmp = document.createElement("div"); tmp.innerHTML = text; var output = tmp.innerText || tmp.textContent; tmp = null; return output; }; String.prototype.jstpl_format = function(c) { function d(b, a) { if (a in c) { return c[a]; } return ""; } return this.replace(/%\{([A-Za-z0-9_|.]+)\}/g, d); }; var common = { queryUri : '/query.html', // 查询文件、文件夹、搜索接口 loginUri : '/login.html', // 登陆接口 addFolderUri : '/add_folder.html', // 添加文件夹接口 uploadUri : '/file_upload.html', // 文件上传接口 delFileUri : '/delete_file.html', // 删除文件接口 renameUri: '/rename.html', // 更改名字接口 imageHost : 'http://images.linsongzheng.com', // 图片访问域名 可以结合CDN来使用 storeSave : function(key, val) { if (window.localStorage) { localStorage[key] = val; } else { common.setCookie(key, val, 365 * 24 * 3600); } }, storeDelete : function(key) { if (window.localStorage) { localStorage.removeItem(key); } else { common.setCookie(key, 'tadashi', -1); } }, storeGet : function(key) { if (window.localStorage) { return localStorage.getItem(key); } else { return common.getCookie(key); } }, setCookie : function(key, val, expire) { var exp = new Date(); exp.setTime(exp.getTime() + expire * 1000); document.cookie = key + "=" + escape(val) + ";expire=" + exp.toGMTString(); }, getCookie : function(key) { var arr,reg=new RegExp("(^| )"+key+"=([^;]*)(;|$)"); return (arr=document.cookie.match(reg))?unescape(arr[2]):null; } }; modules.exports = common; });
修改服务器配置
创建虚拟主机与后端配置文件夹,修改OpenResty的配置文件
$ mkdir -p /etc/nginx/{vhost,backend} $ vim /etc/nginx/nginx.conf
将nginx.conf的内容替换成以下代码
user www; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; pid /var/run/nginx.pid; worker_rlimit_nofile 65535; events { worker_connections 65535; multi_accept on; } 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"'; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 5; client_header_timeout 10; client_body_timeout 120; reset_timedout_connection on; send_timeout 3600; gzip on; gzip_min_length 1k; gzip_buffers 4 64k; gzip_comp_level 6; gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; gzip_vary on; client_header_buffer_size 32k; large_client_header_buffers 4 64k; client_max_body_size 200m; open_file_cache max=100000 inactive=20s; open_file_cache_valid 30s; open_file_cache_min_uses 2; open_file_cache_errors on; resolver 10.202.72.118 10.202.72.116; lua_package_path '/opt/openresty/lualib/?.lua;;'; lua_package_cpath '/opt/openresty/lualib/?.so;;'; include conf/backend/*.enable; include conf/vhost/*.enable; }
添加vhost的配置文件
$ vim /etc/nginx/vhost/tuku.enable init_by_lua_file '/var/www/html/tadashigallery/script/init.lua'; server { listen 80; server_name tuku.linsongzheng.com; access_log logs/tuku.access.log main; error_log logs/tuku.error.log; root /var/www/html/tadashigallery; index index.html; location ~ ^/(query|add_folder|file_upload|delete_file|rename).html$ { default_type applcation/json; set $redirect_header 1; access_by_lua_file /var/www/html/tadashigallery/script/auth_check.lua; content_by_lua_file /var/www/html/tadashigallery/script/$1.lua; } location /tuku/index.html { access_by_lua_file /var/www/html/tadashigallery/script/auth_check.lua; alias /var/www/html/tadashigallery/index.html; } location /login.html { default_type text/html; if ($request_method = POST) { content_by_lua_file /var/www/html/tadashigallery/script/login.lua; } alias /var/www/html/tadashigallery/login.html; if ($cookie_formhash = '') { access_by_lua " local ip = ngx.var.binary_remote_addr local hash = ngx.md5(ip .. (ngx.time() / 7200)) ngx.header['Set-Cookie'] = {'formhash=' .. hash} "; } } encrypted_session_key "abcdefghijklmnopqrstuvwxyz123456"; encrypted_session_iv "abcdefok12345678"; encrypted_session_expires 1d; location /tuku_mysql { internal; add_header Access-Control-Allow-Origin *; set_unescape_uri $sql $arg_sql; drizzle_pass tuku; drizzle_module_header off; drizzle_connect_timeout 500ms; drizzle_send_query_timeout 2s; drizzle_recv_cols_timeout 1s; drizzle_recv_rows_timeout 1s; drizzle_query $sql; rds_json on; } location ~ \.(js|css)$ { expires 30d; } }
添加drizzle后端配置文件
$ vim /etc/nginx/backend/tuku.enable upstream tuku { drizzle_server 127.0.0.1:3306 dbname=db_tuku password=123456 user=tuku protocol=mysql; }
修改TG的MYSQL配置和登录账号信息
$ vim /var/www/html/tadashigallery/script/init.lua MYSQL = { host = '127.0.0.1', port = 3306, dbname = 'db_tuku', user = 'test', pwd = '123456' } TUKU = { user = 'tadashi', -- 登录用户名 password = 'tuku123456' -- 登录密码 }
启动服务测试
启动http服务器
$ service openresty start
浏览器访问测试
赞一个。建议博主以后可以出一些Lua的教程。
会慢慢出关于Lua的一些基础教程的
这么好的东西,没推广,可惜。还有博主有做过性能测试吗?
多谢认可,有做过部分性能的测试,比很多的好。
东西是开源的,有什么好建议都可以提醒下。