每个后端都应该了解的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)
目录
相关文章
|
3月前
|
安全 前端开发 应用服务中间件
每个后端都应该了解的OpenResty入门以及网关安全实战(2)
泛型 for 循环通过一个迭代器函数来遍历所有值,类似 java 中的 foreach 语句。 Lua 编程语言中泛型 for 循环语法格式:
57 0
|
7月前
|
JSON 前端开发 安全
layui框架实战案例(22):多附件上传实战开发实录(php后端、文件删除、数据库删除)
layui框架实战案例(22):多附件上传实战开发实录(php后端、文件删除、数据库删除)
303 0
|
1月前
|
负载均衡 前端开发 Java
字节后端面试题(前端发送请求到后端的过程(MVC),网关gateway作用,怎么解决跨域,各微服务组件作用)
字节后端面试题(前端发送请求到后端的过程(MVC),网关gateway作用,怎么解决跨域,各微服务组件作用)
37 0
|
2月前
|
XML API 数据库
七天.NET 8操作SQLite入门到实战 - 第六天后端班级管理相关接口完善和Swagger自定义配置
七天.NET 8操作SQLite入门到实战 - 第六天后端班级管理相关接口完善和Swagger自定义配置
|
2月前
|
JSON JavaScript 前端开发
后端程序员的 VUE 入门上手笔记
后端程序员的 VUE 入门上手笔记
44 0
|
7月前
|
移动开发 JavaScript 前端开发
数据可视化大屏百度地图手机端标注开发实战案例解析(jsAPI接口、标注分类图片、文本标签、分类筛选、自适应高度信息弹窗、PHP后端API)
数据可视化大屏百度地图手机端标注开发实战案例解析(jsAPI接口、标注分类图片、文本标签、分类筛选、自适应高度信息弹窗、PHP后端API)
135 0
|
3月前
|
Web App开发 存储 Linux
Linux C/C++开发(后端/音视频/游戏/嵌入式/高性能网络/存储/基础架构/安全)(下)
Linux C/C++开发(后端/音视频/游戏/嵌入式/高性能网络/存储/基础架构/安全)
|
3月前
|
存储 Linux 调度
Linux C/C++开发(后端/音视频/游戏/嵌入式/高性能网络/存储/基础架构/安全)(上)
Linux C/C++开发(后端/音视频/游戏/嵌入式/高性能网络/存储/基础架构/安全)
|
3天前
|
前端开发 JavaScript Java
从前端到后端:构建全栈应用的技术路线探析
【2月更文挑战第3天】本文通过探讨前端和后端开发的基本概念和技术要点,深入剖析了构建全栈应用的技术路线。从前端的HTML、CSS和JavaScript,到后端的Java、C和数据库,我们将带您逐步了解如何将不同技术组合起来实现高效、稳定的全栈应用。
14 7
|
5天前
|
开发框架 前端开发 JavaScript
从前端到后端——完整的Web开发指南
【2月更文挑战第1天】Web开发已经成为了现代软件开发中不可或缺的一部分。无论是前端还是后端,都扮演着重要的角色。本文将从前端到后端,介绍完整的Web开发流程和技术栈,帮助初学者快速入门Web开发。

相关产品

  • 云迁移中心