Linux服务升级:OpenResty 升级1.25.3.1版本
子目录(app、conf、logs)分别用来存放编写的应用程序、配置文件、日志文件。(1)在conf下新建nginx_new.conf文件。(1) 继续修改nginx_new.conf文件内容。(2) app目录下创建black_v2.lua文件。(2)在conf下创建nginx.conf文件。(1)在conf下修改nginx.conf文件。(6)继续修改nginx_new.conf文件内容。(7
目录
4.Linux 使用 OpenResty 实现内容展示(content_by_lua)
5.Linux 使用 OpenResty 实现重定向 (rewrite_by_lua)
6.Linux 使用 OpenResty 实现请求体(body_filter_by_lua)
8.Linux 使用 OpenResty 实现黑名单(access_by_lua)
9.Linux 使用 OpenResty 实现定时器(init_worker_by_lua)
一、实验
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协程,协程之间数据隔离,每个协程都具有独立的全局变量。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)