OpenResty
OpenResty是基于Ngnix和Lua的高性能web平台,内部集成精良的LUa库、第三方模块、依赖项。
用于方便搭建能够处理高并发、扩展性极高的动态web应用、web服务、动态网关。
可以使用Lua脚本调用Ngnix支持的C以及Lua模块,快速构建10K~1000K单机并发连接的高性能web应用系统。
OpenResty的目标是让web服务直接运行在Nginx服务内部,
利用Ngnix的非阻塞IO模型,对HTTP客户端请求和后端DB进行一致的高性能响应。
OpenResty的出现可以说是颠覆了高性能服务端的开发模式。OpenResty实际上是Nginx+LuaJIT的完美组合。
OpenResty工作方式
由于Nginx采用的是master-worker模型,也就是一个master主进程管理多个worker进程,
基本的事件处理都是放在worker中,master仅负责一些全剧初始化,以及对worker的管理。
在OpenResty中,每个worker使用一个LuaVM,每个请求被分配到worker时,
将在这个LuaVM中创建一个coroutine协程。协程之间数据隔离,每个协程具有独立的全局变量_G。
Lua中的协程和多线程下的线程类似,都有自己的堆栈、局部变量、指令指针...,
但是和其他协程程序共享全局变量等信息。线程和协程主要不同在于:多处理器的情况下,
概念上来说多线程是同时运行多个线程,而协程是通过代码来完成协程的切换,
任何时刻只有一个协程程序在运行。并且这个在运行的协程只有明确被要求挂起时才会被挂起。
根据实际测试,OpenResty性能接近于Nginx 性能之王c module,甚至超过。
OpenResty 架构
-
负载均衡
LVS+HAProxy将流量转发给核心Nginx1和Nginx2,即实现了流量的负载均衡。 -
单机闭环
所有想要的数据都能从本服务器直接获取,大多数时候无需通过网络或去其他服务器获取。
单机闭环会遇到2个主要问题
数据不一致
例如没有主从架构导致不同服务器数据不一致
遇到存储瓶颈
磁盘或内存遇到天花板
解决数据不一致比较好的办法是采用主从或分布式集中存储,而遇到存储瓶颈就需要进行按业务键进行分片,将数据分散到多台服务器。
OpenResty环境搭建
安装前准备,必须安装perl、libpcre、libssl库。
# 从系统路径中查看必备库是否已经安装
$ sudo ldconfig -v
安装必备库
$ sudo apt install libpcre3-dev libssl-dev perl make build-essential curl libreadline-dev libncurses5-dev
#或者
yum install openssl-devel or yum install *gcc* -y
yum install -y pcre pcre-devel openssl openssl-devel gcc gcc gcc-c++ ncurses-devel perl
下载并解压OpenResty后进入其目录
$ wget https://openresty.org/download/ngx_openresty-1.13.6.1.tar.gz
$ tar -zxvf ngx_openresty-1.13.6.1.tar.gz
$ mv openresty-1.13.6.1 openresty
$ cd openresty
$ ./configure
默认会被安装到/usr/local/openresty目录下
# 编译并安装
$ sudo make && make install
$ cd /usr/local/openresty
启动Nginx
$ sudo /usr/local/openresty/nginx/sbin/nginx
$ ps -ef | grep nginx
$ service nginx status
配置文件
个人习惯配置文件单独放项目统一管理
/usr/local/openresty/nginx/sbin/nginx -c /home/backend/config/scripts-server/nginx/conf/nginx.test.conf