前言
最近在做图片服务的时候,一开始用的tomcat,图片的url后面拼接上token,在tomcat里进行token验证后再把二进制流返回给前台。不过,我们项目中有一个页面,在进去的时候,会一次性加载1000张左右的图片,等图片加载完,花都谢了。
不过也不能把后台校验去了,所以就有了在nginx上做token验证的想法,同事说可以开发脚本,随后就有了接下来的故事。
OpenResty
OpenResty就是我需要用到的集成了nginx和lua开发环境的框架,该框架甚至集成了redis连接包等,里面的东西很多,具体的可以看这篇文章:OpenResty 最佳实践,本篇文章只说具体实现。另外高喊一句,lua牛批。
不过在搭建lua的开发环境的时候,可能是因为我是Windows系统,所以环境没能安装成功, 不过我按照Idea+lua 开发环境搭建(一)文章里说的,成功运行lua。虽然。。。我搭好lua环境后,只是用来练习语法和部分标准库了,nginx的开发没用上。。。
它的一生
第一版中,我只是在里面通过Redis做了token校验,只要请求过来,就会先去Redis里面判断一下是否有这个token,如果有的话就返回图片。不过返回图片卡住了好久,按照《OpenResty 最佳实践》中说的,我返回图片流给页面,页面并不能看到图片。于是我决定利用子查询来做,将该请求转到nginx中的另一个location下。
第二版加入了token缓存,在缓存中存储接收到的token,等下一个请求来时,先去缓存中看有没有,如果没有的话就去redis中查一下。虽然这么设置了,图片还是没有达到想要的速度,只能跟前端的大哥商量,说能不能让图片懒加载,一次请求1000个真的有点搞。。。
最后应用的代码
nginx.conf: 应用了
#user nobody;
worker_processes 2;
error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
# 声明创建缓存
lua_shared_dict my_cache 64m;
#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 {
listen 80;
server_name localhost;
charset UTF-8;
# access_log logs/host.access.log info;
location ^~ /images/ {
content_by_lua_file l