OpenResty ™ 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建可以处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。html
OpenResty 经过汇聚各类设计精良的 Nginx 模块(主要由 OpenResty 团队自主开发),从而将 Nginx 有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工程师可使用 Lua 脚本语言调动 Nginx 支持的各类 C 以及 Lua 模块,快速构造出足以胜任 10K 乃至 1000K 以上单机并发链接的高性能 Web 应用系统。前端
OpenResty 的目标是让你的Web服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型,不只仅对 HTTP 客户端请求,甚至于对远程后端诸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都进行一致的高性能响应。mysql
以上是从官网拷过来的原话,咱们经过写一个hello world,来走进openresty开发之旅linux
下载地址
http://openresty.org/cn/downl...nginx
有的人不会下windows版,因此我这里直接给出下载地址,如今是最新版本,学会了以后,能够本身下载git
mac、linux 平台
https://openresty.org/downloa...github
windows平台
https://openresty.org/downloa...web
关于安装
mac、linux安装看这里 http://openresty.org/cn/insta...
windows 直接以后直接启动就能够了,不用安装ajax
安装完以后别着急启动redis
开始写代码了
打开nginx目录下的conf/nginx.conf文件
在server中新增如下代码
location /hello { default_type text/html; content_by_lua ' ngx.say("<p>hello, world</p>") '; }
相似这样
http { server { listen 80; server_name localhost; location / { default_type text/html; content_by_lua ' ngx.say("<p>hello, world</p>") '; } } }
如今启动nginx,而后访问 http://localhost/hello,不出意外的话应该就OK了,若是你以前启动了,那么须要reload一下,nginx的基本操做这里就不介绍了
经过ngx.say 咱们能够往客户端输出响应文本,在整个request周期内能够屡次调用,接受的参数是字符串,若是输出table会报错
还有一个输出的函数是ngx.print,一样也是输出响应内容
这里有一个坑,就是调用ngx.say会在输出咱们的内容以后会额外输出一个换行,可是ngx.print就不会,我以前一个同事用lua输出了一个200,而后前端用ajax调用,判断是否200,死活是false,看输出的内容就是200,差点怀疑人生,幸好我比较机智,直接查看ajax请求源码,发现行号多了一行,就是那个换行,若是不仔细根本看不出来,这个坑被我一个同事踩了
上面的代码直接把lua代码写到nginx配置里面了,维护起来不是很方便,并且写代码的时候也没有语法高亮,提示这些,比较蛋疼,咱们把它拿出来一个单独的文件,并放到一个nginx下面单独的lua目录下,方便管理
lua/hello.lua
ngx.say("<p>hello, world</p>")
nginx.conf 改为这样
location / { default_type text/html; content_by_lua_file lua/hello.lua; }
而后nginx reload 一下,再看效果,应该是同样的
咱们修改一下hello.lua,在hello,world后面加一个!号,刷新浏览器发现没有任何变化,这是由于lua代码被缓存了,这就致使咱们修改代码,就必须reload nginx 在能看到效果,若是是这样,那简直要疯了,其实要解决这个问题很简单,只要在nginx.conf里面把lua缓存给禁止掉就好了,固然在生产线上必定要把缓存打开,否则效果大打折扣
禁止lua缓存
server { listen 80; server_name localhost; lua_code_cache off; # 这个能够放在server下面,也能够凡在location下面,做用的范围也不同,为了简单直接放这里了 location / { default_type text/html; content_by_lua_file lua/hello.lua; } }
改完以后reload一下nginx,这里重点声明一下修改nginx配置必需要reload,不然是没有效果的
如今咱们再改hello.lua,而后刷新浏览器就会发现能够实时生效了
观察以上代码其实还会发现一个问题,若是咱们想要处理不少个请求,那不是要在nginx里面配置N个location吗,咱们确定不会这么作,这里能够经过nginx正在匹配动态指定lua文件名,便可完成咱们的需求,后台我再介绍如何打造一个属于咱们的mvc轻量级框架,这里咱们先这么作
location 改为这样
location ~ /lua/(.+) { content_by_lua_file lua/$1.lua; }
reload nginx
这个时候访问hello world的请求url就变成了
http://localhost/lua/hello 了
同理,咱们在lua文件里面建立一个welcome.lua的话,就能够经过
http://localhost/lua/welcome 来访问了
以此类推,咱们就能够经过新增多个文件来处理不一样的请求了,并且修改了还能实时生效,剩下的就是完成业务代码了,好比调一下redis返回数据,或者mysql之类的,有悟性的同窗在这里已经能够作不少事情了
示例代码 参见demo1部分