OpenRestry-demo

2023-10-26

openRestry

基于Nginx和lua的高性能web平台内置了大量lua库和第三方的模块,为了使用lua开发一些定制功能;

安装环境

# 安装环境
yum -y install pcre-devel openssl-devel gcc curl
​
# 上传openresty-1.11.2.5.tar.gz
在资源目录下
# 解压
tar -xf openresty-1.11.2.5.tar.gz
   
# 进入到解压目录
cd openresty-1.11.2.5
​
# 安装
./configure --prefix=/usr/local/openresty \
--with-luajit \
--without-http_redis2_module \
--with-http_stub_status_module \
--with-http_v2_module \
--with-http_gzip_static_module \
--with-http_sub_module
​
# 编译
make
#安装
make install

配置环境变量:

# 修改环境文件
vi /etc/profile
​
# 修改为以下内容
export JAVA_HOME=/usr/local/jdk8
export OPENRESTY_HOME=/usr/local/openresty/nginx
export PATH=$JAVA_HOME/bin:$OPENRESTY_HOME/sbin:$PATH
​
# 使环境文件生效
source /etc/profile

创建存放详情页html的目录:

# 创建目录
mkdir -p /usr/local/server/web/items
​
# 把生成的静态页上传到目录中(真正上线是直接把静态页面生成到该目录)
​
# 修改Nginx配置文件
vi /usr/local/openresty/nginx/conf/nginx.conf
​
# 在配置文件中添加以下内容:
        location /items/ {
            root   /usr/local/server/web/;
        }
访问测试:

# 启动Nginx(只能启动一次,启动命令第二次执行会报错)
nginx
​
# 重载Nginx(重新加载最新的配置,相当于重启nginx)
nginx -s reload

配置404页面

为了提供更好的用户体验,我们可以在Nginx中统一配置404页面。

在这里提供两种404的配置方式,任选其一即可

首先需要准备一个404提示页面:

# 创建并编辑404页面
vim /usr/local/openresty/nginx/html/404.html
​
# 内容就是一个普通的html页面,例如以下内容:
​
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>商品下架</title>
</head>
<body>
<h3>该商品已下架</h3>
</body>
</html>

1 通用404页面配置

在nginx的 http->server 部分都生效

# 修改配置文件nginx.conf
vim /usr/local/openresty/nginx/conf/nginx.conf
​
# 在http配置中添加以下配置:
fastcgi_intercept_errors on;
​
# 在对应的server中添加以下配置
error_page  404              /404.html;
​
# 保存并退出nginx.conf的修改,nginx重载
nginx -s reload

2 指定路径404页面配置

如果希望404提示页面只对某一个请求路径生效,可以进行如下配置

# 修改配置文件nginx.conf
vim /usr/local/openresty/nginx/conf/nginx.conf
​
# 在server中添加404页面的请求信息
        location @np {
            rewrite ^/(.*)$     /404.html;
        }
​
​
# 在server的Location中添加 try_files属性
        location /items/ {
            root   /usr/local/server/web/;
            try_files $uri @np;
        }
        
# 保存并退出nginx.conf的修改,并执行nginx重载
nginx -s reload

2)插件配置

lua-restry-kafkahttps://github.com/doujiang24/lua-resty-kafka

unzip命令安装

yum install -y unzip
# 上传lua-resty-kafka-master.zip
在资源目录下
# 解压
unzip lua-resty-kafka-master.zip

# 移动到指定目录
mv lua-resty-kafka-master /usr/local/openresty/

# 修改nginx.conf
vi /usr/local/openresty/nginx/conf/nginx.conf

# 添加内容  在配置文件中指定lua-resty-kafka的库文件位置
# 配置到http里面,和server平级
lua_package_path "/usr/local/openresty/lua-resty-kafka-master/lib/?.lua;;";

配置效果如下:

http {
    ......
    
    #gzip  on;

    #添加内容  在配置文件中指定lua-resty-kafka的库文件位置
    lua_package_path "/usr/local/openresty/lua-resty-kafka-master/lib/?.lua;;";

    server {
        listen       80;
        server_name  localhost;   
        
    ......
}

3)配置请求 指向lua脚本

创建一个lua脚本,items-access.lua

编写测试内容:

ngx.say("test")
ngx.exit(200)

配置文件修改

# lua插件位置
lua_package_path "/usr/local/openresty/lua-resty-kafka-master/lib/?.lua;;";

server {
    listen       80;
    server_name  localhost;

    location /web/items/ {
        #向kafka发送日志记录,处理请求路径,把/web去掉
        content_by_lua_file /usr/local/openresty/nginx/lua/items-		           access.lua;
    }

    location /items/ {
        root   /usr/local/server/web;
    }

    location / {
        root   html;
        index  index.html index.htm;
    }

}

lua脚本写法  

--引入json解析库
local cjson = require("cjson")
--kafka依赖库
local client = require "resty.kafka.client"
local producer = require "resty.kafka.producer"

--配置kafka的服务地址
local broker_list = {
	{ host = "192.168.200.188", port = 9092 }
}

--创建kafka生产者
local pro = producer:new(broker_list,{ producer_type="async"})

--获取IP
local headers=ngx.req.get_headers()
local ip=headers["X-REAL-IP"] or headers["X_FORWARDED_FOR"] or ngx.var.remote_addr or "0.0.0.0"

--定义消息内容
local msg = {}
msg["ip"]=ip
msg["actime"]=os.date("%Y-%m-%d %H:%M:%S")
msg["uri"]=ngx.var.uri
msg["token"]="Bearer ITHEIMA"

--发送异步消息,无论消息是否发送成功,都会执行后面的逻辑
local offset, err = pro:send("logsitems", nil, cjson.encode(msg))

--请求转发到/items/,给用户提供html静态页
local uri = ngx.var.uri
uri = string.gsub(uri,"/web","")
ngx.exec(uri)

Lua脚本的时间获取

local getTime = os.date("%c");

其中的%c可以是以下的一种:(注意大小写)

格式 输出内容
%a abbreviated weekday name (e.g., Wed)
%A full weekday name (e.g., Wednesday)
%b abbreviated month name (e.g., Sep)
%B full month name (e.g., September)
%c date and time (e.g., 09/16/98 23:48:10)
%d day of the month (16) [01-31]
%H hour, using a 24-hour clock (23) [00-23]
%I hour, using a 12-hour clock (11) [01-12]
%M minute (48) [00-59]
%m month (09) [01-12]
%p either "am" or "pm" (pm)
%S second (10) [00-61]
%w weekday (3) [0-6 = Sunday-Saturday]
%x date (e.g., 09/16/98)
%X time (e.g., 23:48:10)
%Y full year (1998)
%y two-digit year (98) [00-99]
%% the character '%'

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenRestry-demo 的相关文章

  • 学习 Java Native Access 时出现 com.sun.glass.ui 包错误

    我正在尝试在 JavaFX 项目中使用 Undecorated 阶段 stage initStyle StageStyle UNDECORATED 它是一个模块化的 Gradle 项目 它也是一个多项目构建 https guides gra
  • GSON - JsonSyntaxException - 第 7 行第 4 列的预期名称

    我有以下结果类 其对象将以 JSON 形式返回 public class Result public String objectid public String dtype public String type public String
  • Docker容器CPU使用率监控

    根据 docker 的文档 我们可以通过以下方式获取 docker 容器的 CPU 使用率码头工人统计命令 CPU 列将给出容器正在使用的主机 CPU 的百分比 假设我限制容器使用 50 的主机单个 CPU 我可以通过 cpus 0 5 选
  • HSQLDB - 这是主数据库文件

    我在嵌入模式下使用 HSQLDB jdbc hsqldb file abc TESTDB 创建数据库后 文件夹abc有以下文件 TESTDB lck TESTDB script TESTDB log TESTDB properties 我的
  • 正则表达式删除2个字符串之间的所有内容

    我的replaceAll 需要一个正则表达式来删除2 个字符串和字符串本身之间的所有内容 例如 如果我有类似的东西 stackoverflow is really awesome nremove123 n I love it 我试图做一个像
  • Android MediaCodec 在异步模式下比同步模式下慢?

    再次 我有一个关于 Android 的 MediaCodec 类的问题 我已成功解码原始 h264 内容并将结果显示在两个纹理视图中 h264 流来自运行 openGL 场景的服务器 该场景有一个摄像头 因此可以响应用户输入 为了进一步减少
  • 如何使用 RestTemplate 禁用编码

    我正在使用 REST 模板有意在请求 uri 中发送 例如 items a b String responseEntity restTemplate exchange items a b requestObj getHttpMethod r
  • Hibernate 验证器:违规消息语言

    我有一个测试类 我正在测试一个域模型 该模型用例如注释 NotNull 在我的测试课中 我首先得到验证器 private static Validator validator BeforeClass public static void s
  • Java 数组返回奇怪的输出[重复]

    这个问题在这里已经有答案了 我正在为家庭作业问题创建一个方法 该方法返回数组中的最高值 我正在使用一个 for循环将数字输入到数组中 输入代码如下所示 int array new int n for i 0 i
  • Spring - 捕获bean创建异常

    我想在我的代码中捕获 bean 实例化异常 我有什么选择 一种方法是使用基于 Java 的容器配置 Configuration public class AppConfig Bean public SomeBean someBean try
  • 从已排序的 ArrayList 中删除重复项,同时保留重复项中的某些元素

    好吧 一开始我以为这会很简单 但我想不出有效的方法来解决这个问题 我想出了一种蛮力的方法来解决这个问题 但这不是很优雅 我有一个数组列表 Contacts 是一个 VO 类 有多个成员 名称 区域 id ArrayList中存在重复项 因为
  • indexoutofboundException :setSpan (2...2) 结束长度超出长度 1

    I ve a MultiAutoCompleteTextView当用户按空格键时 我在其中创建芯片文本的自定义控件 我不希望用户在文本框为空时最初输入空格 所以我放了一个inputFilter以防止用户最初放置空格 这是过滤器代码 priv
  • java.lang.NoSuchFieldError:APPLICATION_CONTEXT_ID_PREFIX

    我在运行项目时收到此错误 最终结果为 404 该项目是在Spring框架上进行的 我读了很多帖子 发现要么是混合了罐子 要么是多余的罐子 接下来我尝试整理我的罐子 以下列表是我的构建路径中的内容 antlr 2 7 6 jar asm ja
  • Keycloak - 自定义表单操作在流程中不可见

    我正在尝试为用户注册实现自定义表单操作 我在表单上添加了一些自定义字段 我希望验证这些字段 在浏览了 keycloak 文档后 我意识到我需要 扩展 FormAction FormActionFactory 将actionfactory打包
  • 预期类型:java.lang.Integer,实际值:org.hibernate.id.IdentifierGeneratorHelper$2

    当我尝试调用 save 方法时 我的代码中出现此错误 当我在 JBoss 服务器上时 此方法工作正常 现在我转到 tomcat 服务器 7 ERROR HHH000123 IllegalArgumentException in class
  • 如何动态更新属性文件?

    我的应用程序是一个批处理过程 它从 application properties 文件中提取环境变量 我使用的密码必须每隔几个月更新一次 我想自动化密码更新过程并将更新后的密码保存在属性文件中 以便在将来的运行中使用 但我尝试进行的任何更新
  • Java Marine API - 寻找 NMEA 数据

    我的最终目标是从 Adafruit Ultimate GPS NMEA 0183 标准 接收纬度和经度 GPS 信息到我的 Java 应用程序 我正在使用 Java Marine API 来执行此操作 然后 当前位置将与时间戳一起写入数据库
  • 在java中读取文本文件[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 当每行都包含整数 字符串和双精度数时 如何在 Java 中读取 txt 文件并将每一行放入数组中 每行都有不同数量的单词 数字 Try
  • 使用 Android API 发布推文

    我一直在寻找一种使用 Android 应用程序发布推文的方法 但我发现的所有方法都不起作用 我不得不承认 Twitter 的 API 并不是那么容易理解 但是我的代码并不长 而且我看不出我的错误在哪里 这是我的代码 public class
  • Java Webstart 和 URLConnection 缓存 API

    的描述URLConnection 缓存 API http docs oracle com javase 6 docs technotes guides net http cache html最后一句指出 Java 2 标准版中没有 URLC

随机推荐

  • 【docker系列】使用非root用户安装及启动docker(rootless模式运行)

    通过我之前的文章已经可以验证 在root用户下安装启动的容器存在安全问题 究其原因是因为 容器内的root用户就是宿主机的root用户 容器内uid 1000的用户就是宿主机uid 1000的用户 docker的守护进程是root权限的 既
  • 华为2014校园招聘笔试,围棋吃子判断

    题目大意 一个围棋盘的位置总共有三种状态 分别为空 白棋 黑棋 分别用0 1 2来表示 每一个位置都有上下左右四个邻居 当其邻居中有一个空格 则说明这个位置的棋子有气 当然 气是可以传递的 即只要一颗棋子它周围有气 则所有与该棋子相连的相同
  • 反激变换器DCM模式增益推导

    针对反激变换器的DCM 电感电流断续模式 的增益进行推导 主要原理为电感的伏秒平衡和电容的安秒平衡原理 反激变换器的原理图如下 根据电容的安秒平衡原理可知 输出电容C在一个周期内的平均电流为0 故输出侧电流i2的平均值等于负载电流平均值 式
  • 如何制定性能测试计划

    如何制定一份性能测试计划 考虑以下几个方面 1 明确测试目标和范围 确定要测试的系统 应用程序或网站 并明确测试的目标和范围 例如测试响应时间 吞吐量 并发用户数等 2 确定测试环境 选择适当的测试环境 包括硬件 软件 网络等 以确保测试结
  • Intrinsics头文件与SIMD指令集、Visual Studio版本对应表

    Intrinsics头文件与SIMD指令集 Visual Studio版本对应表 File Intrinsics头文件 描述 指令集描述 VS Visual Studio版本号 VisualStudio Visual Studio版本名 F
  • 微信小程序上传图片到阿里云OSS,读取上传后oss后的图片

    一 config js var fileHost xxxx aliyuncs com 你的阿里云oss地址 var config aliyun OSS config uploadImageUrl fileHost 默认存在根目录 可根据需求
  • Static Timing Analysis for Nanometer Designs A Practical Approach

    分享电子书籍 静态时序分析圣经 Static Timing Analysis for Nanometer Designs A Practical Approach 1 setup time Setup time 建立时间 是数据信号 D 在
  • 小程序 - 日期选择器

    效果图 实现步骤 1 创建组件 wxml
  • Unity3D控制Animator播放

    有一个需求 要求第一次打开一个界面触发一个动画播放 关闭界面动画播放关闭 再次打开界面继续上次到播放而不是重新开始播放 如果动画播放结束关闭打开界面入口 即无法在此进入该界面 有两种实现方法 方法1 第一次打开界面开始播放特效动画 调用an
  • AI—漂亮的花简单制作(含详细教程)

    暑假在家刷短视频 不 不 不 球球 别别别 平面制作搞起来 跟数媒小可爱学炒鸡有意思的AI吧 今天带来的是一朵漂亮的花 gt 效果图入下 步骤一 用 星形 工具 gt 角点数 为25 如图 gt 确定 步骤二 按住ALT键 复制一个星形 缩
  • 再也不用担心网吧开黑队友听不清了!降噪解决方案了解一下?

    欢迎大家前往腾讯云 社区 获取更多腾讯海量技术实践干货哦 本文由腾讯游戏云发表于云 社区专栏 经常逛游戏论坛的朋友会深有感触 很多玩家经常会在论坛里吐槽在网吧开黑的体验很差 噪音太多 在游戏语音开黑的过程中 如果其中一个队友身处网吧 则其他
  • chronyc sources -V

    Chrony 是一个时钟同步工具 而 chronyc sources V 是它的命令行参数 用于显示当前时钟源的详细信息 使用这个参数后 会输出当前时钟源的信息 包括 源类型 IP 地址 可用性 偏差和误差等 通过这些信息 可以了解时钟源的
  • Linux 编译运行查找头文件和库的顺序

    linux中在使用gcc进行编译时 可能会出现找不到相应库或头文件的情况 往往让人十分头疼 因此 此文描述了库和头文件的查找顺序和一些注意事项 希望能帮助大家在出错时能够快速定位和解决 头文件 gcc在编译时按照如下顺序寻找所需要的头文件
  • set,env和export的区别

    http blog csdn net longxibendi article details 6125075 http blog chinaunix net uid 128922 id 289956 html set 显示 设置 shell
  • JSP编程手记------jsp页url中传中文参数乱码问题续

    一个偶然的机会 发现了一个解决jsp页url中传中文参数乱码的方法 比我前面说的用隐形的form表单来的更加漂亮和容易 具体方法如下 程序清单 response sendRedirect gh 0001 xm java net URLEnc
  • Qt手动设置Kits套件

    Qt编译器版本手动设置方式 文章目录 Qt编译器版本手动设置方式 前言 一 安装MSVC2019 32bit 二 手动设置kits套件 总结 前言 在给Qt Creator添加自定义控件时 遇到的版本问题让人头疼 我用的Qt5 12 10
  • 那一年读过的技术经典书

    转载请注明 http blog csdn net xinzhangyanxiang article details 10199757 大学刚毕业 总结起来读过的书并不算多 而且主要集中在大四的时期读的 在此把经典统一总结一遍 先总结机器学习
  • Qt信号和信号槽(二)

    目录 信号槽使用拓展 示例1 一个信号可以对应多个槽函数 在上篇文章的代码中进行修改 示例2 用信号连接信号 信号槽的连接方式 示例 Lambda表达式 语法格式 定义和调用 信号槽使用拓展 一个信号可以连接多个槽函数 发送一个信号有多个处
  • SpringBoot使用quartz, 注入feignClient, client为null

    使用 autowired 活着构造方法注入 打断点查看注入的feigncliet为null 搜索网上的一些博客 大致原因是因为quartz启动是通过反射将一些类注入进来 启动的时候引用这个类还没初始化好 下面是解决方案 使用spring 提
  • OpenRestry-demo

    openRestry 基于Nginx和lua的高性能web平台内置了大量lua库和第三方的模块 为了使用lua开发一些定制功能 安装环境 安装环境 yum y install pcre devel openssl devel gcc cur