目录

一、实验

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备注
CentOS7.9192.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协程,协程之间数据隔离,每个协程都具有独立的全局变量。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐