安装luajit
wget http://luajit.org/download/LuaJIT-2.1.0-beta1.tar.gz
tar -xvf LuaJIT-2.1.0-beta1.tar.gz
cd LuaJIT-2.1.0-beta1
make && make install
安装openresty
wget https://openresty.org/download/ngx_openresty-1.7.10.1.tar.gz
tar -zxxvf ngx_openresty-1.7.10.1.tar.gz
cd ngx_openresty-1.7.10.1
./configure --prefix=/usr/local/openresty
gmake&&gmake install
平滑升级
wget https://openresty.org/download/openresty-1.13.6.1.tar.gz
tar -zxvf openresty-1.13.6.1.tar.gz
cd openresty-1.13.6.1
./configure --prefix=/usr/local/openresty
make
mv /usr/local/openresty/nginx/sbin/nginx /usr/local/openresty/nginx/sbin/nginx.old
cp build/nginx-1.13.6/objs/nginx /usr/local/openresty/nginx/sbin/nginx
kill -USR2 `cat /home/lua/nginx.pid`
kill -QUIT `cat /home/lua/nginx.pid.oldbin`
/usr/local/openresty/nginx/sbin/nginx -t
/usr/local/openresty/nginx/sbin/nginx -v
/usr/local/openresty/nginx/sbin/nginx -s reload
nginx执行过程
nginx在处理每一个用户请求时,都是按照若干个不同的阶段依次处理的,与配置文件上的顺序没有关系,详细内容可以阅读《深入理解nginx:模块开发与架构解析》这本书,这里只做简单介绍;
1、post-read
读取请求内容阶段,nginx读取并解析完请求头之后就立即开始运行;
2、server-rewrite
server请求地址重写阶段;
3、find-config
配置查找阶段,用来完成当前请求与location配重块之间的配对工作;
4、rewrite
location请求地址重写阶段,当ngx_rewrite指令用于location中,就是再这个阶段运行的;
5、post-rewrite
请求地址重写提交阶段,当nginx完成rewrite阶段所要求的内部跳转动作,如果rewrite阶段有这个要求的话;
6、preaccess
访问权限检查准备阶段,ngx_limit_req和ngx_limit_zone在这个阶段运行,ngx_limit_req可以控制请求的访问频率,ngx_limit_zone可以控制访问的并发度;
7、access
权限检查阶段,ngx_access在这个阶段运行,配置指令多是执行访问控制相关的任务,如检查用户的访问权限,检查用户的来源IP是否合法;
8、post-access
访问权限检查提交阶段;
9、try-files
配置项try_files处理阶段;
10、content
内容产生阶段,是所有请求处理阶段中最为重要的阶段,因为这个阶段的指令通常是用来生成HTTP响应内容的;
11、log
日志模块处理阶段;
常用函数或语句
# 设置纯 Lua 扩展库的搜寻路径(';;' 是默认路径):
lua_package_path '/foo/bar/?.lua;/blah/?.lua;;';
# 设置 C 编写的 Lua 扩展模块的搜寻路径(也可以用 ';;'):
lua_package_cpath '/bar/baz/?.so;/blah/blah/?.so;;';
access_by_lua_file lua脚本文件; 准入阶段完成参数验证
content_by_lua_block{书写lua脚本区域}; 内容产生阶段的lua脚本
client_body_in_file_only on;强制请求body到临时文件中
lua_code_cache off;//lua脚本缓存关闭 生产环境务必要设置成on
internal;标记只能内部使用,即由ngx.location.capture或ngx.location.capture_multi调用
ngx.req请求内容
ngx.ctx 用于保存每个请求的上下文,数据共享;;;注意开销较大(本人未验证https://moonbingbing.gitbooks.io/openresty-best-practices/content/openresty/share_var.html)
ngx.var.request_method请求方法
ngx.var.remote_addr客户端ip
nginx.log(日志级别, 参数。。。)生成日志
ngx.STDERR -- 标准输出
ngx.EMERG -- 紧急报错
ngx.ALERT -- 报警
ngx.CRIT -- 严重,系统故障,触发运维告警系统
ngx.ERR -- 错误,业务不可恢复性错误
ngx.WARN -- 告警,业务中可忽略错误
ngx.NOTICE -- 提醒,业务比较重要信息
ngx.INFO -- 信息,业务琐碎日志信息,包含不同情况判断等
ngx.DEBUG -- 调试
ngx.now()当前时间戳
ngx.say()异步输出 比print会多输出一个\n
ngx.print()异步输出
ngx.flush()显式的向客户端输出响应
ngx.sleep(s)暂停S秒
ngx.req.get_headers()获取请求头信息
ngx.req.get_body_file()获取上传的文件
ngx.req.get_uri_args()获取uri参数
ngx.req.read_body()读取body
ngx.req.get_body_data()获取符合http协议的请求体,不是普通的字符串。
需要指定lua_need_request_body on;指令
ngx.req.get_body_file()获取请求body的临时文件内容
ngx.req.get_post_args()获取post请求参数,一定要先执行ngx.req.read_body()
ngx.req.start_time()请求开始时间
ngx.encode_agrs()对请求参数进行转义即其他语言的urlencode
ngx.location.capture(location, {参数体})调用其他location 一个同步非阻塞的NGINX子请求uri
ngx.location.capture_multi({
{location1,{参数体1}},
{location2,{参数体2}},
})并行调用两个location
ngx.exec() 主要实现的是内部的重定向,等价于rewrite指令 ; 该方法不会主动返回,因此,强烈建议在调用该方法时,最好显式加上return
nginx.redirect(url)该方法会给客户端返回一个301/302重定向,具体是301还是302取决于设定的status值,如果不指定status值,默认是返回302 .
ngx.exit()退出
一些坑
1.content_by_lua_block openresty 1.7.10.1不可用,视乎是在1.9.x开始支持
2.content_by_lua_file path path如果使用相对路径是启动时-p参数指定的根路径否则默认是nginx安装路径作为根路径
3.Nginx内核规定一次可以发起的子请求的个数不能超过50个
4.只有当lua_code_cache设置为on时连接池才生效。
中文文档:https://github.com/iresty/nginx-lua-module-zh-wiki
OpenResty 最佳实践
https://www.gitbook.com/book/moonbingbing/openresty-best-practices/details
关于 OpenResty 的两三事
http://zivn.me/2013/08/05/something-about-openresty/
wiki:https://www.openresty.com.cn/nginx-lua-module-zh-wiki.html