OpenResty入门技术

原创地址:http://jinnianshilongnian.iteye.com/blog/2190344

目录:

1.OpenRestry(Nginx+Lua)开发环境

 

2.OpenRestry开发入门

 

3.Lua模块开发

3.1 常用Lua开发库1-redis、mysql、http客户端 附-Redis/SSDB+Twemproxy安装与使用

3.2 常用Lua开发库2-JSON库、编码转换、字符串处理

3.3 常用Lua开发库3-模板渲染

 

4.实战

4.1 Web开发实战1——HTTP服务

4.2 Web开发实战2——商品详情页

4.3 流量复制/AB测试/协程

 

说明:本文目的是学习Nginx+Lua开发

***********************************************

对于Nginx基本知识可以参考如下文章:

《官方文档》http://wiki.nginx.org/Configuration

《nginx启动、关闭、重启》 http://www.cnblogs.com/derekchen/archive/2011/02/17/1957209.html

《agentzh 的 Nginx 教程》  http://openresty.org/download/agentzh-nginx-tutorials-zhcn.html

《Nginx+Lua入门》http://17173ops.com/2013/11/01/17173-ngx-lua-manual.shtml

《nginx 配置指令的执行顺序》http://zhongfox.github.io/blog/server/2013/05/15/nginx-exec-order/

《nginx与lua的执行顺序和步骤说明》http://www.mrhaoting.com/?p=157

《Nginx配置文件nginx.conf中文详解》http://www.ha97.com/5194.html

《Tengine的Nginx开发从入门到精通》http://tengine.taobao.org/book/

 

对于Lua基本知识可以参考如下文章:

《Lua简明教程》http://coolshell.cn/articles/10739.html

《Lua在线lua学习教程》http://book.luaer.cn/

《Lua 5.1 参考手册》http://www.codingnow.com/2000/download/lua_manual.html

《Lua5.3 参考手册》http://cloudwu.github.io/lua53doc/

***************************************************

Nginx Lua API

和一般的Web Server类似,我们需要接收请求、处理并输出响应。

对于请求:获取如请求参数、请求头、Body体等信息;

对于处理就是:调用相应的Lua代码即可;

对于输出响应:进行响应状态码、响应头和响应内容体的输出。

 

因此我们从如上几个点出发即可。

 

一. 接收请求

在Nginx-Lua配置文件内:接收,解析请求交由Lua处理

 

1. 编辑example.conf配置文件

vi /usr/server/example/example.conf

 

    location ~ /lua_request/(\d+)/(\d+) {  

        #设置nginx变量:参数a的值是$1(第一个参数), b的值是  $host(前面的ip地址)

        set $a $1;   

        set $b $host;  

        default_type "text/html";  

        #nginx内容处理  

        content_by_lua_file /usr/server/example/lua/test_request.lua;  

        #内容体处理完成后调用  

        echo_after_body "ngx.var.b $b";  

    }  

 

2.test_request.lua 

 # vi /usr/server/example/lua/test_request.lua;

    --nginx变量  

    local var = ngx.var  

    ngx.say("ngx.var.a : ", var.a, "<br/>")   -- 1

    ngx.say("ngx.var.b : ", var.b, "<br/>")  -- ip

    ngx.say("ngx.var[2] : ", var[2], "<br/>")  -- 请求路径的第二个参数 2

    ngx.var.b = 2;  --设置b的值为2

      

    ngx.say("<br/>")  

      

    -- 请求头  

    local headers = ngx.req.get_headers()  

    ngx.say("headers begin", "<br/>")  

    ngx.say("Host : ", headers["Host"], "<br/>")  

    ngx.say("user-agent : ", headers["user-agent"], "<br/>")  

    ngx.say("user-agent : ", headers.user_agent, "<br/>")  

    for k,v in pairs(headers) do  

        if type(v) == "table" then  

            ngx.say(k, " : ", table.concat(v, ","), "<br/>")  

        else  

            ngx.say(k, " : ", v, "<br/>")  

        end  

    end  

    ngx.say("headers end", "<br/>")  

    ngx.say("<br/>")  

      

    -- get请求uri参数  

    ngx.say("uri args begin", "<br/>")  

    local uri_args = ngx.req.get_uri_args()  

    for k, v in pairs(uri_args) do  

        if type(v) == "table" then  

            ngx.say(k, " : ", table.concat(v, ", "), "<br/>")  

        else  

            ngx.say(k, ": ", v, "<br/>")  

        end  

    end  

    ngx.say("uri args end", "<br/>")  

    ngx.say("<br/>")  

      

    --post请求参数  

    ngx.req.read_body()  

    ngx.say("post args begin", "<br/>")  

    local post_args = ngx.req.get_post_args()  

    for k, v in pairs(post_args) do  

        if type(v) == "table" then  

            ngx.say(k, " : ", table.concat(v, ", "), "<br/>")  

        else  

            ngx.say(k, ": ", v, "<br/>")  

        end  

    end  

    ngx.say("post args end", "<br/>")  

    ngx.say("<br/>")  

      

    --请求的http协议版本  

    ngx.say("ngx.req.http_version : ", ngx.req.http_version(), "<br/>")  --1.1

    --请求方法  

    ngx.say("ngx.req.get_method : ", ngx.req.get_method(), "<br/>")  --get

    --原始的请求头内容  

    ngx.say("ngx.req.raw_header : ",  ngx.req.raw_header(), "<br/>")  

    --请求的body内容体  

    ngx.say("ngx.req.get_body_data() : ", ngx.req.get_body_data(), "<br/>")  

    ngx.say("<br/>")  

 

ngx.var : nginx变量,如果要赋值如ngx.var.b = 2,此变量必须提前声明;另外对于nginx location中使用正则捕获的捕获组可以使用ngx.var[捕获组数字]获取;

ngx.req.get_headers:获取请求头,默认只获取前100,如果想要获取所以可以调用ngx.req.get_headers(0);获取带中划线的请求头时请使用如headers.user_agent这种方式;如果一个请求头有多个值,则返回的是table;

ngx.req.get_uri_args:获取url请求参数,其用法和get_headers类似;

ngx.req.get_post_args:获取post请求内容体,其用法和get_headers类似,但是必须提前调

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值