OpenResty入门与实践:下载安装、环境变量、常用命令及案例解析

文章目录

  • 一、Openresty下载安装
  • 二、设置环境变量
  • 三、常用命令
  • 四、入门案例
  • 五、实践案例
    • 1、lua-nginx-module
      • 1)入门案例
      • 2)获取Nginx uri中的单一变量
      • 3)获取Nginx uri中的所有变量
    • 2、Nginx缓存
      • 1)Nginx全局共享内存缓存
      • 2)lua-resty-lrucache
      • 3)http_proxy 本地磁盘缓存
    • 4、lua-resty-redis
    • 5、redis2-nginx-module
  • 总结
    • 1、安装过程中,出现http://vault.centos.org/centos/7/extras/x86_64/repodata/repomd.xml: [Errno 14] HTTPS Error 404 - Not Found
    • 2、使用redis2-nginx-module的时候,写了set方法,url传了key和val的值,但val为空

一、Openresty下载安装

官方地址:http://openresty.org/cn/linux-packages.html
安装过程,参考官方,按照下面步骤执行即可,如下:

CentOS 8 或者更老版本
# add the yum repo:
wget https://openresty.org/package/centos/openresty.repo
sudo mv openresty.repo /etc/yum.repos.d/openresty.repo# update the yum index:
sudo yum check-update然后就可以像下面这样安装软件包,比如 openresty:
sudo yum install -y openresty如果你想安装命令行工具 resty,那么可以像下面这样安装 openresty-resty 包:
sudo yum install -y openresty-resty
命令行工具 opm 在 openresty-opm 包里,而 restydoc 工具在 openresty-doc 包里头。

默认安装目录:/usr/local/openresty

二、设置环境变量

  • 打开 ~/.bashrc 文件
    vi ~/.bashrc
  • 在文件末尾添加以下内容,保存并退出文件
    export PATH=/usr/local/openresty/nginx/sbin:$PATH
  • 使配置生效
    source ~/.bashrc

三、常用命令

  • 启动OpenResty:nginx 或 systemctl start openresty
  • 停止OpenResty:nginx -s stop 或 systemctl stop openresty
  • 重启OpenResty:systemctl restart openresty
  • 检查OpenResty配置文件语法:nginx -t
  • 查看OpenResty进程:ps -ef | grep nginx
  • 查看OpenResty版本:nginx -v
  • 查看OpenResty服务日志:sudo journalctl -u openresty
  • 设置开机启动:systemctl enable openresty
  • 重新加载配置文件:nginx -s reload 或 systemctl reload openresty 或 service openresty reload

四、入门案例

启动:systemctl start openresty
检查OpenResty的启动状态:systemctl status openresty
在这里插入图片描述

编辑配置文件vi /usr/local/openresty/nginx/conf/nginx.conf,清空其它内容,设置为下面内容,方便测试

worker_processes  1;
error_log logs/error.log;
events {worker_connections 1024;
}
http {server {listen 8080;location / {default_type text/html;content_by_lua_block {ngx.say("<p>hello, world</p>")}}}
}

重新加载配置:systemctl reload openresty
测试:curl http://localhost:8080/

[root@localhost ~]# curl http://localhost:8080/
<p>hello, world</p>

浏览器访问ip验证:http://yourIp:8080/
在这里插入图片描述

五、实践案例

接下来通过多个实践案例,来了解下可以实现啥功能

1、lua-nginx-module

1)入门案例

在/usr/local/openresty/nginx/conf/lua目录下,创建外部lua脚本hello.lua

ngx.say("<p>Hello, World!</p>")

在/usr/local/openresty/nginx/conf目录下,创建lua.conf

server {listen       80;server_name  localhost;location /lua {default_type text/html;content_by_lua_file /usr/local/openresty/nginx/conf/lua/hello.lua;}
}

在nginx.conf下引入lua配置,写在http模块中
在这里插入图片描述

重新加载配置,测试效果如下:

nginx -s reload
[root@localhost test]# curl http://localhost:80/lua
<p>Hello, World!</p>

2)获取Nginx uri中的单一变量

写在我们前面定义的server中即可,端口还是80

location /nginx_var {default_type text/html;content_by_lua_block {ngx.say(ngx.var.arg_name)}
}

测试效果如下,只能获取一个变量

[root@localhost test]# curl http://localhost:80/nginx_var?name=forlan
forlan
[root@localhost test]# curl http://localhost:80/nginx_var?name=forlan&id=1
[1] 15536

3)获取Nginx uri中的所有变量

写在我们前面定义的server中即可,端口还是80

location /nginx_var {default_type text/html;content_by_lua_block {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}
}

测试效果如下,可以正常获取多个变量
在这里插入图片描述

2、Nginx缓存

1)Nginx全局共享内存缓存

在Nginx配置中定义了一个共享字典,名为shared_data,大小为1MB,检查在共享字典中的变量i是否存在,如果不存在,就将其初始化为1,并存储到共享字典中。然后,将变量i的值增加1,并输出变量i的新值。这个过程是线程安全的,因为共享字典确保了在多进程环境中的数据一致性。

http {lua_shared_dict shared_data 1m;server {listen 8081;location /forlan {default_type text/html;content_by_lua_block {local shared_data = ngx.shared.shared_datalocal i = shared_data:get("i")if not i theni = 1shared_data:set("i", i)ngx.say("lazy set i ", i, "<br/>")endi = shared_data:incr("i", 1)ngx.say("i=", i, "<br/>")}}}
}

测试效果如下:
在这里插入图片描述

2)lua-resty-lrucache

Lua 实现的一个简单的 LRU 缓存,适合直接缓存较为复杂的 Lua 数据
相比 ngx_lua 共享内存字典可以省去较昂贵的序列化操作
相比 memcached 这样的外部服务又能省去较昂贵的 socket 操作

lrucache 有两种实现:

  • resty.lrucache:适合用来缓存命中率高或读远远大于写操作的缓存业务
  • resty.lrucache.pureffi:适合用来缓存命中率低或需要对key进行频繁增、删操作的缓存业务

下面我们以resty.lrucache来演示下:
  在/usr/local/openresty/nginx/conf/lua目录下,创建外部lua脚本mycache.lua

local lrucache = require("resty.lrucache")  
--创建一个新的LRU缓存实例,大小为200
local cache, err = lrucache.new(200)  
if not cache then  ngx.log(ngx.ERR, "create cache error : ", err)  
end  local function set(key, value, ttlInSeconds)  cache:set(key, value, ttlInSeconds)  
end  local function get(key)  return cache:get(key)  
end  local _M = {  set = set,  get = get  
}  
return _M

配置nginx.conf

worker_processes  1;
error_log logs/error.log;
events {worker_connections 1024;
}
http {lua_package_path "/usr/local/openresty/nginx/conf/lua/?.lua;;";server {listen 8081;location /forlan {default_type text/html;content_by_lua_block {local mycache = require("mycache")local count = mycache.get("count") or 0count = count + 1mycache.set("count", count, 10)ngx.say(mycache.get("count"))}}}
}

测试效果如下:不断累加,过了10s,缓存失效,从0开始
在这里插入图片描述

3)http_proxy 本地磁盘缓存

http {  # 启用代理缓存  proxy_cache on;  # 指定代理缓存目录  proxy_cache_path /path/to/your/cache/directory levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;  # 定义代理缓存区域  proxy_cache_key $scheme$proxy_host$request_uri;  # 配置哪些请求不参与代理缓存  proxy_no_cache $request_uri;  # 其他Nginx配置项...  
}

请确保将/path/to/your/cache/directory替换为你自己的实际磁盘缓存目录路径,并根据你的需求调整其他参数

4、lua-resty-redis

配置nginx.conf

server {listen 8082;location /forlan {default_type text/html;content_by_lua_block {local redis = require "resty.redis"  local red = redis:new()  local ok, err = red:connect("127.0.0.1", 6379) if not ok then  ngx.log(ngx.ERR, "failed to connect to Redis: ", err)  return ngx.exit(500)  end local ok, err = red:auth("root")  if not ok then  ngx.log(ngx.ERR, "failed to authenticate with Redis: ", err)  return ngx.exit(500)  endlocal res, err = red:get("forlan")ngx.say("res:",res)}}
}

重新加载配置,访问即可,如下,取到了Redis缓存的值

[root@localhost conf]# nginx -s reload
[root@localhost conf]# curl http://192.168.56.100:8082/forlan
res:xx

5、redis2-nginx-module

redis2-nginx-module是一个支持 Redis 2.0 协议的 Nginx upstream 模块,它可以让 Nginx 以非阻塞方式直接防问远方的 Redis 服务,同时支持 TCP 协议和 Unix Domain Socket 模式,并且可以启用强大的 Redis 连接池功能

提供一个set方法,通过url访问指定key和value,如:curl ”http://192.168.56.100:8082/set?key=forlan&val=2”

location = /set {
default_type text/html;redis2_pass 127.0.0.1:6379;redis2_query auth root;set_unescape_uri $key $arg_key;set_unescape_uri $val $arg_val;redis2_query set $key $val;
}

通过一个get方法,通过url访问获取key的值,如:curl “http://192.168.56.100:8082/get?key=forlan”

location = /get {
default_type text/html;redis2_pass 127.0.0.1:6379;redis2_query auth root;set_unescape_uri $key $arg_key;redis2_query get $key;
}

测试如下,试验成功

[root@localhost ~]# curl "http://192.168.56.100:8082/set?key=forlan&val=2"
+OK
+OK
[root@localhost ~]# curl "http://192.168.56.100:8082/get?key=forlan"
+OK
$1
2

很少使用这种的,因为复杂业务写起来很痛苦

总结

1、安装过程中,出现http://vault.centos.org/centos/7/extras/x86_64/repodata/repomd.xml: [Errno 14] HTTPS Error 404 - Not Found

进入目录:cd /etc/yum.repos.d
查看yum源:ll
重置:rm -f ${文件名}.repo

2、使用redis2-nginx-module的时候,写了set方法,url传了key和val的值,但val为空

location = /set {
default_type text/html;redis2_pass 127.0.0.1:6379;redis2_query auth root;set_unescape_uri $key $arg_key;set_unescape_uri $val $arg_val;redis2_query set $key $val;
}

上面这个配置这样写是没错的,错就错在访问的时候,我们使用了下面这种,忘记加了双引号,会导致val的值拿不到

curl http://192.168.56.100:8082/set?key=forlan&val=2

正确的访问方式应该是下面这种:

curl "http://192.168.56.100:8082/set?key=forlan&val=2"

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

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

相关文章

使用 MITRE ATTCK® 框架缓解网络安全威胁

什么是MITRE ATT&CK框架 MITRE Adversarial Tactics&#xff0c; Techniques&#xff0c; and Common Knowledge&#xff08;ATT&CK&#xff09;是一个威胁建模框架&#xff0c;用于对攻击者用来入侵企业、云和工业控制系统&#xff08;ICS&#xff09;并发起网络攻击…

《PFL》论文阅读笔记

一、概要 随着联邦学习的发展&#xff0c;简单的聚合算法已经不在有效。但复杂的聚合算法使得联邦学习训练时间出现新的瓶颈。本文提出了并行联邦学习&#xff08;parallel federated learning&#xff0c;PFL&#xff09;&#xff0c;通过调换中心节点聚合和广播的顺序。本文…

OpenHarmony亮相MTSC 2023 | 质量效率共进,赋能应用生态发展

11月25日&#xff0c;MTSC 2023第十二届中国互联网测试开发大会在深圳登喜路国际大酒店圆满举行。大会以“软件质量保障体系和测试研发技术交流”为主要目的&#xff0c;旨在为行业搭建一个深入探讨和交流的桥梁和平台。OpenAtom OpenHarmony&#xff08;简称“OpenHarmony”&a…

Spring Boot与Mybatis基础配置(手动写增删改查)

一、 配置 1.新建项目 1.项目基础配置 解释&#xff1a;记得把这个改成start.aliyun.com要不没有java8也就是jdk1.8 2.项目依赖配置 2.配置maven 配置前&#xff1a; 配置后&#xff1a; 3.创建子项目并配置父子项目pom.xml 配置父pom.xml 声明当前项目不是要打成jar包的…

反序列化漏洞详解(二)

目录 pop链前置知识&#xff0c;魔术方法触发规则 pop构造链解释&#xff08;开始烧脑了&#xff09; 字符串逃逸基础 字符减少 字符串逃逸基础 字符增加 实例获取flag 字符串增多逃逸 字符串减少逃逸 延续反序列化漏洞(一)的内容 pop链前置知识&#xff0c;魔术方法触…

学习UnitTest框架,轻松打造无懈可击的代码!

一、什么是UnitTest&#xff1f; 1、介绍 unittest是Python自带的一个单元测试框架&#xff0c;它可以做单元测试&#xff0c;也能用于编写和运行重复的测试工作。 它给自动化测试用例开发和执行提供了丰富的断言方法&#xff0c;判断测试用例是否通过&#xff0c;并最终生成…

纯js实现录屏并保存视频到本地的尝试

前言&#xff1a;先了解下&#xff1a;navigator.mediaDevices&#xff0c;mediaDevices 是 Navigator 只读属性&#xff0c;返回一个 MediaDevices 对象&#xff0c;该对象可提供对相机和麦克风等媒体输入设备的连接访问&#xff0c;也包括屏幕共享。 const media navigator…

python爬虫-某公开数据网站实例小记

注意&#xff01;&#xff01;&#xff01;&#xff01;某XX网站逆向实例仅作为学习案例&#xff0c;禁止其他个人以及团体做谋利用途&#xff01;&#xff01;&#xff01; 第一步&#xff1a;分析页面和请求方式 此网站没有技巧的加密&#xff0c;仅是需要携带cookie和请求…

万界星空科技灯具行业MES介绍

中国是LED照明产品最大的生产制造国&#xff0c;如今&#xff0c;我国初步形成了包括LED外延片的生产、LED芯片的制备、LED芯片的封装以及LED产品应用在内的较为完超为产业链&#xff0c;随着LED照明市场渗诱率的快速警升&#xff0c;LED下游应用市场将会越来越广阔。这也将推动…

智能优化算法应用:基于寄生捕食算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于寄生捕食算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于寄生捕食算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.寄生捕食算法4.实验参数设定5.算法结果6.参考…

3 测试驱动的Spring Boot应用程序开发数据层示例

文章目录 用户故事数据模型选择数据库SQL与NoSQLH2、Hibernate和JPA Spring Boot Data JPA依赖关系和自动配置Spring Data JPA技术栈数据源&#xff08;自动&#xff09;配置 实体存储库存储User和ChallengeAttempt显示最近的ChallengeAttempt服务层控制器层用户界面 小结 文章…

【JS】检索树结构,并返回结果节点的路径与子节点

【JS】检索树结构&#xff0c;并返回结果节点的路径与子节点 需求代码效果展示 需求 一个树结构&#xff0c;需要添加条件检索功能&#xff0c;检索结果依然是一个树结构&#xff0c;包含所有的符合要求的节点&#xff0c;以及他们到根节点的路径&#xff0c;与他们的子节点 …

vue项目运行时,报错:ValidationError: webpack Dev Server Invalid Options

在运行vue项目中&#xff0c;遇到报错&#xff1a;ValidationError: webpack Dev Server Invalid Options&#xff0c;如下图截图&#xff1a; 主要由于vue.config.js配置文件错误导致的&#xff0c;具体定位到proxy配置代理不能为空&#xff0c;导致运行项目报错&#xff0c;需…

版本控制系统Git学习笔记-Git基本知识介绍

目录 前言一、版本控制系统1.1 什么是版本控制系统1.2 本地版本控制系统1.3 集中化的版本控制系统1.3 分布式版本控制系统 二、Git简介2.1 数据处理方式2.2 几个特点2.2.1 几乎所有操作都是本地执行2.2.2 Git保证完整性2.2.3 Git一般只添加数据 2.3 Git中文件状态2.3.1 三种文件…

python networkx 网络展示的代码

1、创建一个无权重的图&#xff0c;并展示 edge_list.csv a,b,2 a,c,3 b,c,3 d,e,1 d,f,3 e,k,1 r,l,3 t,l,2import networkx as nx import matplotlib.pyplot as plt G nx.Graph() # 创建无向图 with open(edge_list.csv) as f:for line in f:edge line.strip().split(,)tr…

装修流程篇

装修流程 https://www.xiaohongshu.com/explore/627ba70d00000000210357b3 https://www.xiaohongshu.com/explore/63b6bc0c000000002203776f 半包装修流程 https://www.xiaohongshu.com/explore/64e5ea3b0000000003021711 户型图 效果 https://www.xiaohongshu.com/ex…

掌握大型语言模型(LLM)技术:推理优化

原文链接&#xff1a;Mastering LLM Techniques: Inference Optimization | NVIDIA Technical Blog 大模型相关技术文章已整理到Github仓库&#xff0c;欢迎start! 堆叠Transformer层以创建大型模型可以获得更好的准确性、few-shot学习能力&#xff0c;甚至在各种语言任务中具有…

三、Zookeeper数据模型

目录 1、Znode兼具文件和目录两种特点 2、Znode具有原子性操作

Ubuntu安装过程记录

软件准备 硬件 Acer电脑&#xff0c;AMD a6-440m芯片 64g优盘一个&#xff0c;实际就用了不到5g。 Ubuntu &#xff1a;官网 下载Ubuntu桌面系统 | Ubuntu 下载桌面版Ubuntu 22.04.3 LTS LTS属于稳定版 u盘系统盘制作软件 Rufus &#xff1a;Rufus - 轻松创建 USB 启动…

js模块化的应用!!!(前无古人,后无来者)

简介&#xff1a; 在 ES6 前&#xff0c; 实现模块化使用的是 RequireJS 或者 seaJS&#xff08;分别是基于 AMD 规范的模块化库&#xff0c; 和基于 CMD 规范的模块化库&#xff09;。 ES6 引入了模块化&#xff0c;其设计思想是在编译时就能确定模块的依赖关系&#xff0c…