Lua与Nginx整合

Openresty简介

OpenResty是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

OpenResty通过汇聚各种设计精良的 Nginx 模块(主要由 OpenResty 团队自主开发),从而将 Nginx 有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高性能 Web 应用系统。

OpenResty的目标是让你的Web服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型,不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都进行一致的高性能响应。

Openresty安装

Centos为例

预编译安装

yum install yum-utils
yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo
yum install openresty

源码编译安装

1. 下载源码包 http://openresty.org/cn/download.html
2. 解压后,进入目录执行配置命令
	./configure
	make && make install
3. 执行编译命令后,出现目录/usr/local/openresty

使用入门

1、修改/etc/profile,配置nginx环境变量

PATH=/usr/local/openresty/nginx/sbin:$PATH
export PATH

2、使profile生效

 source /etc/profile

3、启动nginx

nginx

4、修改配置文件/usr/local/openresty/nginx/conf/nginx.conf

server {
	listen 8080;
	location / {
	    default_type text/html;
	    content_by_lua_block {
	        ngx.say("<p>hello, world</p>")
	    }
	 }
}

5、重启nginx

nginx -s reload

6、测试

curl http://localhost:8080

使用进阶

引入lua脚本

在conf目录中新建lua/hello.lua

ngx.say("<h1>Hello Lua!!</h1>")

修改nginx.conf

server {
	listen 8080;
	location /lua {
	    default_type text/html;
	    content_by_lua_file conf/lua/hello.lua;
	}
}

获得URI中的单个变量

修改hello.lua

ngx.say(ngx.var.arg_a)

arg_a能获得参数a的值

http://192.168.7.188:8080/lua?a=zhangsan

获得URI中的所有变量

修改hello.lua

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

可以在网页输出所有参数列表

http://192.168.7.188:8080/lua?a=22&b=33&c=88

获得请求头信息

local headers = ngx.req.get_headers()                         
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  

获得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

获得其他内容

http协议版本
ngx.say("ngx.req.http_version : ", ngx.req.http_version(), "<br/>")
请求方法
ngx.say("ngx.req.get_method : ", ngx.req.get_method(), "<br/>")  
原始的请求头内容
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/>")

MySQL操作

连接MySQL数据库

-- 引用mysql模块
local mysql = require "resty.mysql"
-- 获得数据库对象
local db = mysql:new()
-- 设置超时
db:set_timeout(1000)
-- 连接数据库 ok是正常结果,err是错误结果
local ok, err = db:connect{
    host = "IP",
    port = 端口,
    database = "数据库名",
    user = "账号",
    password = "密码",
    charset = "utf8"
}
if not ok then
    ngx.say("连接失败", err)
    return
end
ngx.say("连接成功")

执行查询语句

-- 执行查询 res是查询结果
local res, err = db:query("查询语句")
if not res then
    ngx.say("查询错误 ", err)
    return
end
db:close()
-- 将查询结果转换为json 
local cjson = require "cjson"
ngx.say(cjson.encode(res))

Redis操作

连接Redis

local redis = require "resty.redis"
local red = redis:new()
red:set_timeout(2000)
local ok,err = red:connect("127.0.0.1", 6379)
if not ok then
    ngx.say("connect error: ", err)
    return
end

执行Redis命令

red:set("键",)
local value = red:get("键")
red:close()
  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值