每个后端都应该了解的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)
目录
相关文章
|
8天前
|
SQL JSON Java
springboot 如何编写增删改查后端接口,小白极速入门,附完整代码
本文为Spring Boot增删改查接口的小白入门教程,介绍了项目的构建、配置YML文件、代码编写(包括实体类、Mapper接口、Mapper.xml、Service和Controller)以及使用Postman进行接口测试的方法。同时提供了SQL代码和完整代码的下载链接。
springboot 如何编写增删改查后端接口,小白极速入门,附完整代码
|
1月前
|
网络协议
keepalived对后端服务器的监测方式实战案例
关于使用keepalived进行后端服务器TCP监测的实战案例,包括配置文件的编辑和keepalived服务的重启,以确保配置生效。
37 1
keepalived对后端服务器的监测方式实战案例
|
23天前
|
前端开发 JavaScript Java
编程入门之前端和后端开发
前端开发就是开发网页上的内容展示与用户的交互,一部分后端开发工作就是开发数据访问服务,使前端可以通过后端服务对数据进行增删改查,也就是Crud,对前端用户的请求进行相应。
48 8
|
1月前
|
Rust API Go
API 网关 OpenID Connect 实战:单点登录(SSO)如此简单
单点登录(SSO)可解决用户在多系统间频繁登录的问题,OIDC 因其标准化、简单易用及安全性等优势成为实现 SSO 的优选方案,本文通过具体步骤示例对 Higress 中开源的 OIDC Wasm 插件进行了介绍,帮助用户零代码实现 SSO 单点登录。
|
2月前
|
安全 API 数据处理
后端开发中的API设计哲学:简洁、高效与安全
【8月更文挑战第29天】 在后端开发的广阔天地中,API(应用程序编程接口)的设计如同编织一张无形的网,连接着数据的海洋与应用的大陆。本文将深入探讨如何打造一个既简洁又高效的API,同时不忘筑牢安全的防线。我们将从API设计的基本原则出发,逐步剖析如何通过合理的结构设计、有效的数据处理和严格的安全措施来提升API的性能和用户体验。无论你是初学者还是资深开发者,这篇文章都将为你提供宝贵的视角和实用的技巧,帮助你构建出更优秀的后端服务。
|
2月前
|
资源调度 JavaScript 前端开发
TypeScript实战教程(一):表单上传与后端处理
本文是TypeScript实战教程的第一部分,介绍了使用TypeScript进行表单上传和后端处理的完整流程,包括环境配置、前端表单创建、使用TypeScript和Express框架搭建服务端、处理表单数据,并提供了详细的代码示例和运行测试方法。
TypeScript实战教程(一):表单上传与后端处理
|
2月前
|
存储 运维 小程序
后端开发零负担!揭秘支付宝小程序云开发的高效与安全,你的项目也能飞速上线?
【8月更文挑战第27天】支付宝小程序云开发是由阿里云提供的集成开发环境,助力开发者高效、安全地构建小程序后端服务,免去服务器搭建,显著提高开发效率并降低运维成本。它集成了云函数、云数据库及云存储等功能,便于快速搭建后端逻辑。例如,仅需简单几行代码即可创建HTTP接口或进行数据管理。这使得开发者能更专注于业务逻辑和用户体验优化,同时平台还提供了强大的安全保障措施,确保数据安全和用户隐私。无论对于初创团队还是成熟企业,支付宝小程序云开发都能有效提升产品迭代速度和市场竞争力。
59 1
|
2月前
|
存储 缓存 移动开发
不来看一看HTML请求后端性能优化的实战总结吗?
本文主要总结了在ICBU的核心沟通场景下服务端在此次性能优化过程中做的工作,供大家参考讨论。
|
2月前
|
大数据 数据处理 分布式计算
JSF 逆袭大数据江湖!看前端框架如何挑战数据处理极限?揭秘这场技术与勇气的较量!
【8月更文挑战第31天】在信息爆炸时代,大数据已成为企业和政府决策的关键。JavaServer Faces(JSF)作为标准的 Java Web 框架,如何与大数据技术结合,高效处理大规模数据集?本文探讨大数据的挑战与机遇,介绍 JSF 与 Hadoop、Apache Spark 等技术的融合,展示其实现高效数据存储和处理的潜力,并提供示例代码,助您构建强大的大数据系统。
33 0
|
2月前
|
JavaScript 安全 数据安全/隐私保护
深入Node.js与Express:从表单接收到数据验证的完整指南——实战技巧揭秘后端开发中的表单处理流程
【8月更文挑战第31天】在Web开发中,处理表单数据至关重要。本文通过实例详细讲解了如何利用Node.js与Express框架接收和验证表单数据。首先,搭建环境并初始化一个简单的Express应用;接着,演示如何接收用户注册表单中的`username`和`email`字段;最后,引入`joi`模块进行数据验证,确保数据安全准确。掌握这些技能有助于开发者构建更安全、友好的Web应用。随着Node.js和Express的不断进步,未来将有更多高级功能值得期待。
40 0
下一篇
无影云桌面