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 then
 ngx.say("faild to connect",err);
 return
end

-- 设置Redis密码
ok, err = red:auth("password")
if not ok then
    ngx.say("认证失败: ", err)
    return
end

-- 查询redis
local resp, err = red:get("dKey")
-- 查询失败处理
if not resp then
  ngx.log(ngx.ERR, "查询Redis失败: ", err, ", key = " , key)
end

-- 得到的数据为空处理
if resp == ngx.null then
  resp = nil
  ngx.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 then
    ngx.say("连接Redis失败: ", err)
    return
end
 
-- 设置Redis密码
ok, err = red:auth("your_redis_password")
if not ok then
    ngx.say("认证失败: ", err)
    return
end
 
-- 设置一个key
ok, err = red:set("dog", "an animal")
if not ok then
    ngx.say("设置key失败: ", err)
    return
end
 
-- 获取刚才设置的key
local res, err = red:get("dog")
if not res then
    ngx.say("获取key失败: ", err)
    return
end
 
ngx.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_cache
                local mykey = ngx.var.uri
                local myvalue = mycache:get(mykey)

                ngx.log(ngx.ERR, "key:", mykey, "value:", myvalue)

                if myvalue then
                  ngx.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 then
                ngx.log(ngx.ERR, "Failed to set cache: ", err)
              end
              -- 获取缓存
              local value, flags = cache_dict:get("my_key")
              if value then
                ngx.say("value: ", value)
              else
                ngx.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)
do
 ngx.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)
do
 ngx.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)
do
 ngx.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)
do
  if k == 'user-agent' then
    ngx.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)
do
  if k == 'user-agent' then
    ngx.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)
do
 ngx.say("[post] key:",k," value:",v);
end

9.3 访问

http://ip:port/postbodyparam

9.4 输出

[post] key:testkey value:testvalue

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

解决VMware虚拟机的字体过小问题

前言: (1)先装VMware VMware17Pro虚拟机安装教程(超详细)-CSDN博客 (2)通过清华等镜像网站安装好Ubuntu镜像,下面贴上链接 教程虚拟机配置我没有做,因为学校给了现成的虚拟机~~大家需要的自己…

数据结构之单链表——考研笔记

文章目录 一.单链表定义1.什么是单链表2.代码实现3.不带头结点的单链表4.带头结点的单链表 二.单链表插入删除1.按位序插入(带头结点)2.插入时不带头节点3.指定节点的后插操作4.指定节点的前插操作5.按位序删除(带头结点)6.删除指…

2024年【北京市安全员-A证】找解析及北京市安全员-A证考试试卷

题库来源:安全生产模拟考试一点通公众号小程序 北京市安全员-A证找解析考前必练!安全生产模拟考试一点通每个月更新北京市安全员-A证考试试卷题目及答案!多做几遍,其实通过北京市安全员-A证证考试很简单。 1、【多选题】《中华人…

保姆级教程 | 全流程免费:合并多份长宽不同的PDF成相同大小并进行瘦身

背景 由于老板需要,完成不同PDF文件(a,b,c....)合并,同时要求主文件(A)小于6M。合并过程中发现各个PDF大小(长宽)并不相同,造成合并后效果不好也…

网站安全问题都有哪些,分别详细说明

网站安全问题涉及多个方面,以下是一些常见的网站安全问题及其详细说明: 数据泄露 问题描述:数据泄露是指网站存储的用户敏感信息(如用户名、密码、信用卡信息等)被非法获取。黑客可能通过SQL注入、XSS攻击等手段窃取这…

Unity编辑器界面及其基础功能介绍

文章目录 Unity编辑器界面编辑器默认界面布局打开和关闭编辑界面自定义界面布局Unity资源商店Unity Assets Store什么是资源商店?资源商店中包含哪些东西?如何进行素材导入?Unity官网购买素材或插件导入方法非官网素材导入非官网插件导入 Sce…

【WRF数据准备】基于GEE下载静态地理数据-叶面积指数LAI及绿色植被率Fpar

【WRF数据准备】基于GEE下载静态地理数据 准备:WRF所需静态地理数据(Static geographical data)数据范围说明基于GEE下载叶面积指数及绿色植被率GEE数据集介绍数据下载:LAI(叶面积指数)和Fpar(绿色植被率)数据处理:基于Python处理为单波段LAI数据参考GEE的介绍可参见另…

基于Django+python的酒店客房入侵检测系统设计与实现

项目运行 需要先安装Python的相关依赖:pymysql,Django3.2.8,pillow 使用pip install 安装 第一步:创建数据库 第二步:执行SQL语句,.sql文件,运行该文件中的SQL语句 第三步:修改源…

Spring beanFactoryPostProcessor

项目结构和代码 Component public class CustomerBeanFactoryPostProcessor implements BeanFactoryPostProcessor {Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {System.out.printl…

基于Spring Boot的宿舍管理系统设计与实现(源码+定制+开发)宿舍信息管理平台、智能宿舍系统开发、学生宿舍管理平台设计、宿舍入住与信息管理

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

华为:高级ACL 特定ip访问特定ip命令

网络拓扑图: 网络环境: 全网互通即可 1.创建一个名为test的高级ACL acl name test advance 2.添加规则 ##拒绝所有ip访问 rule 10 deny ip source any destination 192.168.1.10 0.0.0.0 只允许特定ip访问特定ip rule 5 permit ip source 192.168.2.10…

C++与现代开发实践第三节:多线程与并发编程

第四章:C与现代开发实践 第三节:多线程与并发编程 在这一课中,我们将详细探讨多线程与并发编程的各个方面,特别是从线程的创建、管理到高级的优化技术,并且通过复杂的实战案例来展示如何应对并发问题。最后&#xff…

并联 高电压、高电流 放大器实现 2 倍输出电流模块±2A

1.1 并联输出电路设计注意事项 直接对两个功率运算放大器的输出进行硬接线并不是一种好的电气做法。如果两个运算放大器的输出直接连接在一起,则可能会导致不均匀的电流共享。这是因为其中的每个运算放大器都尝试强制施加略微不同的 Vout 电压,该电压取决…

【HarmonyOS NEXT】使用 Navigation 对折叠屏设备页面进行分栏展示,优化 UI 交互

关键词:折叠屏、navigation、router、路由、分栏、UI 随着科技的发展,手机设备形态也由一面屏向多面屏进行发展,那么软件的UI适配也面临着问题,本篇文章主要解决大屏设备的页面 UI 适配问题,如折叠屏,平板&…

Spring Boot 3项目创建与示例(Web+JPA)

以下是一个Spring Boot 3.3.4整合JPA的示例,它展示了如何在Spring Boot应用程序中使用JPA进行数据持久化。 版本与环境 Spring Boot 3.3.4数据库: MySQL 8.0.40, MySQL的安装使用可以参考: MySQL 8 下载与安装攻略JDK 17Maven 3.6项目创建 可以使用Spring Initializr 初始…

一家生物技术企业终止,科创属性可能不足,报告期内专利数猛增

轩凯生物九成以上营业收入来源于植物营养领域,收入来源结构单一,产品下游应用领域较为集中。报告期内公司应收账款账面价值逐年上升,回款比例显著低于前两年,遭交易所问询是否存在较大的坏账风险。 轩凯生物核心技术是否成熟以及是…

ssm智慧社区电子商务系统+vue

系统包含:源码论文 所用技术:SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习,获取源码请私聊我 需要定制请私聊 目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 [2 系统…

Java面向对象编程进阶(四)

Java面向对象编程进阶(四) 一、equals()方法的使用二、toString()方法的使用三、复习 一、equals()方法的使用 适用性:任何引用数据都可以使用。 自定义的类在没有重写Object中equals()方法的情况下,调用的就是Object类中声明的…

C++初阶教程——C++入门

一、本章主要内容 C在C的基础之上,加入了面向对象编程的思想,并增加了许多有用的库以及编程范式。可以说,C是C的子集。在这章的内容中,笔者将会为诸位读者讲C如何补充C语言的一些不足。比如:作用域、IO、函数、指针等。…

Swift Macro 在业务开发中的探索与实践

简介 Swift Macro 在 Swift 5.9 版本中正式引入,且需配合 Xcode 15 使用。Swift Macro 作为一种新的设计方法,致力于帮开发者降低编写重复代码的繁琐,以更为简洁优雅的方式去实现。 在 OC 中,有大家熟知的宏 #define,…