Nginx使用Lua脚本连接Redis验证身份并下载文件
安装Nginx
下载
# 进入下载目录
cd /root/software
# 下载
wget http://nginx.org/download/nginx-1.18.0.tar.gz
解压安装包
# 进入安装目录
cd /root/program/
# 创建目录
mkdir nginx
cd nginx/
# 复制文件
cp /root/software/nginx-1.18.0.tar.gz .
# 解压文件
tar -zxvf nginx-1.18.0.tar.gz
安装依赖
# 安装gcc,nginx底层采用c++编写,因此需要gcc环境进行编译
yum install gcc-c++
# 安装pcre,一个Perl库,包括perl兼容的正则表达式,nginx的http模块使用pcre来解析正则表达式
yum install pcre pcre-devel
# 安装zlib,zlib库提供了多种压缩和解压缩方式,nginx使用zlib对http包的内容进行gzip
yum install zlib zlib-devel
# 安装openssl,openssl是一个强大的安全套接字层密码库,囊括了主要的密码算法、常用的秘钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用
yum install openssl openssl-devel
安装
# 进入安装目录
cd /root/program/nginx
# 创建安装目录
mkdir nginx
# 指定安装目录编译
cd /root/program/nginx/nginx-1.18.0
./configure --prefix=/root/program/nginx/nginx
# 编译
cd /root/program/nginx/nginx-1.18.0
make
# 安装
cd /root/program/nginx/nginx-1.18.0
make install
# 确认安装后文件,只是生成了启动文件,并没有启动
cd /root/program/nginx/nginx
ll
启动
# 进入目录
cd /root/program/nginx/nginx/sbin
# 创建软连接
ln -s /root/program/nginx/nginx/sbin/nginx /usr/bin/nginx
# 启动
nginx
修改后配置文件如下:
# 启动用户
user root;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
测试访问
# 地址
http://192.168.110.129/
安装LuaJIT
LuaJIT,即Lua及时编译器。
# 进入软件下载目录
cd /root/software
# 下载
wget https://luajit.org/download/LuaJIT-2.0.5.tar.gz
# 创建安装目录
cd /root/program/
mkdir LuaJIT
cd LuaJIT
# 解压
cp /root/software/LuaJIT-2.0.5.tar.gz .
tar xf LuaJIT-2.0.5.tar.gz
cd LuaJIT-2.0.5
# 编译并安装
make && make install
# 建立软连接,如果不建立软链接,则会出现share object错误
ln -s /usr/local/lib/libluajit-5.1.so.2 /lib64/libluajit-5.1.so.2
# 验证软连接
ll libluajit-5.1.so.2
# 加载lua库,加入到ld.so.conf文件
echo "/usr/local/LuaJIT/lib" >> /etc/ld.so.conf
安装ngx_devel_kit
# 进入软件下载目录
cd /root/software
mkdir ngx_devel_kit
cd ngx_devel_kit
# 下载
wget https://github.com/simpl/ngx_devel_kit/archive/v0.2.19.tar.gz
# 创建安装目录
cd /root/program/
mkdir ngx_devel_kit
cd ngx_devel_kit
# 解压
cp /root/software/ngx_devel_kit/v0.2.19.tar.gz .
tar xf v0.2.19.tar.gz
安装lua-nginx-module
# 进入软件下载目录
cd /root/software
mkdir lua-nginx-module
cd lua-nginx-module
# 下载
wget https://github.com/openresty/lua-nginx-module/archive/v0.10.13.tar.gz
# 创建安装目录
cd /root/program/
mkdir lua-nginx-module
cd lua-nginx-module
# 解压
cp /root/software/lua-nginx-module/v0.10.13.tar.gz .
tar xf v0.10.13.tar.gz
在已安装的Nginx中添加Lua模块
# 进入源码目录
cd /root/program/nginx/nginx-1.18.0
# 查看编译参数
nginx -V
# 构造已运行的Nginx的模块模块
./configure --prefix=/root/program/nginx/nginx
# 构造新的Nginx模块参数,注意根据实际情况修改目录地址
./configure --prefix=/root/program/nginx/nginx **新增模块配置,运行时删除** --add-module=/root/program/ngx_devel_kit/ngx_devel_kit-0.2.19/ --add-module=/root/program/lua-nginx-module/lua-nginx-module-0.10.13/
# 重新编译Nginx,make完成后不要继续输入“make install”,以免现在的nginx出现问题
make
# 以上完成后,会在objs目录下生成一个nginx文件
cd objs
./nginx -V
# 替换Nginx文件
mv /root/program/nginx/nginx/sbin/nginx /root/program/nginx/nginx/sbin/nginx.bak
cp nginx /root/program/nginx/nginx/sbin/
# 重新启动,重要,一定要停机后重新启动
nginx -s quit
ps -ef | grep nginx
nginx
ps -ef | grep nginx
Lua脚本测试
编写lua脚本
# 进入配置文件目录
cd /root/program/nginx/nginx/conf
# 创建脚本文件
vim test.lua
# 脚本内容
ngx.say("hello world.");
修改nginx.conf
# 在Server节点下添加下面的内置内容:
# 中文
charset utf-8;
location /lua {
default_type 'text/html';
lua_code_cache off;
content_by_lua_file conf/test.lua;
}
# 文件下载服务
location /file_server {
# 内部请求(即一次请求的Nginx内部请求),禁止外部访问,重要。
internal;
# 文件路径
alias /root/data/files/;
limit_rate 200k;
# 浏览器访问返回200,然后转由后台处理
#error_page 404 =200;
}
###########################################################################
# 验证配置文件
nginx -t
# 重新加载配置文件
nginx -s reload
# 测试访问
http://192.168.110.129/lua
https://blog.csdn.net/yinjinshui/article/details/109738580
连接单例Redis
下载第三方依赖库
# Git地址
https://github.com/openresty/lua-resty-redis
复制第三方依赖库
# 进入系统第三方包目录
cd /usr/local/lib
# 将解压后的文件上传至该目录
# 目录名称:lua-resty-redis-master
# 包文件路径
cd /usr/local/lib/lua-resty-redis-master/lib/resty
在nginx配置文件中添加依赖
# 进入目录
cd /root/program/nginx/nginx/conf/
# 修改配置文件
vim nginx.conf
# 在http节点下添加下面配置,具体目录地址视具体服务器调整
# you do not need the following line if you are using
# the OpenResty bundle:
lua_package_path "/usr/local/lib/lua-resty-redis-master/lib/resty/?.lua;;";
编写脚本文件
# 进入脚本文件目录
cd /root/program/nginx/nginx/conf
# 修改脚本
vim test.lua
# 脚本内容如下所示:
local redis = require "resty.redis"
--local cjson = require "cjson"
local red = redis:new()
-- 从header中取值
--local token = ngx.req.get_headers()[“token”];
local args = ngx.req.get_uri_args();
-- 获取参数
local userid = args.userid;
local showlength = args.showlength;
red:set_timeouts(1000, 1000, 1000) -- 1 sec
local ok, err = red:connect("10.120.160.110", 6379)
if not ok then
ngx.say("failed to connect: ", err)
return
end
local redis_key = "Navigation:"..userid;
local res, err = red:get(redis_key)
if not res then
ngx.say("failed to get: ", err)
return
end
if res == ngx.null then
ngx.say("<b>not found.</b>")
return
end
--ngx.say("<b>[Navigation:"..userid.."]: </b>", string.sub(res,1,showlength), "<br/>")
-- 请求文件
res = ngx.location.capture("/file_server/1.zip");
if res.status ~= 200 then
ngx.print("Not found file.");
return;
end
-- 下载文件
ngx.header["Content-Disposition"] = "attachment; filename=1.zip";
ngx.header["Content-Type"] ="application/x-zip-compressed";
ngx.print(res.body);
执行
# 检查nginx配置
nginx -t
# 重新加载配置
nginx -s reload
# 浏览器中输入测试地址
http://192.168.110.129/lua?userid=10076&showlength=500
# 请求后可以直接下载文件。
连接Redis集群
下载第三方依赖库
# Redis集群连接库依赖连接Redis单实例连接库[resty.redis],因此需要提前安装此第三方依赖库
# resty-redis-cluster
https://github.com/steve0511/resty-redis-cluster
# lua-resty-lock
https://gitee.com/mirrors_bungle/lua-resty-lock/tree/master
复制第三方依赖库
# 进入系统第三方包目录
cd /usr/local/lib
# 将解压后的文件上传至该目录
# 目录名称:resty-redis-cluster-master
# 包文件路径
cd /usr/local/lib/resty-redis-cluster-master/lib/resty
cd /usr/local/lib/lua-resty-lock/lib/resty
在nginx配置文件中添加依赖
# 进入目录
cd /root/program/nginx/nginx/conf/
# 修改配置文件
vim nginx.conf
# 修改内容如下,具体视需求而定
# 在http节点下添加下面配置,具体目录地址视具体服务器调整
lua_package_path "/usr/local/lib/lua-resty-redis-master/lib/?.lua;;;/usr/local/lib/lua-resty-lock/lib/resty/?.lua;;;/usr/local/lib/resty-redis-cluster-master/lib/?.lua;;;/usr/local/lib/resty-redis-cluster-master/lib/resty/?.lua;;";
# 添加缓存配置
lua_shared_dict redis_cluster_slot_locks 100k;
# 在Server节点下添加下面的内置内容:
# 中文
charset utf-8;
location /lua/cluster/ {
default_type 'text/html';
lua_code_cache off;
content_by_lua_file conf/test_cluster.lua;
}
# 文件下载服务
location /file_server {
# 内部请求(即一次请求的Nginx内部请求),禁止外部访问,重要。
internal;
# 文件路径
alias /root/data/files/;
limit_rate 200k;
# 浏览器访问返回200,然后转由后台处理
#error_page 404 =200;
}
# 验证配置文件
nginx -t
# 重新生效配置文件
nginx -s reload
编写脚本文件
# 进入脚本文件目录
cd /root/program/nginx/nginx/conf
# 修改脚本
vim test_cluster.lua
# 脚本内容如下所示:
-- 获取请求信息
local request_uri = ngx.var.request_uri;
local args = ngx.req.get_uri_args();
-- 获取参数
local key = args.key;
local internal_file_name = args.filename;
local file_type = request_uri:match(".+%.(%w+)");
local config = {
name = "testCluster", --rediscluster name
serv_list = { --redis cluster node list(host and port),
{ ip = "10.120.160.110", port = 7000 },
{ ip = "10.120.160.114", port = 7000 },
{ ip = "10.120.68.96", port = 7000 },
{ ip = "10.120.160.110", port = 7001 },
{ ip = "10.120.160.114", port = 7001 },
{ ip = "10.120.68.96", port = 7001 }
},
keepalive_timeout = 60000, --redis connection pool idle timeout
keepalive_cons = 1000, --redis connection pool size
connect_timeout = 1000, --timeout while connecting
read_timeout = 1000, --timeout while reading
send_timeout = 1000, --timeout while sending
max_redirection = 5, --maximum retry attempts for redirection
max_connection_attempts = 1, --maximum retry attempts for connection
auth = "***************" --set password while setting auth
}
local redis_cluster = require "rediscluster"
local red_c = redis_cluster:new(config)
local redis_key = key;
local res, err = red_c:get(redis_key)
if err or (not res) or (res == ngx.null) then
ngx.exit(401);
return;
end
return ngx.exec("/file_server/"..internal_file_name.."."..file_type);
执行
# 检查nginx配置
nginx -t
# 重新加载配置
nginx -s reload
# 浏览器中输入测试地址
http://192.168.110.129/lua/cluster/张三.zip?key=name&filename=1
http://192.168.110.129/lua/cluster/test01.docx?key=name&filename=test
# 请求后可以直接下载文件。
附录-nginx.conf配置文件
user root;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
# you do not need the following line if you are using
# # the OpenResty bundle:
lua_package_path "/usr/local/lib/lua-resty-redis-master/lib/?.lua;;;/usr/local/lib/lua-resty-lock/lib/?.lua;;;/usr/local/lib/resty-redis-cluster-master/lib/?.lua;;;/usr/local/lib/resty-redis-cluster-master/lib/resty/?.lua;;";
# 添加缓存配置
lua_shared_dict redis_cluster_slot_locks 100k;
server {
listen 80;
server_name localhost;
# 中文
charset utf-8;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
location /lua {
default_type 'text/html';
lua_code_cache off;
content_by_lua_file conf/test.lua;
}
location /lua/cluster {
default_type 'text/html';
lua_code_cache off;
content_by_lua_file conf/test_cluster.lua;
}
# 文件下载服务
location /file_server {
# 内部请求(即一次请求的Nginx内部请求),禁止外部访问,重要。
internal;
lua_code_cache off;
alias /root/data/files/;
limit_rate 1024k;
add_header Cache-Control no-store; # 禁止浏览器缓存文件
# 浏览器访问返回200,然后转由后台处理
#error_page 404 =200;
}
# 文件下载服务
location /test_file_server {
# 内部请求(即一次请求的Nginx内部请求),禁止外部访问,重要。
#internal;
lua_code_cache off;
set $filepath "";
# 文件路径
content_by_lua_file conf/test_file_server.lua;
#return 200 $filepath;
#try_files $filepath $filepath/;
}
# 文件下载服务
location /test_find_file {
# 内部请求(即一次请求的Nginx内部请求),禁止外部访问,重要。
internal;
lua_code_cache off;
alias /root/data/files/;
limit_rate 200k;
# 浏览器访问返回200,然后转由后台处理
#error_page 404 =200;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
Nginx使用Lua脚本连接Redis验证身份并下载文件的更多相关文章
- nginx插入lua脚本访问redis
目标:收集用户日志 流程: 浏览器端get方法将数据传到nginx服务 nginx收集到数据,执行内嵌lua脚本,访问redis,根据token获得用户id 将日志信息存入文件 1.nginx安装,参 ...
- Lua脚本在Redis事务中的应用实践
使用过Redis事务的应该清楚,Redis事务实现是通过打包多条命令,单独的隔离操作,事务中的所有命令都会按顺序地执行.事务在执行的过程中,不会被其他客户端发送来的命令请求所打断.事务中的命令要么全部 ...
- Lua脚本在redis分布式锁场景的运用
目录 锁和分布式锁 锁是什么? 为什么需要锁? Java中的锁 分布式锁 redis 如何实现加锁 锁超时 retry redis 如何释放锁 不该释放的锁 通过Lua脚本实现锁释放 用redis做分 ...
- 运维实践-最新Nginx二进制构建编译lua-nginx-module动态链接Lua脚本访问Redis数据库读取静态资源隐式展现
关注「WeiyiGeek」公众号 设为「特别关注」每天带你玩转网络安全运维.应用开发.物联网IOT学习! 希望各位看友[关注.点赞.评论.收藏.投币],助力每一个梦想. 本章目录 目录 0x0n 前言 ...
- c#中用lua脚本执行redis命令
直接贴出代码,实现执行lua脚本的方法,用到的第三方类库是 StackExchange.Redis(nuget上有) 注:下面的代码是简化后的,实际使用要修改, using System; using ...
- Redis进阶之使用Lua脚本自定义Redis命令
[本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] 1.在Redis ...
- 使用Lua 脚本实现redis 分布式锁,报错:ERR Error running script (call to f_8ea1e266485534d17ddba5af05c1b61273c30467): @user_script:10: @user_script: 10: Lua redis() command arguments must be strings or integers .
在使用SpringBoot开发时,使用RedisTemplate执行 redisTemplate.execute(lockScript, redisList); 发现报错: ERR Error run ...
- 使用nginx+lua脚本读写redis缓存
配置 新建spring boot项目增加redis配置 <dependency> <groupId>org.springframework.boot</groupId&g ...
- paramiko连接远程主机,上传下载文件
Paramiko是基于SSHv2协议实现的一个Python模块,提供客户端和服务器的功能.Paramiko本身是一个围绕SSH网络概念的纯Python接口. Client: # 创建一个SSH连接对象 ...
- 使用脚本在FTP上传、下载文件
由于最近勒索病毒变种又一次爆发,公司内部封锁了TCP 445端口.导致原来通过文件共享的方式上传下载的计划任务无法执行.所以,我开设了FTP服务器来完成这个工作. 关于如何建立FTP服务器,请看这里 ...
随机推荐
- Oracle AUD审计 找出锁定用户的客户端IP
问题描述:运用AUD审计找出锁定用户的客户端IP 1.查询被锁用户 SELECT USERNAME, ACCOUNT_STATUS, LOCK_DATE FROM DBA_USERS WHERE AC ...
- Terraform 系列-Terraform 简介
系列文章 Terraform 系列文章 前言 最近在使用 Terraform 来置备 OCI 的 Always Free Tier, 发现它非常好用.总结学习下:Terraform 的基础知识. 什么 ...
- 前后端分离 nginx 的配置
前端 nginx # 添加头部信息 proxy_send_timeout 30; # 后端服务器连接超时时间 proxy_read_timeout 30; # 后端服务器数据回传时间 proxy_co ...
- 【机器学习与深度学习理论要点】11.什么是L1、L2正则化?
机器学习中几乎都可以看到损失函数后面会添加一个额外项,常用的额外项一般有两种,一般英文称作 L1-norm 和L2-norm,中文称作 L1正则化 和 L2正则化,或者 L1范数 和 L2范数.L1正 ...
- 命令行编译和执行java代码
虽然现在IDE很强大又很智能,但是平常随意写点练手的代码的时候,直接在命令行中使用vim和java命令更为方便快捷,可以做到无鼠标纯键盘的操作. 首先保证将java相关指令添加到了环境变量中: 1.编 ...
- CUDA 的随机数算法 API
参考自 Nvidia cuRand 官方 API 文档 一.具体使用场景 如下是是在 dropout 优化中手写的 uniform_random 的 Kernel: #include <cuda ...
- Linux中重定向应注意的事情
引言 你是否见过bash ... 2>&1 1>file.txt的写法? 还没发现这样的写法有什么问题? 那么恭喜你, 看完本文你又将学会一个新知识! 重定向的错误用法 以引言中命 ...
- Unity快速接入bugly, 支持Unity2021
鹅厂提供的bugly官方demo工程打包后台也查不到日志,N年不更新(官方已经说不再维护),为此本人做了部分修改测试,提供一个快速接入工程的demo. Unity2021因为版本原因腾讯官方工程不能使 ...
- 2022-11-04:给定一个正数n,表示有多少个节点 给定一个二维数组edges,表示所有无向边 edges[i] = {a, b} 表示a到b有一条无向边 edges一定表示的是一个无环无向图,也
2022-11-04:给定一个正数n,表示有多少个节点 给定一个二维数组edges,表示所有无向边 edges[i] = {a, b} 表示a到b有一条无向边 edges一定表示的是一个无环无向图,也 ...
- 2021-10-23:位1的个数。编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1‘ 的个数(也被称为汉明重量)。提示:请注意,在某些语言(如 Java)中
2021-10-23:位1的个数.编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量).提示:请注意,在某些语言(如 Java)中 ...