OpenResty入门

OpenResty

OpenResty入门_第1张图片

OpenResty概述

OpenResty(又称ngx_openresty)是一个基于NGINX的可伸缩的WEB平台,由中国人章亦春发起,提供了很多高质量的第三方模块。

OpenResty 是一个强大的 Web 应用服务器,Web 开发人员可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,更主要的是在性能方面,OpenResty可以 快速构造出足以胜任 10K 以上并发连接响应的超高性能 Web 应用系统。

OpenResty的目标是让Web服务直接运行在NGINX服务内部,充分利用NGINX的非阻塞I/O模型,不仅对HTTP客户端请求,甚至对远程后端DB都进行一系列的高性能响应。

  • OpenResty借助于Nginx事件驱动模型和非堵塞IO,以实现高性能的Web应用程序。
  • OpenResty使我们可以借助于Nginx的异步非阻塞达到使用Lua异步并发访问后端DB等服务。

OpenResty运行原理

Nginx采用的是master-worker模型,也就是一个master进程管理多个worker进程,基本的时间处理都放在worker进程中,master进程负责全局初始化以及对worker进行的管理。

OpenResty中,每个worker进程使用一个LuaVM,当请求被分配到worker时,将在这个LuaVM中创建一个coroutine协程,协程之间数据隔离,每个协程都具有独立的全局变量。

OpenResty入门_第2张图片

OpenResty环境搭建

Windows环境搭建

官本

官网下载压缩包

OpenResty入门_第3张图片

解压,双击打开nginx,exe即可,访问localhost:80

OpenResty入门_第4张图片

CentOS环境搭建

同样下载最新版的压缩包即可,上传至Linux服务器

tar -xzvf openresty-VERSION.tar.gz
cd openresty-VERSION/
./configure
make
sudo make install

注意:安装前需要安装一下需要的依赖

yum install pcre-devel openssl-devel gcc curl

默认, --prefix=/usr/local/openresty 程序会被安装到/usr/local/openresty目录。您可以指定各种选项,比如:

./configure --prefix=/opt/openresty \
            --with-luajit \
            --without-http_redis2_module \
            --with-http_iconv_module \
            --with-http_postgres_module

添加环境变量

echo "export PATH=$PATH:/usr/local/openresty/nginx/sbin" >> /etc/profile
source /etc/profile

然后启动openresty,启动命令和nginx一致。(这里也可以直接进入到nginx目录下,./sbin/nginx直接启动)

nginx -c /usr/local/openresty/nginx/conf/nginx.conf

启动后查看一下服务

ps -ef | grep  nginx 

Lua

Lua概述

Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。

Lua 是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组于 1993 年开发的。

安装Lua
curl -R -O http://www.lua.org/ftp/lua-5.4.3.tar.gz
tar zxf lua-5.4.3.tar.gz
cd lua-5.4.3
make all test

查看Lua版本

[root@localhost luatest]# lua -v
Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio

windows安装只需要下载windows的对应版本解压即可,将解压目录配置进入系统的PATH即可。

VSCode编写Lua

安装Lua Debug插件

OpenResty入门_第5张图片

Lua语法

菜鸟教程lua语法

OpenResty快速入门

HelloWorld

修改nginx配置文件,默认在/usr/local/openresty/nginx/conf目录下,

location / {
    #root   html;
    #index  index.html index.htm;
	# 告诉浏览器返回的信息
	default_type text/html;
	content_by_lua_block{
		ngx.say("hello world");
	}
}

进入到sbin目录下,重启nginx,ngxin -s reload

如果代码过多会显得nginx的配置文件过于繁琐,所以我们可以将lua代码通过一个文件引入。

location / {
    #root   html;
    #index  index.html index.htm;
	# 告诉浏览器返回的信息
	default_type text/html;
	content_by_lua_file /usr/local/openresty/nginx/conf/test.lua;
}
获取http信息
获取uri参数

获取一个 uri 有两个方法:ngx.req.get_uri_argsngx.req.get_post_args,二者主要的区别是参数来源有区别

-- 获取get请求参数
local arg = ngx.req.get_uri_args()
for k,v in pairs(arg) do
   ngx.say("[GET ] key:", k, " v:", v)
   ngx.say("
") end -- 获取post请求时 请求参数 ngx.req.read_body() -- 解析 body 参数之前一定要先读取 body local arg = ngx.req.get_post_args() for k,v in pairs(arg) do ngx.say("[POST] key:", k, " v:", v) ngx.say("
") end
获取header
-- 获取header
local headers = ngx.req.get_headers()  
for k,v in pairs(headers) do
   ngx.say("[header] name:", k, " v:", v)
    ngx.say("
") end
获取body
-- 获取body信息
ngx.req.read_body()
local data = ngx.req.get_body_data();
ngx.say(data)

ngx.req.get_body_data() 读请求体,会偶尔出现读取不到直接返回 nil 的情况。如果请求体尚未被读取,请先调用 ngx.req.read_body (或打开 lua_need_request_body 选项强制本模块读取请求体,此方法不推荐)。

操作redis
local redis = require "resty.redis"
local red = redis:new()

red:set_timeout(1000) -- 1 sec

local ok, err = red:connect("192.168.1.4", 6379)
if not ok then
	ngx.say("failed to connect: ", err)
	return
end

-- 请注意这里 auth 的调用过程

local count
count, err = red:get_reused_times()
if 0 == count then
	ok, err = red:auth("admin")
	if not ok then
		ngx.say("failed to auth: ", err)
		return
	end
elseif err then
	ngx.say("failed to get reused times: ", err)
	return
end

ok, err = red:set("testkey", "testvalue")
if not ok then
	ngx.say("failed to set itcast: ", err)
	return
end

ngx.say("set result: ", ok)

-- 连接池大小是100个,并且设置最大的空闲时间是 10 秒
local ok, err = red:set_keepalive(10000, 100)
if not ok then
	ngx.say("failed to set keepalive: ", err)
	return
end

这里碰到redis的权限问题,需要启动redis的指定配置文件。

你可能感兴趣的:(nginx,linux,java)