OpenResty = Nginx + Lua 介绍和安装教程
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® 中包含了多少软件。
参考 上路 学习如何从最简单的 hello world 开始使用 OpenResty® 开发 HTTP 业务,或前往 下载 直接获取 OpenResty® 的源代码包开始体验。
OpenResty 官方网站: https://openresty.org/cn/ , Github
OpenResty 商业支持:https://openresty.com.cn/cn/
Lua 官方网站: https://www.lua.org/download.html
Lua 简易教程:https://www.runoob.com/lua/lua-tutorial.html
Nginx 官方网站: https://nginx.org , Github, nginx-1.26.1.tar.gz (2024-05-28)
Nginx 安装 Lua模块:https://gitee.com/zzl_60/nginx-lua-module-zh-wiki#installation
1、OpenResty 应用场景
OpenResty的解决方案自成立第一天起就是开源的、免费的,并提供商业技术支持。
多年来,OpenResty开源社区用户已将我们的解决方案应用于举不胜举的商业场景中。
OpenResty 是现代网络技术和各行各业的网络应用奠基石。从商业网站和应用、网络存储系统、到流量管理等众多领域,OpenResty 技术的可延展性是无限的。这些年来,许多 OpenResty 的应用场景甚至是超乎我们想象的。
- 有的公司使用它构建分布式网络存储系统的前端和后端(比如网盘应用);
- 有的用它来构建完整的 Web 应用,像电商平台的商品详情页的生成和大型体育赛事的 Web 管理系统;
- 也有的基于它构建大型的互联网广告平台,或者更复杂的 Web API 管理系统;
- 还有的公司拿它来驱动小流量调度的硬件盒子,或者驱动家居陪伴型机器人;
- 而最常见的还是用于实现那些流量非常庞大的 Web API
用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关
1.1 Nginx 的流程定义
Nginx实际把请求处理流程划分为了11个阶段,这样划分的原因是将请求的执行逻辑细分,各阶段按照处理时机定义了清晰的执行语义,开发者可以很容易分辨自己需要开发的模块应该定义在什么阶段。
- 当请求进入Nginx后先READ REQUEST HEADERS 读取头部,然后再分配由哪个指令操作
- Identity 寻找匹配哪个Location*
- Apply Rate Limits 是否要对该请求限制
- Preform Authertication 权限验证
- Generate Content 生成响应内容给用户
- 如果配置了反向代理,那么将要和上游服务器通信 Upstream Services
- 当返回给用户请求的时候,要经过过滤模块 Response Filter
- 发送给用户的同时 记录一个Log日志
1.1.1 流程详解
11个阶段 | 描述 |
---|---|
post-read | 接收到完整的http头部后处理的阶段,在uri重写之前,一般跳过 |
server-rewrite | location匹配前,修改uri的阶段,用于重定向,location块外的重写指令(多次执行) |
find-config | uri寻找匹配的location块配置项(多次执行) |
rewrite | 找到location块后再修改uri,location级别的uri重写阶段(多次执行) |
post-rewrite | 防死循环,跳转到对应阶段 |
preaccess | 权限预处理 |
access | 判断是否允许这个请求进入 |
post-access | 向用户发送拒绝服务的错误码,用来响应上一阶段的拒绝 |
try-files | 访问静态文件资源 |
content | 生成响应内容,并发送到客户端 |
log | 记录访问日志 |
1.1.2 OpenResty处理流程
由于 Nginx 把一个请求分成了很多阶段,第三方模块就可以根据自己的行为,挂载到不同阶段处理达到目的,OpenResty 也应用了同样的特性
不同的阶段,有不同的处理行为,这是 OpenResty 的一大特色,OpenResty 处理一个请求的流程如下图
指令 | 描述 |
---|---|
init_by_lua init_by_lua_block |
运行在Nginx loading-config 阶段,注册Nginx Lua全局变量,和一些预加载模块,是Nginx master进程在加载配置nginx.conf时执行 |
init_worker_by_lua | 在Nginx starting-worker阶段,即每个nginx worker启动时会调用,通常用来hook worker进程,并创建worker进行的计时器,用来健康检查,或者设置熔断记时窗口等 |
access_by_lua | 在access tail阶段,用来对每次请求做访问控制,权限校验等,能拿到很多相关变量。例如:请求体中的值,header中的值,可以将值添加到ngx.ctx,在其他模块进行相应的控制 |
balancer_by_lua | 通过Lua设置不同的负载均衡策略, 具体可以参考lua-resty-balancer |
content_by_lua | 在content阶段,即content handler的角色,即对于每个api请求进行处理,注意不能与proxy_pass放在同一个location下 |
proxy_pass | 真正发送请求的一部分,通常介于access_by_lua和log_by_lua之间 |
header_filter_by_lua | 在output-header-filter阶段,通常用来重新响应头部、设置cookie等,也可用作熔断触发标记 |
body_filter_by_lua | 对于响应体的content进行过滤处理 |
log_by_lua | 记录日志,记录整个请求入参、处理耗时、状态码、错误信息等 |
2、Openresty 安装
2.1 yum安装
在 CentOS 系统中添加 openresty 仓库,这样可方便未来安装或更新软件包(通过 yum update 命令)
2.1.1 添加OpenResty仓库
运行下面的命令就可以添加我们的仓库:
sudo yum install yum-utils
sudo yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo
2.1.2 安装OpenResty
然后就可以像下面这样安装软件包,比如 openresty
sudo yum install openresty
2.2 源代码编译安装
OpenResty插件分为自带插件以及第三方插件,如果是自带插件直接激活就可以,如果是第三方插件需要手动下载插件添加进去,这里我们以本地缓存插件安装举例
2.2.1 安装编译环境
yum install -y make cmake gcc gcc-c++ autoconf automake libpng-devel libjpeg-devel zlib libxml2-devel ncurses-devel bison libtool-ltdl-devel libiconv libmcrypt mhash mcrypt pcre-devel openssl-devel freetype-devel libcurl-devel lua-devel readline-devel curl wget
2.2.2下载最新版源码
mkdir /usr/local/openresty
wget https://openresty.org/download/openresty-1.21.4.1.tar.gz
tar -zxvf openresty-1.21.4.1.tar.gz # 解压openresty
2.2.3下载缓存插件
到 缓存插件地址 下载最新版 缓存插件
mkdir /usr/local/openresty/modules&& cd /usr/local/openresty/modules
wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz
tar -zxvf ngx_cache_purge-2.3.tar.gz
2.2.4 编译OpenResty
选择需要的插件启用, –with-Components 激活组件,–without 则是禁止组件 ,–add-module是安装第三方模块
./configure --prefix=/usr/local/openresty --with-luajit --without-http_redis2_module --with-http_stub_status_module --with-http_v2_module --with-http_gzip_static_module --with-http_sub_module --add-module=/usr/local/openresty/modules/ngx_cache_purge-2.3 # 配置缓存插件的源码路径
这里禁用了 redis组件 并且 安装了第三方缓存组件
2.2.5 安装OpenResty
gmake && gmake install # gmake 是 make 的软链接,实际是 make 在编译
2.2.6 环境设置
vim /etc/profile
export PATH=$PATH:/usr/local/openresty/nginx/sbin
source /etc/profile
2.2.7 查看环境
nginx -v
nginx version: openresty/1.17.8.2
2.2.8 查看安装的组件
nginx -V
2.3 环境配置
2.3.1 配置文件修改
基于我们上节课的内容改造nginx.conf
user www; worker_processes 4; error_log logs/error.log warn; events { worker_connections 102400; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; include conf.d/*.conf; }
2.3.2 创建配置目录
创建配置文件目录
mkdir /usr/local/openresty/nginx/conf/conf.d
2.3.3 创建Nginx配置文件
我们创建的conf.d
目录中创建一个测试的配置文件
server { server_name api.mimvp.com; charset utf-8; location / { default_type text/html; content_by_lua ' ngx.say("<p>Hello, World!</p>") '; } }
如果你熟悉 nginx 的配置,应该对以上代码就很熟悉。这里我们将 html 代码直接写在了配置文件中。
2.3.4 启动OpenResty
nginx -c /usr/local/openresty/nginx/conf/nginx.conf
接下来我们可以使用 curl 来测试是否能够正常范围
curl http://127.0.0.1/
<p>Hello, World!</p>
在配置文件写的 html 已正常输出
参考推荐:
LNMP(CentOS+Nginx+Mysql+PHP)服务器环境配置 (推荐)
Apache 工作的三种模式:Prefork、Worker、Event
Mac 开机启动MySQL/MongoDB/Redis 等服务
Linux 配置 nginx、mysql、php-fpm、redis 开机启动
版权所有: 本文系米扑博客原创、转载、摘录,或修订后发表,最后更新于 2024-07-23 09:58:22
侵权处理: 本个人博客,不盈利,若侵犯了您的作品权,请联系博主删除,莫恶意,索钱财,感谢!