Nginx是一款高效的http server,它的第三方扩展性也是非常非常之多。这次有个需求,需要通过链接转换成真正的图片地址,将资源rewrite出去。如果资源不存在将随机一张图片返回。
在开始写的过程中,本来想考虑使用LUA模块,但是这么简单的一个功能,觉得利用rewrite功能就可以了,但是他需要随机,nginx自身是不提供随机数的,所以在官方第三方中找到了一个HttpSetMiscModule模块。
原来是通过rewrite功能,将链接根据需求分割获得相应的参数,然后使用set命令,设定nginx下的环境变量。具体看下面的例子。
location ^~ /live/screenshots/ { valid_referers none blocked *.xx.cn; #设定有效来源 if ($invalid_referer) { return 403; } expires 1m; if ($uri ~ /live/screenshots/(\d+)/(\d+)\.(icon|html|htm|jpeg|jpg|gif|bmp|png|flv|swf|zip|rar|doc|docx|xls|xlsx)) { #针对链接进行分析,取出需要的参数 set $img_path $document_root/live/screenshots/$1/1.$3; #设定nginx环境变量 set $roomid $1; set $gameid $2; set $img_type $3; } if (-e $img_path) { #判断此文件是否存在 rewrite ^ /live/screenshots/$roomid/1.$img_type break; #存在就重写链接 } set_random $rand 1 10; #生成随机数 set $rand_img /live/capture/$gameid/$rand.jpg; set $rand_img_path $document_root$rand_img; if (-e $rand_img_path) { #判断随机图片 rewrite ^ $rand_img break; } error_page 404 =200 http://img.xx.cn/live/NonePic/none.jpg; #如果没有图片,返回404图片,状态仍然保持200 }
通过上面的例子和注释,应该大致了解了吧。通过rewrite的if提供的regex以-e -f -d函数功能实现了强大的功能。在利用set功能,将nginx的环境进行配置。这个与写一个php或者其他脚本来比较,速度非常快。