01-Openresty简介及安装

PS :锤子科技在 T2 发布会上将门票收入捐赠给了 OpenResty 开源项目,今天我们就来为大家介绍下 OpenResty 是个什么鬼?

一、OpenResty 介绍

  • OpenResty(也称为 ngx_openresty)是一个全功能的 Web 应用服务器。它打包了标准的 Nginx 核心,很多的常用的第三方模块,以及它们的大多数依赖项。

  • 通过揉和众多设计良好的 Nginx 模块,OpenResty 有效地把 Nginx 服务器转变为一个强大的 Web 应用服务器,基于它开发人员可以使用 Lua 编程语言对 Nginx 核心以及现有的各种 Nginx C 模块进行脚本编程,构建出可以处理一万以上并发请求的极端高性能的 Web 应用。

  • OpenResty 致力于将你的服务器端应用完全运行于 Nginx 服务器中,充分利用 Nginx 的事件模型来进行非阻塞 I/O 通信。不仅仅是和 HTTP 客户端间的网络通信是非阻塞的,与MySQL、PostgreSQL、Memcached 以及 Redis 等众多远方后端之间的网络通信也是非阻塞的。
    因为 OpenResty 软件包的维护者也是其中打包的许多 Nginx 模块的作者,所以 OpenResty 可以确保所包含的所有组件可以可靠地协同工作。

  • OpenResty 最早是雅虎中国的一个公司项目,起步于 2007 年 10 月。当时兴起了 OpenAPI 的热潮,用于满足各种 Web Service 的需求,就诞生了 OpenResty。在公司领导的支持下,最早的 OpenResty 实现从一开始就开源了。最初的定位是服务于公司外的开发者,像其他的 OpenAPI 那样,但后来越来越多地是为雅虎中国的搜索产品提供内部服务。这是第一代的 OpenResty,当时的想法是,提供一套抽象的 web service,能够让用户利用这些 web service 构造出新的符合他们具体业务需求的 Web Service 出来,所以有些“meta web servie”的意味,包括数据模型、查询、安全策略都可以通过这种 meta web service 来表达和配置。同时这种 web service 也有意保持 REST 风格。与这种概念相对应的是纯 AJAX 的 web 应用,即 web 应用几乎都使用客户端 JavaScript 来编写,然后完全由 web service 让 web 应用“活”起来。用户把 .html, .js, .css, .jpg 等静态文件下载到 web browser 中,然后 js 开始运行,跨域请求雅虎提供的经过站长定制过的 web service,然后应用就可以运行起来。不过随着后来的发展,公司外的用户毕竟还是少数,于是应用的重点是为公司内部的其他团队提供 web service,比如雅虎中国的全能搜索产品,及其外围的一些产品。从那以后,开发的重点便放在了性能优化上面。章亦春在加入淘宝数据部门的量子团队之后,决定对 OpenResty 进行重新设计和彻底重写,并把应用重点放在支持像量子统计这样的 web 产品上面,所以量子统计 3.0 开始也几乎完全是 web service 驱动的纯 AJAX 应用。

  • 这是第二代的 OpenResty,一般称之为 ngx_openresty,以便和第一代基于 Perl 和 Haskell 实现的 OpenResty 加以区别。章亦春和他的同事王晓哲一起设计了第二代的 OpenResty。在王晓哲的提议下,选择基于 nginx 和 lua 进行开发。

  • 为什么要取 OpenResty 这个名字呢?OpenResty 最早是顺应 OpenAPI 的潮流做的,所以 Open 取自“开放”之意,而Resty便是 REST 风格的意思。虽然后来也可以基于 ngx_openresty 实现任何形式的 web service 或者传统的 web 应用。

  • 也就是说 Nginx 不再是一个简单的静态网页服务器,也不再是一个简单的反向代理了。第二代的 openresty 致力于通过一系列 nginx 模块,把nginx扩展为全功能的 web 应用服务器。

  • ngx_openresty 是用户驱动的项目,后来也有不少国内用户的参与,从 openresty.org 的点击量分布上看,国内和国外的点击量基本持平。

  • ngx_openresty 目前有两大应用目标:

    • 通用目的的 web 应用服务器。在这个目标下,现有的 web 应用技术都可以算是和 OpenResty 或多或少有些类似,比如 Nodejs, PHP 等等。ngx_openresty 的性能(包括内存使用和 CPU 效率)算是最大的卖点之一。
    • Nginx 的脚本扩展编程,用于构建灵活的 Web 应用网关和 Web 应用防火墙。有些类似的是 NetScaler。其优势在于 Lua 编程带来的巨大灵活性。
  • ngx_openresty 从一开始就是公司实际的业务需求的产物。在过去的几年中的大部分开发工作也是由国内外许多公司和个人的实际业务需求驱动的。这种模型在实践中工作得非常好,可以确保我们做的就是大家最迫切需要的。在此过程中,慢慢形成了 ngx_openresty 的两大应用方向,也就是前面提到的那两大方向。是我们的用户帮助我们确认了这两个方向,事实上,这并不等同于第一代 OpenResty 的方向,而是变得更加底层和更加通用了。

二、OpenResty的运行原理

  • Nginx 采用的是 master-worker 模型,一个 master 进程管理多个 worker 进程,基本的事件处理都是放在 woker 中,master 负责一些全局初始化,以及对 worker 的管理。
  • OpenResty中,每个worker进程使用一个LuaVM,当请求被分配到worker时,将在这个LuaVM中创建一个coroutine协程,协程之间数据隔离,每个协程都具有独立的全局变量。

image

  • 协程和多线程下的线程类似:有自己的堆栈,自己的局部变量,有自己的指令指针,但是和其他协程程序共享全局变量等信息。线程和协程的主要不同在于:多处理器的情况下,概念上来说多线程是同时运行多个线程,而协程是通过代码来完成协程的切换,任何时刻只有一个协程程序在运行。并且这个在运行的协程只有明确被要求挂起时才会被挂起

  • OpenResty处理请求流程

    • Nginx会把一个请求分成不同阶段,第三方模块可以根据自己的行为,挂在到不同阶段中以达到自身目的。OpenResty采用了同样的特性,不同阶段有着不同的处理行为。

三、OpenResty的优势

  • 首先我们选择使用OpenResty,其是由Nginx核心加很多第三方模块组成,其最大的亮点是默认集成了Lua开发环境,使得Nginx可以作为一个Web Server使用。
  • 借助于Nginx的事件驱动模型和非阻塞IO,可以实现高性能的Web应用程序。
  • OpenResty提供了大量组件如Mysql、Redis、Memcached等等,使在Nginx上开发Web应用更方便更简单。目前在京东如实时价格、秒杀、动态服务、单品页、列表页等都在使用Nginx+Lua架构,其他公司如淘宝、去哪儿网等。

四、OpenResty的nginx架构的特点

  • Nginx采用多进程模式,对于每个worker进程都是独立的,因此不需要加锁,所以节省了锁带来的性能开销。采用独立的进程的好处在于worker进程之间相互不会影响,当一个进程退出后,其他进程依然工作,以保证服务不会终端。
  • Nginx采用异步非堵塞的方式去处理请求,异步非堵塞就是当一个线程调用出现阻塞而等待时,其他线程可以去处理其他任务。

五、Lua及其ngx_lua简介

5.1、Lua

  • Lua 是一个小巧的脚本语言。作者是巴西人。该语言的设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
  • Lua的特点:
    • Lua脚本可以很容易的被C/C++代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用。不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML,Ini等文件格式,并且更容易理解和维护。
    • Lua由标准C编写而成,代码简洁优美,几乎在所有操作系统和平台上都可以编译,运行。一个完整的Lua解释器不过200k,在目前所有脚本引擎中,Lua的速度是最快的。这一切都决定了Lua是作为嵌入式脚本的最佳选择。

5.2、ngx_lua

  • ngx_lua是将Lua嵌入Nginx,让Nginx执行Lua脚本,并且高并发、非阻塞的处理各种请求。Lua内建协程,可以很好的将异步回调转换成顺序调用的形式。ngx_lua在Lua中进行的IO操作都会委托给Nginx的事件模型,从而实现非阻塞调用。开发者可以采用串行的方式编写程序,ngx_lua会自动的在进行阻塞的IO操作中终端,保存上下文,然后将IO操作委托给Nginx事件处理机制,在IO操作完成后,ngx_lua会恢复上下文,程序继续执行,这些操作都是对用户程序透明的。
  • 每个Nginx的worker进程持有一个Lua解释器或LuaJIT实例,被这个worker处理的所有请求共享这个实例。每个请求的context上下文会被Lua轻量级的协程分隔,从而保证各个请求时独立的。

5.3、ngx_lua模块的原理

  • 每个工作进程worker创建一个Lua虚拟机(LuaVM),工作进程worker内部协议共享VM。
  • 每个Nginx I/O原语封装后注入Lua虚拟机,并允许Lua代码直接访问。
  • 每个外部请求都由一个Lua协程处理,协程之间数据隔离。
  • Lua代码调用I/O操作等异步时,会挂起当前协程,而不阻塞工作机进程。
  • I/O等异步操作完成时,还原相关协程相关协议的上下文,并继续运行。

六、OpenResty部署

# centos安装编译环境
 	yum install readline-devel pcre pcre-devel openssl openssl-devel gcc curl GeoIP-devel

# ubuntu安装编译环境
	dpkg -l | grep zlib
	apt-get install openssl libssl-dev
	apt-get install libpcre3 libpcre3-dev
	apt-get install zlib1g-dev
	apt-get install libpqxx-dev
	
# 配置安装目录及需要激活的组件。使用选项 --prefix=install_path,指定安装目录(默认为/usr/local/openresty)
wget https://openresty.org/download/openresty-1.19.3.1.tar.gz
cd /root/Application/openresty/openresty-1.19.3.1
./configure --prefix=/root/Application/openresty \
--with-luajit \
--without-http_redis2_module \
--with-http_iconv_module \
--with-http_postgres_module \
--with-http_realip_module
 openresty-1.19.3.1# make -j 4&& make install
 
 # 设置环境变量
#  vim /etc/profile
export NGINX_HOME=/root/Application/openresty/nginx
export PATH=$PATH:$NGINX_HOME/sbin
source /etc/profile

# 安装成功后,默认会在 /usr/local/openresty/目录下
  # luajit 是采用C语言写的Lua代码的解释器 ----just in time 即时解析
  # lualib 是编辑好的lua类库
  # nginx,其实openResty就是nginx,只是做了一些模块化工作;所以启动openResty就是启动nginx,我们可以到 cd nginx/sbin/,直接运行 ./nginx

# 查看nginx版本
	openresty-1.19.3.1# nginx -v
		nginx version: openresty/1.19.3.1
		
# systemctl 添加openresty nginx 的启动脚本
vim /lib/systemd/system/openresty.service
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/root/Application/openresty/nginx/logs/nginx.pid
# \# Nginx will fail to start if /run/nginx.pid already exists but has the wrong
# \# SELinux context. This might happen when running `nginx -t` from the cmdline.
# \# https://bugzilla.redhat.com/show_bug.cgi?id=1268621
ExecStartPre=/bin/rm -f /root/Application/openresty/nginx/logs/nginx.pid
ExecStartPre=/root/Application/openresty/nginx/sbin/nginx -t
ExecStart=/root/Application/openresty/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
[Install]
WantedBy=multi-user.target

七、Pycharm配置 lua环境

posted @ 2021-05-18 21:23  SRE运维充电站  阅读(532)  评论(0编辑  收藏  举报