每个后端都应该了解的OpenResty入门以及网关安全实战(1)

简介: “OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。”

简介

在官网上对 OpenResty 是这样介绍的(openresty.org):

“OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。”

“OpenResty 通过汇聚各种设计精良的 Nginx 模块(主要由 OpenResty 团队自主开发),从而将 Nginx 有效地变成一个强大的通用 Web 应用平台。这样,Web 开发人员和系统工程师可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,快速构造出足以胜任 10K 乃至 1000K 以上单机并发连接的高性能 Web 应用系统。”

“OpenResty 的目标是让你的 Web 服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型,不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都进行一致的高性能响应。”

从以上官网描述里我们可以知道,OpenResty 官网对其定位是以 Nginx 为核心集成 Lua,打造一个兼具开发效率和高性能的服务端开发平台。

OpenResty 的核心是基于 Nginx 的一个 C 模块(lua-Nginx-module),该模块将 LuaJIT 嵌入到 Nginx 服务器中,并对外提供一套完整的 Lua API,透明地支持非阻塞 I/O,提供了轻量级线程、定时器等高级抽象。

我们可以用 Lua 语言来进行字符串和数值运算、查询数据库、发送 HTTP 请求、执行定时任务、调用外部命令等,还可以用 FFI 的方式调用外部 C 函数。这基本上可以满足服务端开发需要的所有功能。

掌握好了 OpenResty,我们就可以同时拥有脚本语言的开发效率和迭代速度,以及 Nginx C 模块的高并发和高性能优势。

下面为大家介绍本文大纲

  • OpenResty 的 hello world 该怎么写
  • 快速上手 Lua 脚本语言
  • OpenResty 用到的 Nginx 知识
  • OpenResty 在网关安全中如何应用

OpenResty 的 hello world 该怎么写

OpenResty 的安装

OpenResty 的安装有多种方法,比如使用操作系统的包管理器、源码编译或者 docker 镜像。推荐优先使用 yum、apt-get、brew 这类包管理系统,来安装 OpenResty。

对于 Mac OS X 或 macOS 用户,强烈推荐您使用 homebrew 包管理工具安装 OpenResty。可以直接使用下面 这一条命令:

base

复制代码

brew install openresty/brew/openresty

对于一些常见的 Linux 发行版本(Ubuntu、Debian、CentOS、RHEL、Fedora、OpenSUSE、Alpine 和 Amazon Linux), OpenResty 提供 官方预编译包。确保首先用这种方式来安装。这里用 CentOS 举例,可以使用如下方式,

CentOS 9 或者更新版本

bash

复制代码

# add the yum repo:
wget https://openresty.org/package/centos/openresty2.repo
sudo mv openresty2.repo /etc/yum.repos.d/openresty.repo
# update the yum index:
sudo yum check-update

CentOS 8 或者更老版本

bash

复制代码

# add the yum repo:
wget https://openresty.org/package/centos/openresty.repo
sudo mv openresty.repo /etc/yum.repos.d/openresty.repo
# update the yum index:
sudo yum check-update

然后就可以像下面这样安装软件包,比如 openresty:

复制代码

sudo yum install -y openresty

Docker 安装

Docker 安装的方式就最为简单了,只需要输入以下命令,就可以获取打包好的镜像。

bash

复制代码

docker pull openresty/openresty

目录结构

安装 OpenResty 成功后的目录结构如下(以默认安装目录为例):

bash

复制代码

/usr/local/openresty/                          #安装主目录
├── bin                                     #存放可执行文件
├── luajit                                  #LuaJIT运行库
├── lualib                                  #Lua组件
├── Nginx                                   #Nginx核心运行平台
├── pod                                     #参考手册(restydoc)使用的数据
└── site                                    #包管理工具(opm)使用的数据

启动服务

yum 安装完后,就可以直接运行 openresty 命令,启动 OpenResty 服务。

bash

复制代码

/usr/local/openresty/bin/openresty         #启动OpenResty服务

OpenResty 默认开启了 localhost:80 服务,使用 wget 或者 curl 这样的工具就可以验证 OpenResty 是否正常工作:

bash

复制代码

curl http://localhost:80                   #curl命令发送HTTP请求

下面是一些其他常用命令,

bash

复制代码

/usr/local/openresty/bin/openresty  -s stop       #停止 OpenResty 服务
/usr/local/openresty/bin/openresty  -s reload     #重新加载 Nginx 配置文件
/usr/local/openresty/bin/openresty  -t            #检查 Nginx 配置文件是否正确
/usr/local/openresty/bin/openresty  -c            #指定配置文件启动

OpenResty 的操作命令跟 Nginx 保持一致。可以执行 openresty -h 以及 nginx -h 对比看出,

image.png

命令行工具 resty

如果你想安装命令行工具 resty,那么可以像下面这样安装 openresty-resty 包:

复制代码

sudo yum install -y openresty-resty

resty 是一个 cli 工具,可以使用 -e 参数可以在命令行里直接执行 Lua 代码,我们可以在命令行执行如下命令,

base

复制代码

[root@VM-4-5-centos ~]# resty -e "print('hello world')"
hello OpenResty

resty 工具还有很多选项用于配置行为,非常灵活,-e 之外较常用的有

diff

复制代码

-c                :指定最大并发连接数(默认值是64);
-I                :指定Lua库的搜索路径;
-l                :指定加载某个Lua库;
--http-conf       :定制在http域里的指令;
--main-include    :定制在main域里的指令;
--shdict          :定制使用的共享内存(参见10.2节);
--resolve-ipv6    :允许解析ipv6的地址。

想了解完整的列表,可以查看 resty -h 命令。

包管理工具 opm

跟大多数语言一样有包管理工具一样,OpenResty 也有自己的包管理工具 opm(OpenResty Package Manager),opm 在 openresty-opm 包里,安装命令如下,

复制代码

sudo yum install -y openresty-opm

opm 是 OpenResty 自带的包管理器,在你安装好 OpenResty 之后,就可以直接使用。一些常见用法如下,

bash

复制代码

opm search    http                            #搜索关键字http
opm search    kafka                           #搜索关键字kafka
opm get       agentzh/lua-resty-http          #安装组件,注意需要sudo
opm info      agentzh/lua-resty-http          #显示组件的版本、作者等信息
opm remove    agentzh/lua-resty-http          #移除组件,同样需要sudo
opm --install-dir=/opt    get xxx             #把组件安装到/opt目录下
opm --cwd                 get xxx             #安装到当前目录的/resty_modules下

编写 hello world

在上文中我们使用命令行工具 resty 写了一个比较简单的 OpenResty 程序,没有 master 进程,也不会监听端口。下面让我们写一个需要启动 OpenResty 服务的 hello world。

首先找到 OpenResty 安装目录下 nginx/conf/nginx.conf 文件,在 server 下新增 OpenResty 的 content_by_lua 指令,里面嵌入了 ngx.say 的代码:

nginx

复制代码

server {
        listen       88;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        location /hello {
            content_by_lua '
                ngx.say("hello, world")
            ';
        }
}

接着我们执行 openresty -s reload 命令,重新加载 nginx.conf 配置文件。没有报错的话,OpenResty 的服务就已经成功启动了。

最后使用 curl 命令,来查看结果的返回:

csharp

复制代码

[root@VM-4-5-centos conf]# curl localhost:88/hello
hello, world

到这里,一个真正的 OpenResty 开发的 hello world 程序就完成了。

快速上手 Lua 脚本语言

Lua 环境

我们不用专门去安装标准 Lua 5.1 之类的环境,因为 OpenResty 已经不再支持标准 Lua,而只支持 LuaJIT。这里我介绍的 Lua 语法,也是和 LuaJIT 兼容的部分,而不是基于最新的 Lua 5.3,这一点需要特别注意。

在 OpenResty 的安装目录下,可以找到 LuaJIT 的目录和可执行文件。在 CentOS 系统下,LuaJIT 的目录如下,

csharp

复制代码

[root@VM-4-5-centos luajit]# cd /usr/local/openresty/luajit/bin/
[root@VM-4-5-centos bin]# ll
total 536
lrwxrwxrwx 1 root root     18 Oct 12 11:22 luajit -> luajit-2.1.0-beta3
-rwxr-xr-x 1 root root 547728 Jul 18 12:38 luajit-2.1.0-beta3

我们可以执行 cp luajit /usr/local/bin/ 将 luajit 文件复制到 /usr/local/bin/ 目录下,进而可以直接使用 luajit 命令。

查看 LuaJIT 的版本号,

csharp

复制代码

[root@VM-4-5-centos ~]# luajit  -v
LuaJIT 2.1.0-beta3 -- Copyright (C) 2005-2022 Mike Pall. https://luajit.org/

执行 lua 脚本,

perl

复制代码

[root@VM-4-5-centos ~]# echo 'print("hello world")' > 1.lua
[root@VM-4-5-centos ~]# cat 1.lua
print("hello world")
[root@VM-4-5-centos ~]# luajit 1.lua
hello world
[root@VM-4-5-centos ~]#

也可以使用 resty 来直接运行,它最终也是用 LuaJIT 来执行的,

scss

复制代码

[root@VM-4-5-centos ~]# resty -e 'print("hello world")'
hello world

基本语法

变量

在 Lua 中声明变量,可以如下代码所示,

lua

复制代码

local a = 'hello'
b = "world"

加了 local 关键字,用于声明局部变量。

不加 local 关键字的话,变量默认是全局的。

注释

两个减号是单行注释

diff

复制代码

-- 注释
多行注释
lua

复制代码

--[[
 多行注释
 多行注释
 --]]

行尾结束

Lua 中代码的行尾结束都不需要添加特殊字符,这跟 Java 不同(Java 在行尾需要添加 ;)。

lua

复制代码

local a = 'a'
print(a)
目录
相关文章
|
7天前
|
存储 SQL 数据库
深入浅出后端开发之数据库优化实战
【10月更文挑战第35天】在软件开发的世界里,数据库性能直接关系到应用的响应速度和用户体验。本文将带你了解如何通过合理的索引设计、查询优化以及恰当的数据存储策略来提升数据库性能。我们将一起探索这些技巧背后的原理,并通过实际案例感受优化带来的显著效果。
25 4
|
14天前
|
运维 NoSQL Java
后端架构演进:微服务架构的优缺点与实战案例分析
【10月更文挑战第28天】本文探讨了微服务架构与单体架构的优缺点,并通过实战案例分析了微服务架构在实际应用中的表现。微服务架构具有高内聚、低耦合、独立部署等优势,但也面临分布式系统的复杂性和较高的运维成本。通过某电商平台的实际案例,展示了微服务架构在提升系统性能和团队协作效率方面的显著效果,同时也指出了其带来的挑战。
54 4
|
16天前
|
JavaScript API 开发工具
<大厂实战场景> ~ Flutter&鸿蒙next 解析后端返回的 HTML 数据详解
本文介绍了如何在 Flutter 中解析后端返回的 HTML 数据。首先解释了 HTML 解析的概念,然后详细介绍了使用 `http` 和 `html` 库的步骤,包括添加依赖、获取 HTML 数据、解析 HTML 内容和在 Flutter UI 中显示解析结果。通过具体的代码示例,展示了如何从 URL 获取 HTML 并提取特定信息,如链接列表。希望本文能帮助你在 Flutter 应用中更好地处理 HTML 数据。
99 1
|
25天前
|
缓存 架构师 数据库
后端开发的艺术:从入门到精通的旅程####
本文旨在探索后端开发的本质与魅力,通过一段段深入浅出的故事,串联起后端技术的精髓。不同于传统的技术总结,这里我们将以一位普通开发者的成长轨迹为线索,展现从初识编程到成为后端架构师的心路历程。每个阶段都伴随着挑战、学习与突破,最终揭示了技术背后的人文关怀与创新精神。 ####
|
1月前
|
安全 Java 关系型数据库
探索后端技术:构建高效、安全的应用服务
在当今数字化浪潮中,后端技术作为软件架构的核心支柱,承载着处理数据逻辑、保障应用性能与安全等关键任务。本文旨在深入浅出地探讨后端开发的重要概念、主流技术栈以及未来发展趋势,为开发者提供一份指南,以助力构建既高效又安全的应用程序。
|
15天前
|
监控 API 持续交付
后端开发中的微服务架构:从入门到精通
【10月更文挑战第26天】 在当今的软件开发领域,微服务架构已经成为了众多企业和开发者的首选。本文将深入探讨微服务架构的核心概念、优势以及实施过程中可能遇到的挑战。我们将从基础开始,逐步深入了解如何构建、部署和管理微服务。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和实用的建议。
34 0
|
16天前
|
JSON Dart 数据格式
<大厂实战场景> ~ flutter&鸿蒙next处理后端返回来的数据的转义问题
在 Flutter 应用开发中,处理后端返回的数据是常见任务,尤其涉及转义字符时。本文详细探讨了如何使用 Dart 的 `dart:convert` 库解析包含转义字符的 JSON 数据,并提供了示例代码和常见问题的解决方案,帮助开发者有效处理数据转义问题。
111 0
|
18天前
|
前端开发 JavaScript NoSQL
探索后端开发之旅:从基础到高级实战
【10月更文挑战第24天】在这个数字时代的浪潮中,后端开发如同一座巨大的宝藏岛,等待着勇敢的探险者去发掘。本文将作为你的藏宝图,引领你从浅滩走向深海,探索后端开发的广阔天地。无论你是初心者还是资深开发者,这篇文章都将为你提供价值连城的知识和技能。准备好了吗?让我们启航,一起构建强大、高效、安全的后端系统!
|
1月前
|
JavaScript 前端开发
vue3教程,如何手动获取后端数据(入门到精通3,新人必学篇)
本文提供了一个Vue 3教程,讲解了如何使用axios库手动从后端获取数据,包括安装axios、配置后端访问地址、编写路由地址、发起HTTP请求以及在组件中读取和打印响应数据的步骤。
304 0
vue3教程,如何手动获取后端数据(入门到精通3,新人必学篇)
|
2月前
|
Rust API Go
API 网关 OpenID Connect 实战:单点登录(SSO)如此简单
单点登录(SSO)可解决用户在多系统间频繁登录的问题,OIDC 因其标准化、简单易用及安全性等优势成为实现 SSO 的优选方案,本文通过具体步骤示例对 Higress 中开源的 OIDC Wasm 插件进行了介绍,帮助用户零代码实现 SSO 单点登录。