Lua与Nginx整合

文章目录

  • Openresty简介
  • Openresty安装
  • 使用入门
  • 使用进阶
    • 引入lua脚本
    • 获得URI中的单个变量
    • 获得URI中的所有变量
    • 获得请求头信息
    • 获得POST请求的参数
    • 获得其他内容
        • http协议版本
        • 请求方法
        • 原始的请求头内容
        • body内容体
    • MySQL操作
      • 连接MySQL数据库
      • 执行查询语句
    • Redis操作
      • 连接Redis
      • 执行Redis命令

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("

hello, world

"
) } } }

5、重启nginx

nginx -s reload

6、测试

curl http://localhost:8080

使用进阶

引入lua脚本

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

ngx.say("

Hello Lua!!

"
)

修改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, ", "), "
"
) else ngx.say(k, ": ", v, "
"
) 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"], "
"
) ngx.say("user-agent : ", headers["user-agent"], "
"
) ngx.say("user-agent : ", headers.user_agent, "
"
) for k,v in pairs(headers) do if type(v) == "table" then ngx.say(k, " : ", table.concat(v, ","), "
"
) else ngx.say(k, " : ", v, "
"
) end end

获得POST请求的参数

ngx.req.read_body()  
ngx.say("post args begin", "
"
) 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, ", "), "
"
) else ngx.say(k, ": ", v, "
"
) end end

获得其他内容

http协议版本
ngx.say("ngx.req.http_version : ", ngx.req.http_version(), "
"
)
请求方法
ngx.say("ngx.req.get_method : ", ngx.req.get_method(), "
"
)
原始的请求头内容
ngx.say("ngx.req.raw_header : ",  ngx.req.raw_header(), "
"
)
body内容体
ngx.say("ngx.req.get_body_data() : ", ngx.req.get_body_data(), "
"
)

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()

你可能感兴趣的:(Lua,lua,nginx,开发语言)