看了开涛的Nginx+Lua开发教程,非常感兴趣。因此,本身也把环境搭建起来玩。html
跟开涛的不一样,我使用Vagrant + Ansible来搭建(不要问我为何不使用Docker)。这样,全部的人只要两条命令就能够搭建好了,而不须要手工一条命令一条命令打。java
所谓使用Openresty来作读服务,是指Openresty直接从数据源读数据,而后渲染输出,而不通过应用服务器,好比Tomcat服务器。Openresty 是一个基于Nginx和LuaJIT的动态Web开发平台。我不知道京东是不是直接使用Openresty仍是本身编译Nginx + Lua。反正,我直接使用Openresty。nginx
本次文章就是根据开涛的教程,实现使用lua-resty-template 作模块引擎,使用Redis作数据源。我把Openresty和Redis都安装在同一台机器上,以方便作实验,固然,若是你想装在不一样的服务器,只须要修改下配置就行了。如下是架构:git
整个步骤我都写成了Ansible自动化配置脚本。因此,你已经不须要本身搭建。全部的代码都托管在:http://git.oschina.net/zacker330/openresty-lab 。github
启动前,你必须安装Vagrant 和 Ansible 2.0+。redis
git clone https://git.oschina.net/zacker330/openresty-lab.git cd openresty-lab vagrant up ansible-playbook ./ansible/playbook.yml -i ./ansible/inventory -u vagrant -k >> 输入ssh密码 `vagrant`
PS. ansible-playbook须要经过ssh登陆上目标机器来执行咱们的任务。shell
接下来,咱们解释下代码。数组
Openresty的配置以下:浏览器
## 省去了一些不重要的nginx配置 http { default_type application/octet-stream; ## 省去了一些不重要的nginx配置 ## 初始化所须要对象 init_by_lua ' require "resty.core" redis = require "resty.redis" template = require "resty.template" template.caching(false); -- you may remove this on production '; server{ listen 80; server_name 192.168.8.10; charset utf-8; ## 指定 模板路径 set $template_root "/usr/local/openresty/nginx/html/templates"; location ~ \.lsp$ { default_type text/html; content_by_lua 'template.render(ngx.var.uri)'; ## 访问index.lsp,将使用index.lsp模板 } } }
页面逻辑代码 index.lsp:服务器
{% layout = "layouts/default.lsp" -- 模板 local blogid= ngx.var.arg_blogId local title = "博客标题" local author = {name = "fooname", gender = "female", level= 3} local description = "<script>alert(1);</script>" local content = "java8的流式处理极大了简化咱们对于集合、数组等结构的操做,让咱们能够以函数式的思想去操做,<br/>本篇文章将探讨java8的流式数据处理的基本使用。" local tags = {"life", "lua", "openresty"} local radar = {lua = 90, openresty = 80, nginx = 70} -- 使用nginx的内置变量 local a = ngx.var.arg_a local b = ngx.var.arg_b local ip = ngx.var.remote_addr -- 使用redis读数据源 local red = redis:new() red:set_timeout(1000) local ok, err = red:connect("127.0.0.1", 6379) if not ok then ngx.say("failed to connect: ", err) return end local ok, err = red:lpush("list", a, b) local member, err = red:llen("list") %} <div> member: {{ member }}<br/> remote ip: {{ ip }} blogId: {{blogid}}<br/> 做者: {{author.name}} {{author.gender}} level: {{author.level}}<br/> description: {{description}} <br/> tags: {% for i = 1, #tags do %} {% if i > 1 then %},{% end %} {* tags[i] *} {% end %}<br/> </div>
最终访问效果:http://192.168.8.10/index.lsp?a=12&b=asdfasdf&blogId=111
这种不通过应用服务器的方式,读的速度彷佛更快,毕竟省去了中间的Tomcat服务。可是,谁来填充数据给Redis和什么时机填充数据,又是另外一回事了。
开发过程彷佛有些麻烦,由于修改nginx配置后,不能像普通的页面开发那样立马看到效果,还要nginx -s reload一下。这个,我想到的解决方案是使用Ruby的guard gem来监控文件变更,而后reload nginx配置,最后使用浏览器的livereload来自刷新页面。https://github.com/guard/guard-livereload 目前尚未时间实现,但愿有热心朋友实现提pr。或者开涛能分享下他们的实践。但愿他本人能看到这篇博客。:P
2016.10 于深圳西丽人民医院