centos8.5环境下openresty使用lua访问redis、本地缓存、获取get参数,请求头以及获取post body参数

openresty对nginx做了大量的扩展,尤其是增加灵活多样的lua脚本支持,使得openresty可以完成各种各样的业务逻辑处理,大大地提高了应用的灵活性。对于简单的业务需求,还是可以将openresty当作nginx来使用,比如常用的反向代理业务等。也可以把openresty作为nginx的升级版来看待,也就是说,原来nginx支持的功能,openresty都是支持的。

下面以openresty支持的几个常用功能特性来简单说明一下openresty支持的功能特点。

1. 安装openresty

安装过程略。

2. openresty配置

配置过程略。

3. 在nginx添加配置信息:

默认安装情况下,配置文件路径。

/usr/local/openresty/nginx/conf/nginx.conf

vi nginx.conf

http模块添加:#lua 模块
lua_package_path "/usr/local/openresty/lualib/?.lua;;";#c模块
lua_package_cpath "/usr/local/openresty/lualib/?.so;;";server模块添加location  /redis {# 默认的响应类型default_type application/json;# 响应结果由lua/item.lua文件来决定content_by_lua_file lua/lua-openresty-redis.lua;}

lua脚本:

-- 引用resty的redis
local redis = require "resty.redis";
local red = redis:new();-- 连接redis
local ok,err = red:connect("127.0.0.1",6379);
if not ok thenngx.say("faild to connect",err);return
end-- 设置Redis密码
ok, err = red:auth("password")
if not ok thenngx.say("认证失败: ", err)return
end-- 查询redis
local resp, err = red:get("dKey")
-- 查询失败处理
if not resp thenngx.log(ngx.ERR, "查询Redis失败: ", err, ", key = " , key)
end-- 得到的数据为空处理
if resp == ngx.null thenresp = nilngx.log(ngx.ERR, "查询Redis数据为空, key = ", key)
end
-- close_redis(red)
ngx.say("dKey get dValue:"..resp)
return-- ok,err = red:set("dKey","dValue");
-- if not ok then
--  ngx.say("failed to set dKey",err);
--  return
-- end
-- ngx.say("dKey set dValue success")
-- return

根据lua文件的执行结果决定返回内容。 

4. redis通过set和get值

local redis = require "resty.redis"
local red = redis:new()red:set_timeout(1000) -- 1 秒超时local ok, err = red:connect("127.0.0.1", 6379)
if not ok thenngx.say("连接Redis失败: ", err)return
end-- 设置Redis密码
ok, err = red:auth("your_redis_password")
if not ok thenngx.say("认证失败: ", err)return
end-- 设置一个key
ok, err = red:set("dog", "an animal")
if not ok thenngx.say("设置key失败: ", err)return
end-- 获取刚才设置的key
local res, err = red:get("dog")
if not res thenngx.say("获取key失败: ", err)return
endngx.say("dog: ", res)

读取和设置redis的key值。 

5. 本地缓存(变量字符串)

5.1 http配置

lua_shared_dict my_cache 10m;

 5.2 location配置

location /testcache {default_type application/json;content_by_lua_block {local mycache = ngx.shared.my_cachelocal mykey = ngx.var.urilocal myvalue = mycache:get(mykey)ngx.log(ngx.ERR, "key:", mykey, "value:", myvalue)if myvalue thenngx.say("from cache: ", myvalue)else-- 模拟从后端获取数据local value = ngx.time()mycache:set(mykey, value)ngx.say("set cache: ", value)end}}

ngx.time是函数,不能直接保存;ngx.time()这样写就是方法调用了,返回方法调用的结果。

6. 本地缓存(常量字符串)

6.1 http配置

lua_shared_dict my_cache 10m;

6.2  location配置

location /localcache {default_type application/json;content_by_lua_block {local cache_dict = ngx.shared.my_cache-- 设置缓存local ok, err = cache_dict:set("my_key", "my_value")if not ok thenngx.log(ngx.ERR, "Failed to set cache: ", err)end-- 获取缓存local value, flags = cache_dict:get("my_key")if value thenngx.say("value: ", value)elsengx.say("no cache found for my_key")end}}

6.3 操作共享词典

-- 获取本地缓存对象local item_cache = ngx.shared.item_cache
-- 存储, 指定key、value、过期时间,单位s,默认为0代表永不过期item_cache:set('key', 'value', 1000)-- 读取
local val = item_cache:get('key')

7. 获取get请求参数

get请求参数通常通过url传递。

7.1 location配置

location /getparam {default_type application/json;content_by_lua_file lua/lua-http-param.lua;}

7.2 lua文件

lua文件lua-http-param.lua:

-- 获取get请求的参数
local arg = ngx.req.get_uri_args();
for k,v in pairs(arg)
dongx.say("key:",k," value:",v);
end

7.3 浏览器访问请求

http://ip:port/getparam?test=1

7.4 输出

key:test value:1

7.5 参数写入redis

-- 获取get请求的参数
local redis = require "resty.redis";
local red = redis:new();
red:connect("127.0.0.1",6379);
-- 省去链接错误的判断,前面课程中有
local arg = ngx.req.get_uri_args();
for k,v in pairs(arg)
dongx.say("key:",k," value:",v);red:set(k,v);
end

测试: http://192.168.182.111/?id=1

8. 获取请求头参数

8.1 location配置

location配置:

location /getheaders {default_type application/json;content_by_lua_file lua/http-header.lua;}

8.2 lua文件

lua文件http-header.lua:

-- 获取header参数
local headers = ngx.req.get_headers();
for k,v in pairs(headers)
dongx.say("[header] key:",k," value:",v);
end

8.3 浏览器请求地址

http://ip:port/getheaders

8.4 浏览器显示

[header] key:user-agent value:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36
[header] key:accept-language value:zh-CN,zh;q=0.9,en-US;q=0.8,en-GB;q=0.7,en;q=0.6
[header] key:connection value:keep-alive
[header] key:accept-encoding value:gzip, deflate
[header] key:upgrade-insecure-requests value:1

8.5 lua文件增加if字符串判断

增加if判断字符串是否相等

-- 获取header参数
local headers = ngx.req.get_headers();
for k,v in pairs(headers)
doif k == 'user-agent' thenngx.say("[header] key:",k," value:",v);end
end

8.6 访问

http://ip:port/getheaders

8.7 输出

[header] key:user-agent value:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36

 8.8 lua文件增加md5计算

lua文件配置:

-- 获取header参数
local headers = ngx.req.get_headers();
for k,v in pairs(headers)
doif k == 'user-agent' thenngx.say("[header] key:",k," value:",v);local md5 = ngx.md5(str)ngx.say("md5:",md5," value:",v);end
end

8.9 访问

http://ip:port/getheaders

8.10 输出

[header] key:user-agent value:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36
md5:d41d8cd98f00b204e9800998ecf8427e value:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36

9. 获取post body 键值对 参数

9.1 location配置

location /postbodyparam {default_type application/json;content_by_lua_file lua/http-post-body.lua;}

9.2 lua文件

http-post-body.lua

-- 获取post body kv参数
-- 重要:读取body
ngx.req.read_body();
local postArgs = ngx.req.get_post_args();
for k,v in pairs(postArgs)
dongx.say("[post] key:",k," value:",v);
end

9.3 访问

http://ip:port/postbodyparam

9.4 输出

[post] key:testkey value:testvalue

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/458785.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Maven 项目管理工具

目录 Maven简介 Maven快速上手 Maven详细介绍 Maven工作机制 Maven安装及配置 使用IDEA创建Maven Web工程 Maven简介 Maven是 Apache 开源组织奉献的一个开源项目,可以翻译为“专家”或“内行”。 Maven 的本质是一个项目管理工具,将项目开发和管…

Tangible Software Solutions 出品最准确可靠的源代码转换器

Tangible Software Solutions 出品最准确可靠的源代码转换器 简介1、Instant C#(VB.NET to C#)2、Instant VB(C# to VB.NET)3、C to C# Converter4、C to Java Converter5、C to Python Converter6、Java to C# Converter7、Java to C Converter8、Java to Python Converter9、…

首届The VRAnimation Award 震撼启幕!VsoCloud独家赞助此次大赛!

CG行业的精英与爱好者们,你们的舞台已经搭好!备受瞩目的首届The VR & Animation Award现已正式拉开帷幕,诚邀各位共襄盛举!丰厚大奖、作品曝光、行业资源分享……多重惊喜等你来解锁! 此次大赛由Rival Technologie…

生产工单系统如何帮助企业控制成本?

我们都知道,在现在竞争日益激烈的市场环境中,企业对于成本控制的需求达到了前所未有的高度。每一分成本的优化,都直接关系到企业的盈利能力和市场竞争力。成本贯穿于生产、销售、管理等各个环节。其中,生产环节的成本控制更是关键…

【瑞吉外卖】-day01

目录 前言 第一天项目启动 获取资料 创建项目 ​编辑 连接本地数据库 连接数据库 修改用户名和密码 ​编辑创建表 创建启动类来进行测试 导入前端页面 创建项目所需目录 检查登录功能 登录界面 登录成功 登录失败 代码 退出功能 易错点 前言 尝试一下企业级项…

2024.10.25 软考学习笔记(知识点)

刷题网站: 软考中级软件设计师在线试题、软考解析及答案-51CTO题库-软考在线做题备考工具

map 和 set 的使用

文章目录 一.序列式容器和关联式容器二. set 系列的使用1. set 和 multiset 参考文档2. set 类介绍3. set 的构造和迭代器4. set 的增删查5. insert 和迭代器遍历使用样例6. find 和 erase 使用样例7. multiset 和 set 的差异 三. map 系列的使用1. map 和 multimap参考文档2. …

【Spring】Spring Boot 日志(8)

本系列共涉及4个框架:Sping,SpringBoot,Spring MVC,Mybatis。 博客涉及框架的重要知识点,根据序号学习即可。 1、日志概述 1.1学习日志的必要性 在第一次学习编程语言的时候,我们就在使用printf或者System.out.println等打印语句打印日志了…

Python超轻量对话框:easyGUI

文章目录 简介box回调函数 简介 EasyGUI是一个非常简单的GUI模块,提供了许多对话框,所有交互操作都通过简单的函数调用实现。支持pip安装,十分便捷 pip install easygui通过一行代码,即可实现下面的对话框 其对应的代码为 impo…

ArrayList和Array、LinkedList、Vector 间的区别

一、ArrayList 和 Array 的区别 ArrayList 内部基于动态数组实现,比 Array(静态数组) 使用起来更加灵活: ArrayList 会根据实际存储的元素动态地扩容或缩容,而 Array 被创建之后就不能改变它的长度了。ArrayList 允许…

雷池社区版OPEN API使用教程

OPEN API使用教程 新版本接口支持API Token鉴权 接口文档官方没有提供,有需要可以自行爬取,爬了几个,其实也很方便 使用条件 需要使用默认的 admin 用户登录才可见此功能版本需要 > 6.6.0 使用方法 1.在系统管理创建API TOKEN 2.发…

OpenGMS是什么?如何使用OpenGMS的建模与模拟工具(一)

目录 OpenGMS是什么?如何使用OpenGMS的建模与模拟工具(一) 一、什么是OpenGMS 1、OpenGMS网站 2、OpenGMS团队 二、为什么我们需要OpenGMS 1、地理模拟实验的局限性区域性限制了科研应用的效率 2、外界对于OpenGMS的评价 三、 OpenG…

springboot095学生宿舍信息的系统--论文pf(论文+源码)_kaic

学生宿舍信息管理系统 摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了学生宿舍信息管理系统的开发全过程。通过分析学生宿舍信息管理系统管理的不足,创建了一个计算机管理学生宿舍信息管理系统的方…

五、大模型(LLMs)RAG检索增强生成面

本文精心汇总了多家顶尖互联网公司在大模型RAG检索增强生成考核中的核心考点,并针对这些考点提供了详尽的解答。并提供电子版本,见于文末百度云盘链接中,供读者查阅。 5.1 大模型(LLMs)RAG 入门篇 基于LLM向量库的文档…

VGG16

1️⃣ VGG介绍 Alexnet证明了神经网络变深是有效的,因此网络能不能更深更大?   VGG(visual geometry group)是由牛津大学提出的使用“块思想”的网络,通过使用循环和子程序可以很容易地在任何现代深度学习框架的代码…

Transformer多步时序预测:多变量输入,单变量输出

文章目录 Transformer类数据集类训练函数测试函数画图计算指标读取数据计时开始训练 数据集来源: https://github.com/zhouhaoyi/ETDataset import torch import torch.nn as nn import numpy as np import pandas as pd import math import time from sklearn.pre…

RabbitMq-队列交换机绑定关系优化为枚举注册

📚目录 📚简介:🚀比较💨通常注册🌈优化后注册 ✍️代码💫自动注册的关键代码 📚简介: 该项目介绍,rabbitMq消息中间件,对队列的注册,交换机的注册&#xff0c…

使用pyinstaller将python代码打包为exe程序

打包exe 对于不懂程序的人来说,可能有这样一个认识上的误区:只有能够直接打开的exe才是平常经常见到的程序,py文件不能算是程序。 在这种情况下,一些python的使用者可能非常苦恼:怎么才能够让我的程序,看…

博客搭建之路:hexo搜索引擎收录

文章目录 hexo搜索引擎收录以百度为例 hexo搜索引擎收录 hexo版本5.0.2 npm版本6.14.7 next版本7.8.0 写博客的目的肯定不是就只有自己能看到,想让更多的人看到就需要可以让搜索引擎来收录对应的文章。hexo支持生成站点地图sitemap 在hexo下的_config.yml中配置站点…

2-ZYNQ 折腾记录 -PMU

The AMD Zyng UltraScale MPSoC包括一个专用的用户可编程处理器,该平台测量单元(Platform Measurement Unit, PMU)处理器用于电源、错误管理和执行可选的软件测试库(Software Test Library, STL)用于功能安全应用。 PMU执行以下一组任务。启动前对系统的初始化。电…