目录
一、实验
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.html
2)安装
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" then
                    return ngx.redirect("http://maojing.site")
                elseif args["jump"] == "2" then
                    return 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" then
                    return ngx.redirect("http://maojing.site")
                elseif args["jump"] == "2" then
                    return 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] then
                    return 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] then
                    return 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 then
    return ngx.exit(301)
end
local ip=ngx.var.remote_addr
local exists,err=red:sismember("black_list",ip)
if exists ==1 then
    return 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] then
                    return 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.bklist
local ip=ngx.var.remote_addr
if bklist:get(ip) then
    return ngx.exit(403)
end
 

(3)app目录下创建init_worker.lua文件
cd app/
vim init_worker.lua 
-- 只需要一个进程拉取数据即可。
if ngx.worker.id() ~=0 then
    return
end
-- 获取共享内存
local bklist =ngx.shared.bklist
local 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 then
        return
    end
    local black_list,err=red:smembers("black_list")
    bklist:flush_all()
    for _, v in pairs(black_list) do
        bklist:set(v,true);
    end
    ngx.timer.at(5,update_blacklist)
end
ngx.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.conf
2) 优雅退出
openresty -p . -s quit
3) 重启 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协程,协程之间数据隔离,每个协程都具有独立的全局变量。
 

















![[Algorithm][递归][搜索][回溯]总体理解+ 算法总结 (极其干货哦~)](https://img-blog.csdnimg.cn/direct/1f1e5f64a73a46fbad9e7ec9dab0f4e6.png)

