目录
一、实验
1.环境
2.Windows 安装 Termius
3.Linux 部署 OpenResty
4.Linux 使用 OpenResty 实现内容展示(content_by_lua)
5.Linux 使用 OpenResty 实现重定向 (rewrite_by_lua)
6.Linux 使用 OpenResty 实现请求体(body_filter_by_lua)
7.Linux 部署 Redis
8.Linux 使用 OpenResty 实现黑名单(access_by_lua)
9.Linux 使用 OpenResty 实现定时器(init_worker_by_lua)
二、问题
1.安装OpenResty报错
2.如何启动、关闭、重启 OpenResty
3.OpenResty启动报错
4.OpenResty运行原理
一、实验
1.环境
(1)主机
表1 主机
系统 | 版本 | IP | 备注 |
CentOS | 7.9 | 192.168.204.200 | 高性能web网关OpenResty |
(2)查看系统版本
cat /etc/os-release
2.Windows 安装 Termius
(1) 查阅
https://www.termius.com/download/windows
(2) 添加主机
完成
3.Linux 部署 OpenResty
(1)查阅
1)下载
https://openresty.org/cn/download.html2)安装
https://openresty.org/cn/linux-packages.html#centos
最新版本为1.25.3.1
(2)添加yum仓库
wget https://openresty.org/package/centos/openresty.repo
sudo mv openresty.repo /etc/yum.repos.d/openresty.repo
(3)更新yum仓库
sudo yum check-update
(4)安装软件包
sudo yum install -y openresty
(5)安装命令行工具 resty
sudo yum install -y openresty-resty
(6)列出所有 openresty
仓库里头的软件包
sudo yum --disablerepo="*" --enablerepo="openresty" list available
(7)查看版本
openresty -v
4.Linux 使用 OpenResty 实现内容展示(content_by_lua)
(1)创建目录及子目录
子目录(app、conf、logs)分别用来存放编写的应用程序、配置文件、日志文件。
mkdir test_openresty
cd test_openresty
mkdir app
mkdir conf
mkdir logs
(2) 在conf下创建nginx.conf文件
cd /conf
vim nginx.conf
worker_processes 2;
events {worker_connections 10240;
}
#######################
# 以下为配置块
######################## http 协议
http {#虚拟主机server {listen 8989;# 处理http请求# 捕获和处理location / {# 内容处理,在配置中写代码content_by_lua_block {ngx.say("hello","\t",ngx.var.remote_addr)}}}
}#
# tcp 使用stream
#
# stream{
#
#}
(3) 监听nginx进程
目前暂无
ps aux | grep nginx
(4)切换目录
cd ..
ls
(5)openresty启动nginx
openresty -p . -c conf/nginx.conf
(6) 再次查看进程
新增nginx进程
ps aux | grep nginx
(7)访问
http://192.168.204.200:8989
(8)查看目录
ls
日志
cd logs/
ls
5.Linux 使用 OpenResty实现重定向 (rewrite_by_lua)
(1) 在conf下修改nginx.conf文件
cd /conf
vim nginx.conf
worker_processes 2;
events {worker_connections 10240;
}
#######################
# 以下为nginx配置块
######################## http 协议
http {#虚拟主机server {listen 8989;# 处理http请求# 捕获和处理location / {# 初始化数据,可以在此阶段加载耗时模块、设置全局变量# init_by_lua_block {# gloabl_a=100# }# 用于执行内部url重写或外部重定向rewrite_by_lua_block {local args = ngx.req.get_uri_args()if args["jump"] == "1" thenreturn ngx.redirect("http://maojing.site")elseif args["jump"] == "2" thenreturn ngx.redirect("/jump_here")end}# 内容处理,在配置中写代码content_by_lua_block {ngx.say("hello","\t",ngx.var.remote_addr)}}# rewrite_by_lua不止能跳转到外部,也可以内部跳转location /jump_here {# 内容处理,在配置中写代码content_by_lua_block {ngx.say("hello, jump_here","\t",ngx.var.remote_addr)}}}
}#
# tcp 使用stream
#
# stream{
#
#}
(2)切换目录
cd ..
(3) 重启
openresty -p . -s reload
(4) 再次查看进程
ps aux | grep nginx
(5)访问
http://192.168.204.200:8989/?jump=2
会自动跳转
6.Linux 使用 OpenResty 实现请求体(body_filter_by_lua)
(1) 在conf下修改nginx.conf文件
cd /conf
vim nginx.conf
worker_processes 2;
events {worker_connections 10240;
}
#######################
# 以下为nginx配置块
######################## http 协议
http {#虚拟主机server {listen 8989;# 处理http请求# 捕获和处理location / {# 用于执行内部url重写或外部重定向rewrite_by_lua_block {local args = ngx.req.get_uri_args()if args["jump"] == "1" thenreturn ngx.redirect("http://maojing.site")elseif args["jump"] == "2" thenreturn ngx.redirect("/jump_here")end}# 内容处理,在配置中写代码content_by_lua_block {ngx.say("hello","\t",ngx.var.remote_addr)}}# rewrite_by_lua不止能跳转到外部,也可以内部跳转location /jump_here {# 内容处理,在配置中写代码content_by_lua_block {ngx.say("hello, jump_here","\t",ngx.var.remote_addr)}# 用于修改应答body的内容body_filter_by_lua_block {local chunk=ngx.arg[1]ngx.arg[1]=chunk:gsub("hello","DEVOPS.")}}}
}#
# tcp 使用stream
#
# stream{
#
#}
(2)切换目录
cd ..
(3) 重启
openresty -p . -s reload
(4) 再次查看进程
ps aux | grep nginx
(5)访问
http://192.168.204.200:8989/?jump=2
会自动跳转
7.Linux 部署 Redis
(1)SFTP传输Redis软件包
完成
(2)Redis部署
可以参考本人博客:
数据库应用:Redis安装部署-CSDN博客
(3)监听服务
netstat -natp | grep redis
(4)把redis的可执行程序文件放入路径环境变量的目录中便于系统识别
ln -s /usr/local/redis/bin/* /usr/local/bin/
8.Linux 使用 OpenResty 实现黑名单(access_by_lua)
(1) 在conf下新建nginx_new.conf文件
cd /conf
vim nginx_new.conf
worker_processes 2;
events {worker_connections 10240;
}
#######################
# 以下为nginx配置块
######################## http 协议
http {#虚拟主机server {listen 8989;location / {access_by_lua_block {local block_list={["192.168.204.1"]=true}if block_list[ngx.var.remote_addr] thenreturn ngx.exit(403)end}# 内容处理,在配置中写代码content_by_lua_block {ngx.say("hello","\t",ngx.var.remote_addr)}}}
}
(2)切换目录
cd ..
(3)启动openresty
openresty -p . -c conf/nginx_new.conf
(4) 查看进程
ps aux | grep nginx
(5)访问
http://192.168.204.200:8989
(6)继续修改nginx_new.conf文件内容
cd /conf
vim nginx_new.conf
worker_processes 2;
events {worker_connections 10240;
}
#######################
# 以下为nginx配置块
######################## http 协议
http {#虚拟主机server {listen 8989;location / {# 用于访问控制access_by_lua_block {local block_list={["192.168.204.1"]=true}if block_list[ngx.var.remote_addr] thenreturn ngx.exit(403)end}# 内容处理,在配置中写代码content_by_lua_block {ngx.say("hello","\t",ngx.var.remote_addr)}}location /black_v1 {# 用于访问控制,通过文件access_by_lua_file ./app/black_v1.lua;# 内容处理,在配置中写代码content_by_lua_block {ngx.say("hello","\t",ngx.var.remote_addr)}}}
}
(7)app目录下创建black_v1.lua文件
cd app/
vim black_v1.lua
local redis = require "resty.redis"
local red=redis:new()local ok,err=red:connect("127.0.0.1",6379)if not ok thenreturn ngx.exit(301)
endlocal ip=ngx.var.remote_addrlocal exists,err=red:sismember("black_list",ip)if exists ==1 thenreturn ngx.exit(403)
end
(8)Redis添加IP地址到KEY中
[root@www ~]# redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> SADD black_list 192.168.204.1
(integer) 1
127.0.0.1:6379> keys *
1) "black_list"
127.0.0.1:6379> SMEMBERS black_list
1) "192.168.204.1"
127.0.0.1:6379>
127.0.0.1:6379> exit
(9) 重启
openresty -p . -s reload
(10) 查看进程
ps aux | grep nginx
(11)访问
http://192.168.204.200:8989/black_v1
9.Linux 使用 OpenResty 实现定时器(init_worker_by_lua)
(1) 继续修改nginx_new.conf文件内容
cd /conf
vim nginx_new.conf
worker_processes 2;
events {worker_connections 10240;
}
#######################
# 以下为nginx配置块
######################## http 协议
http {# 创建共享内存lua_shared_dict bklist 1m;# 初始化数据,定时器init_worker_by_lua_file ./app/init_worker.lua;#虚拟主机server {listen 8989;location / {# 用于访问控制access_by_lua_block {local block_list={["192.168.204.1"]=true}if block_list[ngx.var.remote_addr] thenreturn ngx.exit(403)end}# 内容处理,在配置中写代码content_by_lua_block {ngx.say("hello","\t",ngx.var.remote_addr)}}location /black_v1 {# 用于访问控制,通过文件access_by_lua_file ./app/black_v1.lua;# 内容处理,在配置中写代码content_by_lua_block {ngx.say("hello","\t",ngx.var.remote_addr)}}location /black_v2 {# 用于访问控制,通过文件access_by_lua_file ./app/black_v2.lua;# 内容处理,在配置中写代码content_by_lua_block {ngx.say("hello","\t",ngx.var.remote_addr)}}}
}
(2) app目录下创建black_v2.lua文件
cd app/
vim black_v2.lua
local bklist=ngx.shared.bklistlocal ip=ngx.var.remote_addrif bklist:get(ip) thenreturn ngx.exit(403)
end
(3)app目录下创建init_worker.lua文件
cd app/
vim init_worker.lua
-- 只需要一个进程拉取数据即可。
if ngx.worker.id() ~=0 thenreturn
end-- 获取共享内存
local bklist =ngx.shared.bklistlocal redis=require "resty.redis"local function update_blacklist()local red=redis:new()local ok,err=red:connect("127.0.0.1",6379)if not ok thenreturnendlocal black_list,err=red:smembers("black_list")bklist:flush_all()for _, v in pairs(black_list) dobklist:set(v,true);endngx.timer.at(5,update_blacklist)
endngx.timer.at(5,update_blacklist)
(4) 查看Redis
已添加IP地址到KEY中
[root@www ~]# redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> keys *
1) "black_list"
127.0.0.1:6379> SMEMBERS black_list
1) "192.168.204.1"
127.0.0.1:6379> exit
(5)重启
openresty -p . -s reload
(6)查看进程
ps aux | grep nginx
(7) 访问
http://192.168.204.200:8989/black_v2
(8)优雅退出
openresty -p . -s quit
(9)查看进程
ps aux | grep nginx
二、问题
1.安装OpenResty报错
(1)报错
Error downloading packages:openresty-1.25.3.1-1.el7.x86_64: [Errno 256] No more mirrors to try.
(2)原因分析
安装包下载失败。
(3)解决方法
先安装命令行工具 resty
sudo yum install -y openresty-resty
成功:
sudo yum install -y openresty
2.如何启动、关闭、重启 OpenResty
(1)命令
. 表示当前目录为工作目录
1)指定配置启动 openresty
openresty -p . -c conf/nginx.conf2) 优雅退出
openresty -p . -s quit3) 重启 openresty
openresty -p . -s reload
3.OpenResty启动报错
(1)报错
(2)原因分析
端口被占用
(3)解决方法
优雅退出当前进程
监听nginx服务端口
再次启动
4.OpenResty运行原理
1)Nginx
Nginx采用的是master-worker模型,也就是一个master进程管理多个worker进程,基本的时间处理都放在worker进程中,master进程负责全局初始化以及对worker进行的管理。2)OpenResty
OpenResty中,每个worker进程使用一个LuaVM,当请求被分配到worker时,将在这个LuaVM中创建一个coroutine协程,协程之间数据隔离,每个协程都具有独立的全局变量。